3

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

也就是说,如果我在一个提交中更改 A 行,然后在另一个提交中更改 B 行,然后我有一个影响 A 行和 B 行的补丁,我想做一个变基,其中提交更改行 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.
4

2 回答 2

1

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

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

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

  1. 进行修复更改。
  2. 运行git autofixup master,它将接受工作更改并fixup!自动进行一个或多个提交。
  3. 最后做git rebase --autosquash masterfixup!提交将被重新排序到位。
于 2021-06-18T11:21:22.667 回答
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 步骤中,它都会应用 diffce580fe并允许拒绝 diff 的一部分。它将所有更改添加到已知文件并使用相同的提交消息修改提交。然后最后应用剩下的和ce580fe使树看起来像之间的差异ce580fe

它不对产生的.rej文件做任何事情,这很笨拙git apply --reject。对于实际重命名,使用git rebase -i --exec搜索和替换行可能会更好。

于 2015-02-11T17:21:49.360 回答