混帐:改写历史:重新排序和合并提交

问题描述:

现状:混帐:改写历史:重新排序和合并提交

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

我要清理历史最高(A1​​至B3),ESP。因为我还没有推到任何地方,因为我想准备一个只有那些B *的补丁。

我要的是:

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

我可能不会在所有按这个(或者,如果我会的,只有总结B *,我必须删除A *提交所有),虽然我这个进一步的工作,我可能会得到更多的这样的提交,即是这样的:

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

我想再次改写,像上面。

我不只是想知道任何方法来做到这一点(因为我可以得到像有点好笑的方式),我特别喜欢。在这里询问正确/最好/最干净/最简单的方式来做到这一点。


我在做什么。是:我正在使用官方的xorg-xserver-1.7分支并希望准备一个补丁(B *)。因为我希望能够将我的自编译的xserver替换为系统文件以实现简单的测试目的,所以我应用了一堆Debian/Ubuntu补丁(A *)。但是,当我要在某个位置发布该修补程序时,我想排除这些修补程序。

+1

这从混帐亲书的参考值将是有用的(重写提交历史) 。 http://git-scm.com/book/ch6-4.html – Rimian 2012-10-31 02:48:38

你想做一个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 
+2

哇,那很简单! :)如此自然,优雅和完美。 – Albert 2010-09-02 12:17:40