所以,我经常遇到这个令人讨厌的问题,并尝试在网上寻找任何解决方案,但我不确定这是否是git的预期行为。
每当我进行一些本地提交并执行git pull
时,git会将所有其他人的提交带入我的临时区域以防万一,我发生了合并冲突。现在,虽然冲突发生在一个文件中,但我不明白为什么git会将其他人的非冲突提交带到我的临时区域,要求我提交它们就好像它们是我做出的更改/提交一样。
最近,我在同事的笔记本电脑上有同样的行为,我们在提交之前取消了同事未添加的所有文件,然后提交了唯一存在冲突的文件。发生了什么,是非常意外的。 Git显然删除了所有这些文件,解除了所有更改,就好像我们的提交颠倒了它们一样。
然而,最奇怪的是,我们查看了Stash(我们使用Stash来管理中央存储库),我没有看到这些文件被我们在Stash中的提交撤消。
我不知道这是怎么发生的。任何似是而非的解释?此外,我有时看到斯塔什行为非常奇怪。这似乎不可靠。它不会显示两次提交之间的任何更改,但有时会发生更改。我不知道这是怎么发生的,但还有其他人遇到过这些问题吗?
更新:后来我意识到Stash并不奇怪,只是有点不直观。在进行合并时,它显示了基于两个不同父项的更改。并且有一个小的下拉列表可以让您更改父级以查看与其对应的更改。我认为在这里更新它会很好,所以人们没有误导性的想法。
答案 0 :(得分:8)
您看到的暂存文件是您上次将本地分支与远程分支同步之间的所有更改的结果(我猜你没有提及它)。
Git pull已经“获取”了自上次提取以来的更改,然后它尝试将远程分支的本地副本合并到您的本地分支中。然后它在其中一个更改的文件中发生冲突。
所以它必须在合并过程中停止,询问如何解决与一个文件的冲突。
所以其他文件已准备好合并,已经上演,如果没有任何其他冲突,它们会自动合并。
要完成自动合并,您需要a)解决冲突然后b)点击提交以完成将其他人的更改合并到您的本地分支。 (某些GUI在您单击“我已完成解析”按钮后)自动执行提交完成步骤
您还会注意到在GUI的提交窗口中,是否有针对挂起提交的预制合并消息?它会说“将origin / x合并到x ......冲突:y”。一旦所有更改的文件都可以添加到舞台上,您就可以完成暂停的自动提交。
所以这对我来说听起来像预期的行为,但你只是看到了git内部流程的“内部”。
这里不需要存储或涉及存储。虽然有些GUI会自动存储,但git本身并不会在拉动过程中使用存储。
注意:执行拉取时,本地不应该有任何更改的文件。 (即在进行任何分支操作之前将所有内容都清理干净,这是一个很好的最佳实践)使用GUI清理已更改的文件是自动存储有用的时候,但是当存在冲突时它仍然有其复杂性。即你需要解决冲突,然后记得随后弹出藏匿处。如果您过分依赖自动化,那么当您必须完成您不了解的自动化过程时,它会变得混乱!因此,我建议始终保持工作目录的清洁。
答案 1 :(得分:1)
git pull
的默认行为是执行fetch
,然后执行merge
。合并是一个实际的,新的,提交;通常这会自动解决,因此您看不到分阶段的更改。但是,如果发生冲突,则无法自动执行提交,因此会显示可见的分阶段更改。