使用来自另一个分支的--skip-worktree处理对文件的更改

时间:2016-02-29 01:51:12

标签: git branching-and-merging git-skip-worktree

在我的计算机上,我已将--skip-worktree设置为config/database.yml

git update-index --skip-worktree config/database.yml

另一位开发人员在处理项目时已提交并合并到开发分支对config/database.yml的更改。

现在,当我git pull origin develop时,我得到了

Andrews-Air:[project] agrimm$ git pull origin develop
From bitbucket.org:[company]/[project]
 * branch            develop    -> FETCH_HEAD
Updating [SHA]..[Another SHA]
error: Your local changes to the following files would be overwritten by merge:
    config/database.yml
Please, commit your changes or stash them before you can merge.
Aborting

我该如何应对这种变化?我应该

git update-index --no-skip-worktree config/database.yml
git stash save "Save changes to config/database.yml"
git pull origin develop
git stash apply
# Fix any conflicts
git update-index --skip-worktree config/database.yml

或者是否有一种不那么黑客的做法?

1 个答案:

答案 0 :(得分:7)

这根本不是一种hacky方法。这实际上就是你在这种情况下需要做的事情。让我们一步一步地完成这个场景。 (在此过程中做了一些假设,因为它是一个YML文件。)

您忽略了该文件,因为您的更改只会影响您的本地构建过程,并且不希望意外地将这些更改推送给其他人并可能会影响他们,或者更糟糕的是生产。一个相当正常和良好的做法。

有时这些文件确实需要更改,就像在这种情况下一样,因此提交了更新版本。拉入这些更改将触发检查以验证它覆盖的文件是否与提交中的文件匹配,如果不匹配,则会抛出错误。 (未通过完整性检查将忽略该标志)

你主动忽略了这个文件,所以你需要告诉git再次关心它。否则,没有git进程会看到该文件。

git update-index --no-skip-worktree config/database.yml

然后把你的更改放在安全的地方,既然你不想提交它们,那么stash是最好的地方:

git stash save "Save changes to config/database.yml"

您最终可以将远程更改带到本地分支。当您收到原始错误时,您已经获取了,因此您也可以进行合并。所以:

git pull origin develop
 -or-
git merge origin/develop

您现在已经更新了,但是您仍然希望这些更新能够让它在本地运行,所以让我们从我们的安全存储位置取回它们:

git stash pop

如果存在任何冲突,您可以解决这些冲突,并确保在集成新更改后项目将正确构建。

最后,我们希望再次保护其他用户免受本地更改的影响,因此我们会在路径上恢复skip-worktree标志。

git update-index --skip-worktree config/database.yml

我们已经完成了。