【问题标题】:What does "would be overwritten by merge" mean?“将被合并覆盖”是什么意思?
【发布时间】:2016-05-28 18:20:58
【问题描述】:

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

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

【问题讨论】:

  • 正如消息所示,您已经对文件进行了一些更改,但您没有将这些更改提交到您的存储库。其他人对同一个文件进行了更改,当您尝试从远程存储库中提取最新版本时,由于被其他人的更改覆盖,您将丢失对文件所做的任何本地更改。如果您想保留所做的更改,请在拉取之前将更改提交到存储库,然后尝试合并:git merge origin/master。如果您不关心这些更改,可以放弃它们:git stash drop
  • 不确定我是否回答了您的所有问题,因此我将其添加为评论而不是回答。如果这个答案足够,请告诉我,我会将其转换为答案。谢谢!
  • @Tacocat 谢谢。我真正感兴趣的是保持我的更改本地 而不将其提交到共享存储库。如何确保不会发生合并/覆盖?
  • 有办法做到这一点。我会发布一个答案,@datps

标签: git git-pull


【解决方案1】:

什么规则会产生“将被覆盖”警告?

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

什么规则可以避免“将被覆盖”警告?

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

我需要做什么...

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

  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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      更新:

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

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

      git stash
      git pull
      git stash pop
      

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

      如果您知道自己想要的是您放入存储中的内容,即您的本地更改,那么解决冲突很容易。你只需使用

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

      【讨论】:

      • 哇。所有答案都非常有用和有用。为什么我不能全部接受?向所有人 +1。
      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 2019-06-28
      • 2010-10-20
      • 2018-11-02
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多