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

Handling changes to files with --skip-worktree from another branch

在我的机器上,我已将 --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

或者有没有更简单的方法?

这根本不是一个 hacky 方法。这实际上正是您在这种情况下需要做的。让我们逐步了解该场景。 (在此过程中做出一些假设,因为它是一个 YML 文件。)

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

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

您正在主动忽略该文件,因此您需要告诉 git 再次关注它。否则没有 git 进程会看到该文件。

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

然后将您的更改放在安全的地方,因为您不想提交它们,所以最好的地方是:

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

我们完成了。