1

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

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

  • --amend
  • --all(自动阶段),但没有' --none'
  • --message
  • --only(仅指定路径)
  • --<没有更多选项>...

带有空文件列表的选项--only(我不知道如何指定)几乎是正确的,但无论如何这可能会从上次提交中删除更改(我不想要)。

天真的方法是 toreset和 then commit --amend,但这需要重复登台工作。或者,我可以提交我的分阶段更改,并通过 a 编辑不再是最新的提交消息rebase,但这对于仅编辑消息来说似乎是尴尬和矫枉过正的。

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

这个问题与 如何修改现有的、未推送的提交有关? 答案中有很多有用的信息,但是这个稍微不同的问题没有得到解决。

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

4

4 回答 4

2

你可以用git-commit-treeand做到这一点git-reset

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

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

于 2013-11-28T13:06:45.987 回答
1

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

git stash --no-keep-index
于 2013-11-28T13:11:32.883 回答
1

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

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

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

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

可选:

(2) 美元git log -1 --format="%B" > 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 "<new message>" -p HEAD^

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

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

将新提交设置为当前 HEAD。

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

于 2013-11-28T16:06:20.240 回答
0

您可以继续您的工作,然后进行交互式变基:

git rebase -i

在提交列表中,您看到替换pickreword所有要改写的提交。

于 2013-11-28T13:15:29.537 回答