如何无需外部编辑器仅通过git将代码片段从一个commit移动到另一commit
无需外部编辑器移动代码片段到指定commit
前置准备
执行git log --oneline查询并记录3个commit的短哈希:
- 存放错误代码的源commit哈希,记为
SRC_COMMIT - 需要接收代码的目标commit哈希,记为
DST_COMMIT - 早于上述两个commit的最近公共父commit哈希,记为
BASE_COMMIT
操作步骤
- 触发非交互式变基,定位到源commit进入编辑状态:
GIT_SEQUENCE_EDITOR="sed -i 's/^pick $SRC_COMMIT/edit $SRC_COMMIT/' git rebase -i $BASE_COMMIT
- 拆分源commit内容,分离需要保留的代码:
# 回退源commit,改动全部保留在工作区 git reset HEAD^
如果是保留整个文件的内容,直接执行git add 要留在源commit的文件路径;如果是拆分单文件内的部分代码片段,执行git add -p按提示交互式选取要保留的代码块即可。
提交保留的内容,直接复用原源commit的提交信息无需编辑:
git commit -C $SRC_COMMIT --no-edit
- 暂存待移动的代码,完成当前节点的变基:
# 暂存剩余待移动的代码 git stash push -m "move to target commit" # 继续完成当前变基流程 git rebase --continue
- 将暂存代码合并到目标commit:
再次触发非交互式变基,定位到目标commit进入编辑状态:
GIT_SEQUENCE_EDITOR="sed -i 's/^pick $DST_COMMIT/edit $DST_COMMIT/' git rebase -i $BASE_COMMIT
弹出暂存的待移动代码,追加到目标commit:
# 弹出暂存的代码改动 git stash pop # 暂存所有改动 git add . # 追加到目标commit,复用原提交信息无需编辑 git commit --amend --no-edit # 完成剩余变基流程 git rebase --continue
注意事项
- 该操作会修改提交历史,仅适用于未推送到远程公共分支的场景。如果已经推送到公共分支,操作前需和所有协作者确认,操作完成后需执行
git push -f强制推送更新后的分支。 - 变基过程中如果出现代码冲突,解决冲突后执行
git add 冲突文件路径,再执行git rebase --continue继续流程即可。
内容的提问来源于stack exchange,提问作者user12359309
相关产品推荐
相关产品推荐

