“将被合并覆盖”是什么意思?

时间:2016-02-17 07:07:26

标签: git git-pull

从基于团队的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中的哪个规则(或功能)确保我在工作目录中修改的文件 NOT 被覆盖覆盖?

换句话说,在什么情况下被拉?或者......我需要做些什么来强制拉动来覆盖我刚刚修改过的文件?

3 个答案:

答案 0 :(得分:8)

什么规则会产生"会被覆盖"警告?

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

什么规则会避免"会被覆盖"警告?

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

我需要做什么......

这取决于你真正想要的东西:

  1. 您想强制拉动以覆盖文件

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

    git reset --hard
    git pull
    
  2. 您需要更改和拉动

    中的更改

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

    git add $the_affected_file
    git commit
    git pull
    
  3. 您希望这两项更改,但您尚未准备好提交

    我个人认为你不应该做好准备。但是,有时你会发现部分破坏了你正在调试的代码并且你真的不想提交。在这种情况下,您可以暂时隐藏更改,然后在拉动后取消暂停:

    git stash
    git pull
    git stash pop
    

    如果在弹出后存在冲突,则以通常的方式解决它们。注意:如果您因为冲突而未准备好丢失隐藏的代码,则可能需要git stash apply代替pop

答案 1 :(得分:4)

该消息表示您对文件进行了本地修改但未提交。运行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

答案 2 :(得分:2)

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

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

<强>更新

回答关于在本地保留更改而不提交存储库的问题......

只要存放你所改变的所有东西,拉出所有新东西,然后弹出你的藏品,即

git stash
git pull
git stash pop

请注意,在stash pop中,在这种情况下会出现冲突(该消息已经非常清楚)。

如果你知道你想要的东西是你在藏匿处的东西,即你当地的变化,那么解决冲突很容易。你只需使用

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