git merge分支像拉链一样时尚

时间:2011-04-13 18:18:08

标签: git git-branch

我有一个Git仓库,例如两个分支“master”和“other”。它们几乎包含提交到每个子文件夹,因此历史记录中的修订时间没有冲突。现在我想删除“其他”分支;并以拉链式方式将其提交合并为“master”,例如:

Master A1 A2 -  -  -  M3 M4  
Other  B1 -  -  -  B2 -  -   B3

变为

Master A1 B1 A2 B2 M3 M4 B3

和“其他”消失了。因此只剩下一个线性主分支。

这可以用Git的工具包吗?

4 个答案:

答案 0 :(得分:5)

首先,您确定这是您想要做的吗?对于Git中的这种情况,有两种相当标准的解决方案,但它们都没有按照您想要的方式“提交”提交。第一个选项是将“other”合并为“master”,并删除“other”分支。这不会给您留下线性历史记录,但所有内容都在“主”分支中,您可以按照您想要的任何特定顺序查看修订(例如,您可以git log --date-order来获取提交按您想要的顺序列出)。你最终会得到这段历史:

    A1 A2 M3 M4
    *--*--*--*
   /          \
--*            *-- < master
   \          /
    *----*---*
    B1   B2  B3

您可以通过运行:

来实现这一目标
git checkout master
git merge other
git branch -d other

另一种选择是在主分支上重新设置“其他”分支。这将为您提供线性历史记录,但“其他”分支上的所有提交都将在“master”提交后显示。日期将被保留,所以如果你想知道实际发生的时间,你仍然可以找到它,但拓扑上,它们将在之后排序:

  A1 A2 M3 M4 B1 B2 B3
--*--*--*--*--*--*--*-- < master

您可以通过运行:

来执行此操作
git checkout other
git rebase master
git checkout master
git merge other
git branch -d other

如果你完全确定上述两种方法都不适合你,你可以考虑你试图做的“拉链”方法。 Git没有自动化工具可以为你做这件事,所以你将不得不为此努力工作。对于那些根据master创建历史记录的人来说,这也会造成问题,因为他们将不得不在新的master之上改变他们的工作(你提出的线性历史改变了每个人的父母master中的提交,这意味着那些提交与以前不同,这意味着其他任何人现在都将他们的工作基于一组全新的提交,这恰好与前一组提交具有相同的差异)

如果您不介意手动进行排序,可以使用git rebase -i按顺序排列提交。您将运行以下命令(其中base是两个分支分歧之前的第一个提交;如果a1是第一个在它们之间不相同的提交,那么您可以使用a1~来引用这个提交):

 git checkout master
 git merge other
 git rebase -i base

在交互式rebase期间,您将看到一个包含更改列表的文本文件,您可以将其编辑为您希望它们应用的顺序。这当然是完全手动的,所以如果您只有一个选项有一个短暂的历史,并希望手动重新安排提交。如果存在任何合并冲突,则可能必须多次手动解决它们(如果执行此操作)。如上所述,这意味着任何以master为基础工作的人现在也必须改变。

你也可以通过创建一个从base开始的新分支,并从一个分支或另一个分支到这个新分支的提交,最后用这个新分支替换master来自动化这个过程。

但正如我所提到的,你可能不想这样做。我的前两个解决方案并没有为您提供您所寻找的历史,但确实能为您提供接近它的解决方案,在大多数基于Git的工作流程中表现最佳。

答案 1 :(得分:1)

也许你可以将Other合并到Master中,然后运行git rebase -i A1以交互式rebase - 根据自己的喜好重新排列文本编辑器中的提交。你可能仍然有合并提交来处理。

如果你已经推送到另一个存储库,我就不会改变,否则你将改变历史记录并且提交不会排列。

答案 2 :(得分:0)

如果你不关心提交的实际顺序,那就没问题了:

A1 A2 M3 M4 B1 B2 B3

然后在分支上其他做git rebase master

答案 3 :(得分:0)

创建另一个名为temp的分支。 git cherry-pick相关提交temp。将分支temp重命名为mastergit branch -M master