git commit --amend # for the most recent commit
git rebase --interactive master~2 # but requires *parent*
如何更改提交第一次提交的消息(没有父项)?
#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
–安德鲁(Andrew)
2012年5月9日20:58
对,但是您想要git rebase的
–安德鲁(Andrew)
2012年5月16日18:41
是的,确保它是git rebase --on到HEAD
–安迪
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
评论
另请参见stackoverflow.com/questions/11987914/…特别是:在git filter-branch --msg-filter
脚本中使用GIT_COMMIT环境变量
另请参见stackoverflow.com/a/2309391/264607