git - 在stash pop期间合并冲突后出现的错误

21

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

目前我正在尝试更新在git仓库中未更改的所有文件。例如,假设我有:

  • test1.py
  • test2.py

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

git stash
git pull
git stash pop

我做了一些更改后,使用Git命令恢复了这些更改,并收到一个警告,提示我需要合并test1.py。到目前为止还好。问题出现在我尝试再次执行相同的过程时(在两个文件都再次被远程更改之后)。Git现在显示:

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

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


还有一点需要注意:使用Git时,你并不会真正地分割提交。当你拉取代码时,无论你是否修改了这些文件,你都会获取到所有的更改。在应用(弹出)你的暂存更改后,你最终得到的是这些更改的组合(通过一个幕后的合并)。你想要更新仅仅是你没有修改过的文件的目标并没有太多意义。 - Cascabel
2个回答

27
你解决了文件中的冲突(也许?见脚注),但Git并不知道你是否已经完成。你需要告诉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查看在应用存储时发生了哪些合并冲突。它们将以红色列出(如果启用了颜色),并显示未合并(如果是删除/修改冲突,则可能显示由我们/他们删除)。

脚注:回顾您的问题,我实际上无法确定您是否已解决了冲突 - 您只是说“目前为止还不错”。您看到的“警告”实际上旨在建议立即解决冲突。当尝试将您拉取的更改与您保存的更改合并时,就会出现冲突。在继续之前,您必须解决该冲突并使您的工作树保持一致状态。像解决合并冲突一样处理它 - 在文件中查找冲突标记,找出要保留的内容!(然后请参见上面的操作完成。)


没有立刻看到你的回答。+1 为提供清晰的操作步骤。 - VonC
我试着按照你的建议进行操作。在尝试了git stash pop命令之后,它仍然无法正常工作。现在它显示出错误信息:"error: Your local changes to the following files would be overwritten by merge: <file>"。 - Dave Cohen
我遇到了和 @Dave Cohen 一样的问题。我通过使用 git checkout -f <file> 解决了它,这会(警告!)丢弃任何本地更改。 - James

2

这意味着你的第二个储藏库不起作用,因为合并仍未解决。
请参考此SO问题,其中说明了在储藏库上出现相同的错误消息。

该帖子确认了树形结构不能包含未合并的文件。

您的树形结构中有未合并的条目。
为什么不查看问题并解决它?
简单的 "git status" 命令应该会显示未合并的条目。查看这些文件应该会显示冲突标记。

解决问题,提交并继续。


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