如果我已经进行了一些更改,并且在此过程中发现我之前(和未推送)提交消息中的错误,是否有一种方法可以在我的分阶段更改中修改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? 答案中有很多有用的信息,但这个稍微不同的问题没有得到解决。
感激地收到任何提示;感谢。
答案 0 :(得分:2)
您可以使用git-commit-tree
和git-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
在您要查看的提交列表中,将pick
与reword
替换为您要重新提交的所有提交。