"would be overwritten by merge" 是什么意思?

What does "would be overwritten by merge" mean?

从基于团队的 Git 远程存储库中提取时,我收到此消息:

"C:\Program Files (x86)\Git\bin\git.exe" pull --progress "origin" +refs/heads/master:refs/remotes/origin/master
Updating 71089d7..4c66e71
error: Your local changes to the following files would be overwritten by merge:
    Source/Reporting/Common/Common.Dal.csproj
Please, commit your changes or stash them before you can merge.
Aborting
Done

Git 中的什么规则(或功能)确保我在工作目录中修改的文件 不会 被拉取覆盖?

也就是说,在什么情况下被pull覆盖?或者...我需要做什么来强制拉取覆盖我刚刚修改的文件?

该消息表示您对文件进行了本地修改,但尚未提交。当 运行 pull 时,工作树中的文件从远程存储库更新。如果 git 发现文件被您修改并提交并在远程存储库中,它将简单地尝试合并更改并更新索引和工作树。但是对于只有本地修改的文件还没有提交,它会停止。

因此您必须先 commit 更改或 stash 按照消息中的建议进行更改。没有办法避免它,因为它会导致索引和工作树不一致。

保留本地更改的典型情况是(如 git help stash 中给出):

           git pull # first attempt of pull
            ...
           # Here you see the complains about locally modified files
           git stash # will save your changes into stash
           git pull  # pull now succeeds as there are no locally modified files
           git stash pop # pop the stash and apply the changes

正如消息所示,您对文件进行了一些更改,但没有将这些更改提交到您的存储库。其他人对同一个文件进行了更改,当您尝试从远程存储库中提取最新修订版时,由于被其他人的更改覆盖,您将丢失对文件所做的任何本地更改。

如果您想保留所做的更改,请在拉取之前将您的更改提交到存储库,然后尝试合并:git merge origin/master。如果您不关心这些更改,可以丢弃它们:git stash drop.

更新:

回答关于在不提交到存储库的情况下将更改保留在本地的问题...

只需存储您更改的所有内容,提取所有新内容,然后弹出您的存储,即

git stash
git pull
git stash pop

请注意,在这种情况下,在 stash pop 上会有冲突(消息已经说得很清楚了)。

如果你知道你想要的就是你存放的东西,即你的本地更改,那么解决冲突就很容易。你只需使用

git checkout --theirs -- Common.Dal.csproj

什么规则会产生 "would be overwritten" 警告?

如果您修改了一个文件,该文件在远程存储库中也有修改但尚未提交。

什么规则可以避免 "would be overwritten" 警告?

如果远程仓库中没有未提交的文件也有修改。

我需要做什么...

这取决于你真正想要什么:

  1. 您想强制拉取覆盖文件

    显然,如果你真的想要这个,你不会关心你刚刚所做的更改,也不介意删除它们。如果是这样,您只需这样做:

    git reset --hard
    git pull
    
  2. 您想要您的更改和来自拉取的更改

    在我看来,处理此问题的最简单方法是提交您的更改,然后拉取。然后,如果存在合并冲突,请使用通常的机制来解决合并(提示:配置您的 difftool 和 mergetool,以便您可以使用 meld 或 diffmerge 等 GUI 工具轻松解决冲突)。只要做:

    git add $the_affected_file
    git commit
    git pull
    
  3. 您想要这两项更改,但还没有准备好提交

    就我个人而言,我认为您不应该准备好做出承诺。但有时会发生这样的情况,即您正在调试的代码部分损坏,而您真的不想提交。在这种情况下,您可以暂时存储更改,然后在拉取后取消存储:

    git stash
    git pull
    git stash pop
    

    如果在弹出存储后有冲突,则以通常的方式解决它们。注意:如果您还没有准备好因冲突而丢失隐藏的代码,您可能想要执行 git stash apply 而不是 pop