2012-05-02 409 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