如何在Git中编辑不正确的提交消息而不包括任何分阶段的修改?

时间:2013-11-28 12:52:10

标签: git git-commit amend

如果我已经进行了一些更改,并且在此过程中发现我之前(和未推送)提交消息中的错误,是否有一种方法可以在我的分阶段更改中修改commit 而不用折叠?

我在git-commit的手册页上看到了执行相关功能的各种选项,但没有任何组合似乎产生了所需的效果:

  • --amend
  • --all(自动上台),但没有“--none
  • --message
  • --only(仅指定路径)
  • --< no-more-options> ...

带有空文件列表的选项--only(我不知道如何指定)几乎是正确的,但在任何情况下都可能删除更改提交(我不想要)。

天真的方法是reset然后是commit --amend,但这需要重复暂存工作。或者,我可以提交我的分阶段更改,并通过rebase编辑不再最新的提交消息,但这对于编辑消息来说似乎很尴尬和过度。

我认为stash save也无法提供帮助,因为stash似乎无法保持分阶段和非分阶段更改之间的区别。 (除非stash只能上演的内容?再次,我不知道该怎么做。)

这个问题与此有关 How to modify existing, unpushed commits? 答案中有很多有用的信息,但这个稍微不同的问题没有得到解决。

感激地收到任何提示;感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用git-commit-treegit-reset

执行此操作
git reset --soft `git commit-tree <tree-id> -m "new message" -p HEAD^`

<tree-id>是HEAD的根树ID。您可以通过git cat-file -p HEAD

获取

答案 1 :(得分:1)

我认为存储应该记住上演的内容和不上的内容,也许你需要使用--no-keep-index

git stash --no-keep-index

答案 2 :(得分:1)

我想将此作为对@ npcode的answer的评论,但无法正确格式化。以下内容很大程度上基于这个答案......

这是一个更细粒度的解释,并允许编辑原始提交消息:

(1)$ git cat-file -p HEAD | grep "^tree\b" | awk '{print $2}'

打印步骤(4)中所需的HEAD ${tree-id}的根树ID

任选地:

(2)$ git log -1 --format="%B" > ci.txt

转储ci.txt中的旧提交消息,然后可以对其进行编辑。可选地,或者可以写入全新的提交消息文件。

(3)$ edit ci.txt

然后

(4a)$ git commit-tree ${tree-id} -F ci.txt -p HEAD^

(4b)$ git commit-tree ${tree-id} -m "<new message>" -p HEAD^

分别从文件或直接在命令行上创建带有提交消息的新提交对象。 这些命令中的任何一个 打印步骤(5)中所需的新提交的标识${commit-id}

(5)$ git reset --soft ${commit-id}

将新提交设置为当前HEAD。

@npcode和@Daniel结合步骤(1),(4b)和(5)。

答案 3 :(得分:0)

您可以继续工作并在之后进行互动式改造:

git rebase -i

在您要查看的提交列表中,将pickreword替换为您要重新提交的所有提交。