混帐:改写历史:重新排序和合并提交
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 *)。但是,当我要在某个位置发布该修补程序时,我想排除这些修补程序。
你想做一个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
哇,那很简单! :)如此自然,优雅和完美。 – Albert 2010-09-02 12:17:40
这从混帐亲书的参考值将是有用的(重写提交历史) 。 http://git-scm.com/book/ch6-4.html – Rimian 2012-10-31 02:48:38