现在的情况:
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的方式得到某种方式),我,尤其是.在这里要求正确/最好/最干净/最简单的方法来做到这一点.
我在做什么esp.是:我正在处理官方的xorg-xserver-1.7分支,并希望准备一个补丁(B*).因为我希望能够用系统替换我的自编译的xserver以进行简单的测试,所以我已经应用了一堆Debian/Ubuntu补丁(A*).但是,当我要在某处发布该补丁时,我想排除这些.
你想做一个互动的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