樱桃产生的Git冲突
首先,我是git的新手,但一直在讨论关于这个和这个主题的文档和类似问题(我将在稍后的帖子中提到后一个问题)。
总结:我正在挑选一个分支到另一个分支,然后在一个分支上进行提交,然后尝试将它们合并到一起,我正在接受冲突。 请参阅下面的答案,了解我的想法。
场景:我有两个文件,一个在“主”分支,另一个在“次要”分支。 “secondary”分支包含一些我们不想在master中使用的文件,并且只有少数人使用,但是我们在“master”和“secondary”中的大多数文件应该是一致的(master中的所有内容都是在中学,但所有中学都不在主)。 为了实现这一点,我一直在提交“master”中所做的更改,使用git checkout secondary
检出我的“secondary”分支,然后运行git merge master
。 不幸的是,我曾经提出过一次冲突,现在我的大脑正在努力弄清楚冲突是什么。
尝试解决方案:起初,我认为这是因为我修改了“secondary”和“master”中的文件,这是我的。 为了解决这个问题,我使用git cherry-pick [commit]
将我在二级分支中所做的更改拖入主分支。 但是,我仍然无法将我的主分支合并到二级分支中。 Git建议使用git add/rm
(大概是git add
或git rm
,尽管这让我有点想弄清楚)来标记我想要的东西。 所以我使用git rm命令在“secondary”中删除了索引和工作树中的版本。 在此之后,我回到我的“主”分支,重新将我想要合并到“次要”的文件,回到“次要”,然后再次运行git merge master
。 让我懊恼的是,冲突。
问:坦率地说,我想我不知道发生了什么。 我认为, git merge master
(当在二级分支上运行时)会采取在git master commit中所做的所有更改,并将这些更改放在二级分支中。 如果这是发生了什么,我不明白这个问题。 我已经从辅助文件中删除了这些文件,并在主文件中进行了我的更改。 为什么我不能合并? 我之前提到的后一个问题的解决方案表明,这可能是因为共同的祖先包含其他内容,但我认为git cherry-pick [commit]
会照顾到这一点。 问题是cherry-pick
不会创建新的合并基础,因此即使所选文件在cherry-pick
后相同,它们可能仍然与合并基础不同?
我对这个问题的长度表示歉意,我想超级难以理解,并且觉得我在圈子里跑步。 任何建议都会很棒。
编辑:我想我也很困惑,因为我不明白为什么git不会让我改变分支来尝试解决这个问题。 当我现在尝试使用git checkout secondary
来尝试或者cherry-pick
提交更改为辅助时,我得到error: you need to resolve your current index first
。 我假设git不会允许这种行为,我只是不确定我看到它是什么。
最后一点 - 你的回购处于一个缓慢的状态。 您可以手动编辑冲突并完成合并提交,也可以退出合并提交
我认为在master上的一个或多个提交包含仅存在于master上的文件。 Git无法合并这些提交,因为它们包含对不存在的文件的更改。
尝试'git status'来查看你目前的位置; 寻找“两个修改过的”文件。 然后'git rm'将文件从合并文件中取出,或者您可以解决文件中的问题(冲突)并将它们添加回'git add'提交。 然后'git commit'完成合并。
找到解决方案! 什么情况是, cherry-pick
不会创建一个新的合并基础(所以他们都有着共同的祖先,但它比这两个其当前状态的不同)。 因此,当我在cherry-pick
后修改主人时,我的所有三个文件都不同。 想象:
Common Ancestor: File.txt: this is the common ancestor.
然后我在二级分支上进行更改,并提交它们。
次要的: File.txt: now I've modified this file to be this!
然后我把git checkout master
和git cherry-pick [commit made on secondary]
。
主: File.txt: now I've modified this file to be this!
然而,共同的祖先仍然是File.txt: this is the common ancestor.
如果我对master进行提交,将其更改为File.txt: now this is the new master!
,我会有三个不同版本的File.txt
! 因此,当我尝试合并时,git抱怨冲突,因为它不知道如何组合这两个不同的文件。 为了解决这个问题,只需在主控制器上进行cherry-pick
后直接运行git merge secondary
! 所以如果我们现在合并,我们会得到:
Common Ancestor: File.txt: now I've modified this file to be this!
这看起来并不直观,因为主控和辅助之间的合并实际上没有对他们的文件做任何事情,因为它们在这一点上是相同的。 但是,在我们对任一分支做出更改之前,有必要进行合并以创建共同的祖先。 希望这可以帮助别人!
链接地址: http://www.djcxy.com/p/41723.html