【问题标题】:How do I edit an incorrect commit message in Git without including any staged modifications?如何在不包含任何分阶段修改的情况下在 Git 中编辑不正确的提交消息?
【发布时间】:2013-11-28 12:52:10
【问题描述】:

如果我进行了一些更改,并且在此过程中注意到我之前的(和未推送的)提交消息中有错误,有没有办法修改提交 在我的分阶段更改中折叠?

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

  • --amend
  • --all(自动暂存),但没有'--none'
  • --message
  • --only(仅指定路径)
  • -- ...

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

简单的方法是先到reset,然后再到commit --amend,但这需要重复登台工作。或者,我可以提交我的分阶段更改,并通过 rebase 编辑不再是最新的提交消息,但这对于仅编辑一条消息来说似乎很尴尬和矫枉过正。

我认为stash save 也无济于事,因为stash 似乎无法保留分阶段更改和非分阶段更改之间的区别。 (除非可以stash 只发送已上演的内容?再说一次,我不知道该怎么做。)

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

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

【问题讨论】:

  • --amend --only 到底有什么问题?它似乎完全符合您的需要。

标签: git git-commit git-amend


【解决方案1】:

您可以使用 git-commit-treegit-reset 做到这一点:

git reset --soft `git commit-tree <tree-id> -m "new message" -p HEAD^`

&lt;tree-id&gt; 是 HEAD 的根树 id。您可以通过git cat-file -p HEAD获取它

【讨论】:

  • 你能像git reset --soft $(git commit-tree $(git cat-file -p HEAD | grep tree | awk '{print $2}') -m "new message" -p HEAD^)一样内联吗?
  • 我在下面添加了一些解释性说明。 stackoverflow.com/questions/20266734/#20270522(格式为单独的答案,但我接受此答案)
  • 如果你想要一个 ref 的树 id,附加 ^{tree},例如HEAD^{tree} 或只是一个冒号,HEAD:
【解决方案2】:

我认为 stash 应该记住什么是上演的,什么不是,也许你需要使用--no-keep-index

git stash --no-keep-index

【讨论】:

  • 感谢您的想法。我尝试了git stash --keep-index,然后是git stash,看起来很有希望。不幸的是,直到commit 之后才能调用第二个git stash pop。这对某些人来说可能已经足够了......
  • 哦,stashing 不会保留已暂存的未暂存的。
  • 实际上,如果你问我,我从不相信 stash,他们以前对我做了一些肮脏的伎俩,我宁愿先做一个git commit -m 'temp' 然后rebase 并重命名,然后git reset --soft 而不是比藏起来
【解决方案3】:

我想将此作为对@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" &gt; ci.txt

将旧的提交消息转储到ci.txt,然后可以对其进行编辑。可选地和替代地,可以编写全新的提交消息文件。

(3) $ editci.txt

然后

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

(4b) $git commit-tree ${tree-id} -m "&lt;new message&gt;" -p HEAD^

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

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

将新提交设置为当前 HEAD。

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

【讨论】:

    【解决方案4】:

    你可以继续你的工作,然后做一个交互式变基:

    git rebase -i
    

    在提交列表中,您看到所有要改写的提交将 pick 替换为 reword

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 2010-10-02
      • 1970-01-01
      • 2012-05-01
      • 2011-04-25
      • 2010-10-12
      • 2023-03-15
      • 2016-05-11
      • 2012-01-28
      相关资源
      最近更新 更多