Git交互式rebase,编辑特定提交而无需使用编辑器?

时间:2018-03-24 13:27:06

标签: git rebase

目前我需要这样做: 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)是否有一个命令我可以用来直接调用该状态?而不是必须通过上述程序?

3 个答案:

答案 0 :(得分:3)

我想不出一个快速的方法来做到这一点。这是一种方式。无论提交的时间有多远,它都可以正常工作,但请注意rebase将在此过程中使用任何合并。*

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

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

以上解释:

  1. 检查要直接编辑的提交(注意:您将进入&#34;分离的HEAD&#34;状态,这意味着此处的任何更改都不会影响您在此步骤之前检出的分支,直到你在步骤5)中发生
  2. 修改您需要修改的内容
  3. 使用新更改修改提交
  4. 查看以前签出的内容,即如果您有一个
  5. ,则分支
  6. 将分支重新引导到(4)之前签出的提交,忽略HEAD^(最后一次提交的第一个父级,即一次提交)及之前的提交。使用--onto将避免应用旧提交,这可能导致冲突或额外提交。
  7. man git-rebase的更多信息。

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

    * 如果在您编辑的提交后有合并,请考虑--preserve-merges标记为git rebase(但请阅读 BUGS 部分man git-rebase),或改为使用{ {1}}与git replace --edit结合使用。有关man git-replaceman git-filter-branch的更多信息。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用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 "$1"^; }; f'

然后:

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