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^
只要在两个步骤中引用相同的提交。
以上解释:
- 直接签出要编辑的提交(注意:您将处于“分离的 HEAD”状态,这意味着此处的任何更改都不会影响您在此步骤之前签出的分支,直到你在步骤 5).
中做到了这一点
- 编辑您需要编辑的内容
- 用新的更改修改提交
- 检查之前检查过的内容,即分支如果有的话
- 将分支重新定位到 (4) 之前签出的提交,忽略
HEAD^
(最后一次提交的第一个父级,即一次提交)和更早的提交。使用 --onto
将避免同时应用旧的提交,这可能会导致冲突或额外的提交。
更多信息请见 man git-rebase。
虽然上述方法有效,但大多数时候我可能更喜欢交互式变基。
* 如果在您正在编辑的提交之后有合并,请考虑将 --preserve-merges
标志设为 git rebase
(但请阅读 BUGS 部分 man git-rebase) --rebase-merges
标记为 git rebase
,或者将 git replace --edit
与 git filter-branch
结合使用。更多信息请见 man git-replace 和 man 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
目前我需要做的事情:
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^
只要在两个步骤中引用相同的提交。
以上解释:
- 直接签出要编辑的提交(注意:您将处于“分离的 HEAD”状态,这意味着此处的任何更改都不会影响您在此步骤之前签出的分支,直到你在步骤 5). 中做到了这一点
- 编辑您需要编辑的内容
- 用新的更改修改提交
- 检查之前检查过的内容,即分支如果有的话
- 将分支重新定位到 (4) 之前签出的提交,忽略
HEAD^
(最后一次提交的第一个父级,即一次提交)和更早的提交。使用--onto
将避免同时应用旧的提交,这可能会导致冲突或额外的提交。
更多信息请见 man git-rebase。
虽然上述方法有效,但大多数时候我可能更喜欢交互式变基。
* 如果在您正在编辑的提交之后有合并,请考虑将 --preserve-merges
标志设为 git rebase
(但请阅读 BUGS 部分 man git-rebase)--rebase-merges
标记为 git rebase
,或者将 git replace --edit
与 git filter-branch
结合使用。更多信息请见 man git-replace 和 man 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