我有一个Git仓库,例如两个分支“master”和“other”。它们几乎包含提交到每个子文件夹,因此历史记录中的修订时间没有冲突。现在我想删除“其他”分支;并以拉链式方式将其提交合并为“master”,例如:
Master A1 A2 - - - M3 M4
Other B1 - - - B2 - - B3
变为
Master A1 B1 A2 B2 M3 M4 B3
和“其他”消失了。因此只剩下一个线性主分支。
这可以用Git的工具包吗?
答案 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
重命名为master
:git branch -M master
。