2012-05-02 73 views
89

如何安全地更新(拉)git項目,保持特定文件不變,即使存在上游更改?git pull保留本地更改

myrepo /配置/ config.php文件

是有辦法的,即使該文件正被遠程改變,當我的git拉,其他一切都更新,但該文件是不變的(甚至不合並)?

PS。我需要做我所問的,因爲我只寫基於git的部署腳本。我無法將配置文件更改爲模板。

所以,我需要編寫更新腳本的方式,不會丟失本地更改的內容。我希望的那樣簡單的東西如:

git assume-remote-unchanged file1 
git assume-remote-unchanged file2 

然後git pull

+0

git pull命令是改變'config.php'承諾? –

+1

可能的重複[是否有可能排除特定的提交做git合併?](http://stackoverflow.com/questions/332528/is-it-possible-to-exclude-specific-commits-when-doing- a-git-merge) – Daenyth

+0

它沒有被提交。我寧願不必 –

回答

164

有一個基於Git存儲的簡單解決方案。把所有變化的東西都藏起來,把所有新東西都拿出來,把你的藏起來。

git stash 
git pull 
git stash pop 

存儲彈出可能存在衝突。在你描述的情況下,實際上會有config.php的衝突。但是,解決衝突是很容易的,因爲你知道你把什麼放在隱藏處是你想要的。所以這樣做:

git checkout --theirs -- config.php 
+3

git checkout - 他們的命令很混亂。它做了我想要的一次,而另一次真的很糟糕。有什麼好的文檔呢? – Milimetric

+2

是的,有時'他們'和'我們的'可能會混淆。在'git merge'中,'我們的'是當前工作目錄中的內容。但對於'git rebase'(或'git rebase -onto'),其含義可以互換。 – GoZoner

+0

@GoZoner我認爲這也適用於獲取。只是在'git stash'之後,必須簽出不同的分支,然後'git獲取原點'。然後檢出前一個分支,然後'git stash pop'。我嘗試過,但它工作,但我沒有任何合併衝突。 – AnkurTank

13

如果你在你的回購協議文件,它應該由大多數車伕進行定製,然後將文件重命名爲類似config.php.template和將config.php添加到您的.gitignore

+4

也檢查[這個答案](http://stackoverflow.com/a/3970442/236871),您可以使用'.gitattributes'在合併時始終保留您的更改。 – KurzedMetal

+0

這更像我所需要的。模板的東西是優雅的解決方案,但我害怕我不能使用它,因爲我只是編寫部署腳本。 –

4

更新:從字面上回答問題,但我認爲KurzedMetal's answer真的是你想要的。

假設:

  1. 你的分支master
  2. 上游分支是masterorigin
  3. 您還沒有提交的修改

....你可以這樣做:

# Do a pull as usual, but don't commit the result: 
git pull --no-commit 

# Overwrite config/config.php with the version that was there before the merge 
# and also stage that version: 
git checkout HEAD config/config.php 

# Create the commit: 
git commit -F .git/MERGE_MSG 

如果您需要經常這樣做,您可以爲其創建一個別名。請注意,如果您對config/config.php有未提交的更改,則會將其丟棄。

3

我們也可以嘗試用底墊

git pull --rebase origin dev