假设我有一个master
分支和一个feature-a
分支。 feature-a
待审核,但大家都很忙。我需要启动feature-b
,但feature-b
取决于feature-a
中完成的代码。
到目前为止,我一直在从feature-b
分支feature-a
,然后合并feature-a
可能发生的所有更改。
现在假设有人被释放并通过feature-a
,因此feature-a
被合并为master
。
现在是时候将feature-b
与master
同步了。无论我是将master
变基还是合并到feature-b
,通常我都会遇到一些冲突,这些冲突在解决后会导致没有更改要提交,这意味着我无法提交。
我已经进行了一些谷歌搜索,实际上唯一可行的解决方案似乎是:
对我来说这似乎很傻:thinking_face:
在上述情况下,有人知道解决冲突/管理分支机构的更好方法吗?
绘制您的提交。实际上,从字面上看,可以在纸上,白板上或其他任何东西上绘制提交图(或让git log --decorate --oneline --graph
为您绘制,但是如果您手工完成,将会得到更多收益)。您最终将得到如下所示的内容:
...--o--o--* <-- master
\
A--B--C--D <-- feature-a
\
E--F--G <-- feature-b
<< [before某人被释放并合并feature-a
。 (这些字母代表原始哈希ID。)然后,释放了其他人并合并了feature-a
。因此,draw that:
...--o--o--*------------M <-- master
\ /
A--B--C--D <-- feature-a
\
E--F--G <-- feature-b
如果他们以其他方式进行合并,或者首先合并了其他提交,请绘制。绘制实际图形!这很重要,因为它是Git的工作方式。现在考虑将that
希望得到的
作为最终合并结果。您是否愿意:...--o--o--*------------M---------M2 <-- master
\ / /
A--B--C--D /
\ /
E--F--G
或:
...--o--o--*------------M---------M2 <-- master \ / \ / A--B--C--D E'-F'-G' <--- feature-b \ E--F--G [abandoned, do not use]
或完全其他?提交。我们需要将听起来好像您要使用第二个选项,最容易通过
git rebase
获得:rebasecopies
E
复制到新的提交E'
,类似于E
,但要接在M
之后(使用M
作为其前身,并且与M
进行比较,进行相同的[[changes与E
相比)。然后我们需要将D
复制到F
,然后将F'
复制到G
。如果仅运行G'
,则Git有时1选择太多
提交进行复制。特别是,它可能(不是我在此处绘制的示例中,而是在其他情况下)决定应首先复制git rebase master
,A
,B
和C
。当Git决定执行此操作时,您将看到您看到的那种合并冲突,因为每个提交所做的一切都已经完成。解决这些合并冲突时,您一无所有可提交。D
命令对此有一个答案:在换库中期,解决了这些冲突之后,您运行git rebase
。但是,以Git“预跳过”您要复制的四个提交通常更容易。为此,您可以使用git rebase --skip
:git rebase --onto
例如,假设您的名字git rebase --onto master feature-a
仍然选择提交feature-a
。 (请记住,随着时间的推移,分支名称move会提交,但由其哈希ID标识,则永远不会更改。)
D
告诉rebase将副本放置在何处:--onto
之后。M
部分告诉Git要复制什么not
:由feature-a
标识的提交,以及通过从该提交开始并在图形中向后工作而可以到达的任何更早的提交。 (要复制的提交始终是那些在您的feature-a
现在结束的位置,并且要在过程结束时移动分支名称的位置,以便放弃旧的提交,而使用新的和改进的链,是您现在所在的分支name。)
绘制图形是许多Git操作的关键。
1
这取决于HEAD
的结果。