git merge分支像拉链一样时尚

dro*_*nus 2 git git-branch

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

Master A1 A2 -  -  -  M3 M4  
Other  B1 -  -  -  B2 -  -   B3
Run Code Online (Sandbox Code Playgroud)

Master A1 B1 A2 B2 M3 M4 B3
Run Code Online (Sandbox Code Playgroud)

和"其他"消失.因此只剩下一个线性主分支.

这可能与Git的工具包有关吗?

Bri*_*ell 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
Run Code Online (Sandbox Code Playgroud)

另一种选择是在主分支上重新设置"其他"分支.这将为您提供线性历史记录,但"其他"分支上的所有提交都将在"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
Run Code Online (Sandbox Code Playgroud)

如果您完全确定上述两种方法都不适合您,您可以考虑使用您正在尝试的"拉链"方法.Git没有自动化工具可以为你做这件事,所以你将不得不为此努力工作.它也会给任何基于历史的人带来问题master,因为他们将不得不在新的基础上重新设计他们的工作master(你提出的线性历史会改变master中每个提交的父级,这意味着那些提交与以前不同,这意味着其他任何人现在都将他们的工作基于一组全新的提交,这恰好与前一组提交具有相同的差异.

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

 git checkout master
 git merge other
 git rebase -i base
Run Code Online (Sandbox Code Playgroud)

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

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

但正如我所提到的,你可能不想这样做.我的前两个解决方案,虽然没有给你很好的历史,但是确实能给你一些接近它的解决方案,但在大多数基于Git的工作流程中都会表现得最好.