Git 交互式变基,无需使用编辑器即可编辑特定提交?

Git interactive rebase, edit particular commit without needing to use editor?

目前我需要做的事情: git rebase -i f47adfa0 给我看:

pick 447a1cb Either left or right
pick ef35186 Introducing side effects

然后我修改为:

edit 447a1cb Either left or right
pick ef35186 Introducing side effects

如果我想 edit 一个特定的提交(在本例中为 447a1cb),是否有可以用来直接调用该状态的命令?而不是必须经过上述程序?

IIUC,你可以创建一个临时分支,然后将其与rebase合并回来:

 $ git checkout -b temp-branch <SHA1>
 $ git commit --amend -m 'new commit message'
 $ git checkout -
 $ git rebase @{-1}
 $ git branch -d @{-1}

我想不出一个快速的方法来做到这一点。这是一种方法。无论提交发生在多远,它都有效,但请注意 rebase 会吃掉沿途的任何合并。*

git checkout 447a1cb
<edit stuff>
git commit --amend
git checkout -
git rebase --onto @{-1} 447a1cb

请注意,我在上面的第一步和最后一步中明确使用了提交哈希 447a1cb;这当然可以用相对引用代替,例如 HEAD^ 只要在两个步骤中引用相同的提交。

以上解释:

  1. 直接签出要编辑的提交(注意:您将处于“分离的 HEAD”状态,这意味着此处的任何更改都不会影响您在此步骤之前签出的分支,直到你在步骤 5).
  2. 中做到了这一点
  3. 编辑您需要编辑的内容
  4. 用新的更改修改提交
  5. 检查之前检查过的内容,即分支如果有的话
  6. 将分支重新定位到 (4) 之前签出的提交,忽略 HEAD^(最后一次提交的第一个父级,即一次提交)和更早的提交。使用 --onto 将避免同时应用旧的提交,这可能会导致冲突或额外的提交。

更多信息请见 man git-rebase

虽然上述方法有效,但大多数时候我可能更喜欢交互式变基。


* 如果在您正在编辑的提交之后有合并,请考虑将 --preserve-merges 标志设为 git rebase(但请阅读 BUGS 部分 man git-rebase) --rebase-merges 标记为 git rebase,或者将 git replace --editgit filter-branch 结合使用。更多信息请见 man git-replaceman git-filter-branch.

您可以使用 sed 或任何其他命令作为 git rebase:

的临时编辑器
EDITOR='sed -i 1s/pick 447a1cb/edit 447a1cb/' git rebase -i f47adfa0

使其成为可重复使用的命令:

git config alias.edit-commit \
  '!f(){ EDITOR="sed -i 1s/pick/edit/" git rebase -i ""^; }; f'

然后:

git edit-commit 447a1cb
# make changes
git commit --amend
git rebase --continue