“would be overwritten by merge” 是什么意思?(涉及IT技术)

13

当从基于团队的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覆盖?或者说...我需要做什么来强制执行pull以覆盖我刚刚修改的文件?


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

18

如何产生“would be overwritten”警告?

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

如何避免“would be overwritten”警告?

确保没有未提交的文件与远程仓库中的修改冲突。

我需要做什么...

这取决于您的实际需求:

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

    显然,如果您真的想这样做,您不关心最近所做的更改,并且不介意删除它们。如果是这样,只需执行以下操作:

    git reset --hard
    git pull
    
  2. 您想要自己的更改以及拉取请求中的更改

    在我看来,处理这个问题最简单的方法是先提交您的更改,然后执行一个拉取操作。如果出现合并冲突,则使用通常的机制来解决合并冲突(提示:配置您的difftool和mergetool,以便您可以使用GUI工具(如meld或diffmerge等)轻松解决冲突)。只需执行以下操作:

  3. git add $the_affected_file
    git commit
    git pull
    
  4. 你想要这两个更改,但你还没有准备好承诺

    个人认为你永远不应该没有准备好承诺。但有时候会发生这种情况:你的代码部分损坏,正在调试,你真的不想提交。在这种情况下,你可以将更改暂存起来,在拉取后再取消暂存:

  5. git stash
    git pull
    git stash pop
    

    如果在弹出存储区后出现冲突,请按照通常的方式解决它们。注意:如果由于冲突而不想丢失存储的代码,您可能希望执行git stash apply而不是pop


5
这条信息是指你的文件有本地修改,但这些修改还未被提交。当运行 pull 命令时,你的工作区中的文件会从远程代码库更新。如果 Git 发现某个文件被你和其他人同时修改并提交到了远程代码库,它会尝试合并这些修改,并更新索引和工作树。但对于只有本地修改且未被提交的文件,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的情况下,可能会出现冲突(消息已经非常明确了)。
如果您知道您想要的是您放入stash中的内容,即本地更改,则解决冲突非常容易。您只需使用:
git checkout --theirs -- Common.Dal.csproj

1
哇,所有的答案都非常有帮助和有用。为什么我不能接受所有的答案呢?+1 给所有人。 - datps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接