当前位置:  开发笔记 > 运维 > 正文

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

如何解决《git:重写历史记录:重新排序和合并提交》经验,为你挑选了1个好方法。

现在的情况:

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*).但是,当我要在某处发布该补丁时,我想排除这些.



1> Neall..:

你想做一个互动的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


哇,这很容易!:)如此自然,优雅和完美.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有