有一些方法可以从以后的提交中更改消息:

 git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*
 


如何更改提交第一次提交的消息(没有父项)?

评论

另请参见stackoverflow.com/questions/11987914/…

特别是:在git filter-branch --msg-filter
脚本中使用GIT_COMMIT环境变量
另请参见stackoverflow.com/a/2309391/264607

#1 楼

假设您有一棵干净的工作树,则可以执行以下操作。

 # checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master
 


评论


我相信这应该是git rebase --on HEAD master。

–安德鲁(Andrew)
2012年5月9日20:58

对,但是您想要git rebase的的原始root提交。 git rebase应用(master)中的提交,而不是中的提交; HEAD不在master中,因此您的版本尝试应用所有master。

–安德鲁(Andrew)
2012年5月16日18:41

是的,确保它是git rebase --on到HEAD 主节点,其中与git checkout 中使用的相同。否则,您将有2个首次提交。

–安迪
2012年6月18日19:01



@Cupcake:您是否测试了旧版本的命令?它应该工作正常。修改仅更改提交消息,因此旧根提交和新根提交进行的更改完全相同,因此旧根提交将自动跳过。第二个HEAD确保考虑所有提交,并且我们可以使用rebase的两个参数版本移回master。请注意,此答案早于用于重新设置基准的--root选项。

– CB Bailey
13年7月15日在7:06

ecdpalma在下面的回答更容易,更简单并且拥有更多投票,请向下滚动人员!

– Flimm
2015年10月2日13:37

#2 楼

从Git 1.7.12版本开始,您现在可以使用

git rebase -i --root


文档

评论


是否可以使用此命令重新设置所有分支的根?似乎这样会将当前分支分离到新的根上,而所有其他分支将保留在旧根上

– woojoo666
15年3月22日在7:29

@ woojoo666,然后必须将分支重新建立到新的根目录上。照常。

– Berkus
15年4月24日在12:13

@Atcold如果没有上游根目录则不起作用

–凯
16年5月20日在5:31

警告:我错误地认为这将成为我检出分支的根,但是加载所有提交然后重新设置所有基础需要花一些时间。

–狮子座
16年5月25日在17:44

@Leo您的评论是什么意思?我看不到第一部分和第二部分之间的链接-花一点时间与它有什么关系?

–boycy
17年11月29日在12:29

#3 楼

为了扩展ecdpalma的答案,您现在可以使用--root选项告诉rebase您要重写根目录/第一次提交:

git rebase --interactive --root


然后将显示根提交在rebase TODO列表中,您可以选择对其进行编辑或重命名:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...


这是来自Git rebase文档的Q4312079q的解释(重点是我的):


调整所有从--root可以到达的提交,而不是用<branch>限制它们。这使您可以在分支上重新建立根提交。


#4 楼

只是为了提供更高评分的答案的替代方法:

如果您正在创建存储库,并且预先知道您将来会在其“首次”实际提交的基础上重新存储,则可以通过在开头进行显式的空提交来完全避免此问题:

git commit --allow-empty -m "Initial commit"


,然后才开始执行“实际”提交。然后,您可以轻松地以标准提交方式为基础,例如git rebase -i HEAD^

评论


这不是意味着,为了使它起作用,您需要在项目的一开始就具有先见之明(或有意识)进行空的提交吗?对我来说,这似乎是极端情况,而且通常不切实际。你怎么看?如果我已经进行了100次提交,然后突然需要编辑根提交,会发生什么情况。如果我一开始没有做空的提交,在这种情况下这仍然会起作用吗?

–user456814
2014年7月20日在6:58



在拥有100个根提交之后,可能根本不希望编辑根提交的消息。有时我碰巧只是想拥有一个git repo,做一些垃圾的提交,知道一旦达到某种可用状态,我就会将它们压缩成一个,然后重新编写消息。无论如何,现在我改变了主意,我认为第一次提交绝对最有用的是放置.gitattributes文件而不是执行空提交。

–jakub.g
2014年7月20日在23:51



#5 楼

您可以使用git filter-branch

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit


评论


我正在使用filter-branch更改author / committer,在这种情况下---all选项确实是能够处理根提交的关键。

–sschuberth
2014年2月6日在8:04