【问题标题】:git - errors after merge conflicts during stash popgit - 存储弹出期间合并冲突后的错误
【发布时间】:2011-05-13 18:56:25
【问题描述】:

原标题:git - 更新所有未更改的文件

目前我正在尝试更新 git 存储库中尚未更改的所有文件。比如说我有:

  • test1.py
  • test2.py

test1.py 已在本地修改,而两个文件均已远程修改。现在我尝试了:

git stash
git pull
git stash pop

它恢复了我的更改,警告我需要合并 test1.py。到目前为止,一切都很好。当我再次尝试执行相同的过程时(在再次远程更改两个文件之后),就会出现问题。 Git 现在说

unmerged (6b126638f7c63aa648609afa60ab972a2403502b)
fatal: git-write-tree: error building trees
Cannot save the current index state

这让我有点难过。它只想要一件简单的事情:更新所有我没有更改的文件。稍后我会处理合并。

【问题讨论】:

  • 还有一点需要注意:使用 Git,您并不会真正分解提交。当您拉动时,您将获得 所有 更改,无论您是否更改了这些文件。在应用(弹出)隐藏的更改后,您最终会得到更改的组合(通过合并,在幕后)。您只更新未更改的文件的目标实际上没有多大意义。

标签: git git-stash


【解决方案1】:

您解决了文件中的冲突(也许?见脚注),但 Git 不知道您是否已完成。你必须向 git 表明你已经解决了这个冲突。 (否则,如果它让你继续前进,而你还没有真正解决它,你可以找到各种方法来打自己的脚。)

据我所知,这样做的方法是:

git add <file>        # stage the resolved version, which marks it as resolved
git reset HEAD <file> # unstage the changes, leaving the resolution just in the work tree

似乎应该有一种方法可以同时使用update-index 进行这两项操作,但快速浏览一下对我来说并不明显。 (但话又说回来,对于实际的合并冲突,您永远不想在不暂存内容的情况下将冲突标记为已解决;这只是为了隐藏。)

正如 VonC 在他的回答中所说,如果这种情况再次发生,您可以很容易地看到在使用 git status 应用存储时发生了合并冲突。它们将以红色列出(如果你有颜色)并说unmerged(或者如果是删除/修改冲突,可能是deleted by us/them)。

脚注:回顾您的问题,我实际上无法判断您是否解决了冲突 - 您只是说“到目前为止一切都很好”。您看到的“警告”实际上是作为立即解决冲突的建议。当您尝试将您提取的更改与您隐藏的更改结合起来时,就会出现冲突。在以任何方式继续之前,您必须解决该冲突并使您的工作树进入一致的状态。像处理合并冲突一样处理它 - 查看文件,找到冲突标记,找出要保留的内容! (然后回过头来看看如何完成。)

【讨论】:

  • 没有马上看到你的答案。 +1 以便遵循明确的程序。
  • 我试图遵循这个。在您建议的命令之后,我再次尝试了git stash pop,但它仍然无法正常工作。现在它说“错误:您对以下文件的本地更改将被合并覆盖:”
  • 我和@Dave Cohen 有同样的问题。我能够通过使用git checkout -f &lt;file&gt; 来解决它,它(警告!)会抛出任何本地更改。
【解决方案2】:

这应该意味着您的第二个存储由于仍未解决的合并而无法工作。
请参阅此SO question,它说明了存储中的相同错误消息。

thread confirms 表示树不能包含未合并的文件。

您有一棵树,其中包含未合并的条目。
您为什么不调查并解决问题?
一个简单的“git status”应该告诉你什么是未合并的 条目。简单查看这些文件应该会显示冲突标记。

解决问题,提交,继续。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多