git:重写历史记录:重新排序和合并提交

时间:2010-09-02 11:27:57

标签: git rebase

现状:

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch

我想清理那段历史(A1到B3),尤其是因为我还没有把它推到任何地方,因为我想准备一个只有那些B *的补丁。

我想要的是:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch

我可能根本不会推动这个(或者如果我愿意的话,只有总和的B *,我必须完全取消A *提交)而我正在进一步研究这个,我可能会得到额外的这样的提交,即像这样:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch

我想再次像上面那样重写。

我不只是想知道任何方法来做到这一点(因为我能够以某种有点hacky的方式得到某种方式),我是特别的。在这里要求正确/最好/最干净/最简单的方法。


我在做什么。是:我正在处理官方的xorg-xserver-1.7分支,并希望准备一个补丁(B *)。因为我希望能够用系统替换我的自编译的xserver以进行简单的测试,所以我已经应用了一堆Debian / Ubuntu补丁(A *)。但是,当我要在某处发布该补丁时,我想排除它们。

1 个答案:

答案 0 :(得分:30)

您想要interactive rebase

尝试git命令时我想做的第一件事是制作我的分支的备份副本:

$ git branch my-backup-branch

假设你的A1提交有一个152274b的哈希值。试试这个:

$ git rebase -i 152274b^

该命令将使您的编辑器(通常是vim)显示如下:

pick 152274b A1
pick 14b0838 B1
pick 661b993 A2
pick a6510db B2
pick 557e171 A3
pick 85da0e4 B3

# Rebase 39a47e4..85da0e4 onto 39a47e4
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

从这里你可以改变提交的顺序,完全删除它们甚至压缩它们。在这个例子中,你可能想要像这样移动和挤压:

pick 152274b A1
squash 661b993 A2
squash 557e171 A3
pick 14b0838 B1
squash a6510db B2
squash 85da0e4 B3

试一试。如果您最终处于您不想要的状态,您可以随时返回到您在备份分支中保存的状态:

$ git reset --hard my-backup-branch