Git rebase:使用一次提交修复多个提交

时间:2013-11-01 18:49:31

标签: git git-rebase

假设我有一个git分支,并在分享之前进行最终审核,我发现了一些小错误,例如拼写错误。我想要做的是将一个补丁应用为“修正”,但实际上它会影响许多提交,因此最终历史记录中没有错误的迹象。

也就是说,如果我在一次提交中更改了行A,然后在另一次提交中更改了行B,然后我有一个影响A行和B行的补丁,我想做一个改变,其中提交更改行A得到由该补丁的A部分修复,并且提交改变行B获得B部分而无需手动确定哪些提交。有一个简单的方法吗?

我认为伪代码脚本应该是这样的:

collect all hunks from the fixup
for commit in the history we are rebasing:
    check out commit
    for hunk in fixups:
        try:
            apply hunk to the working tree
        except:
            continue
        remove hunk from fixups
    commit the working tree.

2 个答案:

答案 0 :(得分:0)

这是部分答案。它很难看,但它的工作原理很简单。

我有一个提交,ce580fe,可以在多个地方重命名。我想让原始名称永远不会出现在文件中。这至少在一种情况下起作用:

git rebase -i 0881a5a --exec "git diff ce580fe^ ce580fe | git apply --reject; git add -u; git commit --amend -C HEAD"
git diff ce580fe | git apply; git add -u git commit --amend -C HEAD # Apply any changes that got missed.

也就是说,在每个rebase步骤中,它应用ce580fe的差异并允许拒绝部分差异。它将所有更改添加到已知文件,并使用相同的提交消息修改提交。然后最后应用左边和ce580fe之间的差异,使树看起来像ce580fe

它对于.rej生成的git apply --reject文件没有任何作用,这很麻烦。对于实际重命名,使用带有搜索和替换行的git rebase -i --exec可能会更好。

答案 1 :(得分:0)

似乎 git rebase --autosquash 提供了大部分此功能:如果您有一个以 fixup! 开头的提交,那么 git rebase --autosquash 将对该提交重新排序并使其成为修复,将其合并。

此外,这似乎提供了我所要求的其余功能!:https://github.com/torbiak/git-autofixup

使用 git autofixup,它会进行您的工作更改,找出其中的哪些部分与哪些内容一致,并可能自动进行多次 fixup! 提交。所以...

  1. 进行修正更改。
  2. 运行 git autofixup master,它将进行工作更改并自动进行一次或多次 fixup! 提交。
  3. 最后执行 git rebase --autosquash masterfixup! 提交将重新排序到位。