22

在我的机器上,我设置--skip-worktreeconfig/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

还是有一种不那么老套的方法?

4

1 回答 1

19

这根本不是一种骇人听闻的方法。这实际上正是您在这种情况下需要做的。让我们一步一步地看这个场景。(一路上做一些假设,因为它是一个 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

我们完成了。

于 2017-09-01T16:26:40.080 回答