假设我有一个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.
答案 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!
提交。所以...
git autofixup master
,它将进行工作更改并自动进行一次或多次 fixup!
提交。git rebase --autosquash master
,fixup!
提交将重新排序到位。