如何使用交互式变基将未提交的提交进行编辑?

3

我想使用交互式变基来编辑先前的提交记录,但是当我进入该提交记录的编辑模式时,所有文件都已提交。

我知道我可以进行更改并修改提交记录,但是我希望一开始就将所有更改未提交(已暂存或其他方式),以便我可以像在最初提交之前那样编辑它。这可能吗?

3个回答

6

假设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

这行代码的作用:

  • 不会像通常选择commit一样,而是执行git cherry-pick
  • git cherry-pick将"第二个"commit(请注意使用了相同的commit hash)应用于索引和工作树,预加载提交消息但不提交(--no-commit)
  • && false确保执行的命令“失败”,通过返回失败的退出代码。这迫使git rebase在此行后中断,让您“修复”问题,即现在您可以编辑提交
  • 完成编辑后,您可以再次git commit。由于git cherry-pick,编辑器将自动包含原始提交消息
  • 在提交提交并且索引再次干净之后,您可以继续使用git rebase --continue

谢谢你的回答,acran。出于好奇,你是在哪里学会在edit--todo文件中进行这样的操作的?我之前并不知道这是可以做到的。我尝试了你的方法:更改已经被暂存,但我只是取消了暂存并重新编辑了它们等等,然后在继续rebase时处理了合并冲突。效果还不错。 - BenKoshy
我是在哪里学到这个的呢?可能是多年来使用git和一些好奇心吧 :D 如果你更喜欢将所有更改都保持未暂存状态,你可以在这行代码中添加 git reset -- .git reset 将会取消暂存所有更改,-- . 是为了只重置文件但保留预加载的提交信息。 - acran
谢谢 @acran,这个很好地完成了任务。我会给你颁发奖励,感谢这位新成员的出色贡献。Git 2.23刚刚发布,可能不再需要使用git-restore来解决问题了。 - TheMeaningfulEngineer
我希望在每次提交时都能使用这个命令:GIT_SEQUENCE_EDITOR="sed -i 's/^pick \([[:digit:][:lower:]]\{7\}\).*/exec git cherry-pick --no-commit \1 \&\& false/'" git rebase --interactive main,它完美地运行了。 - pentavalentcarbon

2

在@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,否则将会弄乱初始提交。


有趣的例子,除了我的答案之外。+1 - VonC

1
你可以至少重置到上一个提交,添加所有内容并提交:然后您将能够再次设置提交消息。
 git reset @~
 git add .
 git commit --interactive

或者只执行 git commit,因为你已经添加了想要的内容。
这仍然会为您打开一个编辑器,让您再次输入提交消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接