在不重新创建提交的情况下对之前的提交进行调整

问题描述

我曾经使用 gitx 来暂存更改以进行提交,但我已经切换到纯粹的终端工作流 + Fugitive.vim。不过,我真正想念 gitx 的一个功能是能够在之前的提交中进行调整。例如,如果在之前的提交中添加了某个部分,但不应该添加,则 gitx 可以很容易地提取该部分并修改之前的提交。

我目前进行此类更改的工作流程是:

  1. git show
  2. 复制提交信息
  3. git reset --soft HEAD^
  4. 使用 Fugitive 或 git add -i 进行我想做的任何更改
  5. git commit
  6. 粘贴之前复制的提交信息
  7. 确认

以前方便的两步过程现在变得非常麻烦。还有其他方法可以做到这一点吗?

git commit --amend -CHEAD --interactive 对我来说似乎很有希望,但它似乎根本不起作用。

解决方法

为了完成相同的任务,我使用以下方法:


# Find the starting commit where I need to place changes

git log --oneline --graph --decorate

# Ask for editing commit(s)

git rebase -i {{commit-hash-from-log-history}}

# Enter "edit" for commit(s) you want change,then save
# Add,Edit or Remove files

# Finalize editing

git rebase --continue

# Or,if you want to abort

git rebase --abort

请告诉我它是否也适合您。

,

git 命令行对编辑文件一无所知,因此您总是有两个步骤:进行更改,然后将该更改应用于某个提交。

如果您要修改的提交是分支上的最新提交,您可以使用 the options to git commit 中的两个:

--amend:通过创建一个新的提交来替换当前分支的提示......使用来自原始提交的消息作为起点,而不是一条空消息

--no-edit:在不启动编辑器的情况下使用选定的提交消息。例如, git commit --amend --no-edit 修改提交而不更改其提交消息。

如果你想修改更深入的历史提交,你需要使用 git rebase --interactive 并将针对提交的命令从“pick”更改为“edit”。然后你做同样的事情,但是一旦你完成,你运行 git rebase --continue 以便 git 在那个点之后重播更改