我想使用交互式变基来编辑先前的提交记录,但是当我进入该提交记录的编辑模式时,所有文件都已提交。
我知道我可以进行更改并修改提交记录,但是我希望一开始就将所有更改未提交(已暂存或其他方式),以便我可以像在最初提交之前那样编辑它。这可能吗?
我想使用交互式变基来编辑先前的提交记录,但是当我进入该提交记录的编辑模式时,所有文件都已提交。
我知道我可以进行更改并修改提交记录,但是我希望一开始就将所有更改未提交(已暂存或其他方式),以便我可以像在最初提交之前那样编辑它。这可能吗?
假设git rebase --interactive
给了你这个列表:
pick 3d15626 first
pick 7911b8b second
pick 60d94b4 third
如果您现在想要编辑第二次提交的未提交状态,可以像这样更改行:
pick 3d15626 first
exec git cherry-pick --no-commit 7911b8b && false
pick 60d94b4 third
这行代码的作用:
git cherry-pick
git cherry-pick
将"第二个"commit(请注意使用了相同的commit hash)应用于索引和工作树,预加载提交消息但不提交(--no-commit
)&& false
确保执行的命令“失败”,通过返回失败的退出代码。这迫使git rebase
在此行后中断,让您“修复”问题,即现在您可以编辑提交git commit
。由于git cherry-pick
,编辑器将自动包含原始提交消息git rebase --continue
在@VonC的回答上进行扩展,以下是一个情景示例:
mkdir git_example
cd git_example
git init
echo first > first
git add first
git commit -m "initial"
git tag initial
echo "How do I see this change while editing in interacive rebase" > second
git add second
git commit -m "second"
echo third > third
git add third
git commit -m "third"
git rebase -i initial
e 66127f1 second
pick 70c0b50 third
git reset HEAD~
git add .
git commit
# NOT commit --amend
# The commit message will be empty, that's ok
git rebase --continue
有一件事情让我有点困惑:
重置后,请执行commit
而不是commit --amend
,否则将会弄乱初始提交。
git reset @~
git add .
git commit --interactive
或者只执行 git commit
,因为你已经添加了想要的内容。
这仍然会为您打开一个编辑器,让您再次输入提交消息。
git reset -- .
。git reset
将会取消暂存所有更改,-- .
是为了只重置文件但保留预加载的提交信息。 - acranGIT_SEQUENCE_EDITOR="sed -i 's/^pick \([[:digit:][:lower:]]\{7\}\).*/exec git cherry-pick --no-commit \1 \&\& false/'" git rebase --interactive main
,它完美地运行了。 - pentavalentcarbon