25

现在的情况:

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

4

1 回答 1

30

你想做一个交互式变基

在尝试使用 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
于 2010-09-02T12:05:54.483 回答