情景:
我正在开发一个名为20+的团队的远程git存储库。分支机构经常制作,承诺并合并为主。
一位同事和我在一个分支机构工作了几天。他重组了分支机构,解决了所有冲突并推动了。
当我尝试拉动时,我得到“自动合并失败”并提示解决所有冲突。
当我“git status”时,我发现我有不同的origin / branch并且每个都有超过100个不同的提交。
问题:
他完成了我迄今为止的所有提交,刚刚进行了重新定位,然后推动了,如果我继续合并,我可能会重做他已经完成的冲突解决方案。
问题
这里发生了什么?
怎么办?为什么呢?
旁白
我已经阅读了很多关于git的内容,我还在学习,并且希望得到与git逻辑相关的直接答案,而不是与相关命令有关。
提前谢谢。
答案 0 :(得分:8)
不,不能这样做(回答问题标题中的问题)。
在通过推送,拉动或克隆与他人共享变更集之前,应该重新进行重新定位。
问题的例子,一个程序员提交了5个变更集:
(1)---(2)---(3)---(4)---(5)
这些更改集与另一个开发人员共享,该开发人员最初只有一个包含第一个变更集的克隆,因此他在自己的存储库中拥有自己的变更集。一旦他拉了或你推了,就有他所拥有的:
(1)---(2)---(3)---(4)---(5)
\
\
(A)---(B)---(C)
因为他想要一个线性历史记录,所以他会根据他的变化来改变你的变化,得到这个:
(1)---(A)---(B)---(C)---(2')---(3')---(4')---(5')
请注意,我现在在他的存储库中标记了您的更改集,以表明他们已经"您的"变更集,但现在受到他之前的更改的影响,因此不再与您的相同(哈希或其他)。
然后你拉,这就是你得到的:
(1)---(A)---(B)---(C)---(2')---(3')---(4')---(5')
\
\
(2)---(3)---(4)---(5)
现在你有两个"副本"那些变化集。
如果您在存储库中的第5个变更集之后没有做任何事情,您可能只是将它们从存储库中删除,但是请标记该单词,"可能",它带有强大的功能要求您了解存储库的状态,并且需要了解存储库的每个克隆。
在一切状态恢复到糟糕状态之前,它不需要多次拉动 - 合并 - 推送。
结论:除非您知道自己在做什么,否则不要重新定义变更集,并且几乎肯定不会更改共享的变更集。
实际上:该警告应该反对所有形式的历史重写。任何重写历史记录的内容必须单独完成,并且所有克隆必须无效,否则您将拥有不同的历史记录和多个副本"受影响的变更集。 你不想来这里!
答案 1 :(得分:1)
什么是LasseV。卡尔森说没事。由于他重新开始分支,你不能真正拉它并重新包装所有东西。
如果您没有更多“新”提交,只需删除您尝试拉动的分支并将其拉出。由于您的所有变更集都存在,只需将您的分支重置为与服务器上的分支完全相同,然后从那里继续。如果你有新的提交,那将会有点困难。
首先创建分支的副本:
git checkout [branch]
git checkout -b branchCopy
删除分支(如果由于未合并而不想删除它,请使用-f)
git checkout -d branch
获取服务器上的内容(来源可能是不同的遥控器)并使用服务器上的内容重新创建分支
git fetch [origin]
git checkout origin/branch
git checkout -b branch
现在您将拥有branch
和branchCopy
使用git log,检查要添加到分支的提交。并使用cherry-pick
添加
git checkout branch
git cherry-pick "commit"
添加所有未合并的提交后,只需推送到服务器即可。并删除“branchCopy”
如果branchCopy和branch之间有很多不同的变更集。我想有一种方法可以将一组提交从branchCopy
重新绑定到branch
,但是如果你只是改变它。它将添加每个更改,因为复制的提交具有不同的哈希。
所以是的,除非你知道自己在做什么,否则不要吝啬。如果你想要和很多人一起工作。最好的办法是确保每个人都知道你在变基础。
我认为任何好时光旅行者的第一条规则是“不要改变历史”
这里有一个提示让时间旅行比以往更安全的提示。在工作中,我使用了那个流程:
在我的功能分支上工作,并在完成后合并到master中。
当您在分支机构上工作时,它几乎可以向您保证您不会重新设置主分支上的提交。完成后,您必须做出选择。您可以在master中合并您的分支,或者在master上重新分支您的分支。
如果您要重新分支您的分支,则必须获取最后一次主提交并对其进行rebase并尽可能快地推送它。当人们拉动它时,它应该仍然是快进的,因为你没有改变主人的历史,而是你的分支的历史。
但说实话,使用bitbucket之后,(不能说github)。我使用拉请求。它执行合并提交,即使分支是快速的,也可能更容易避免大部分时间的变基。如果您使用具有它的系统,Pullrequest是一个很棒的创作。
它可能会创建一个合并提交,但它会保留已合并的提交的历史记录,由谁和您可以对它们进行评论。人们可以处理要合并的功能,有人可能会在需要时使用pull请求来检查代码并将代码合并到master中。