在Git中编辑根提交?


328

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

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

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



特别是:在git filter-branch --msg-filter
fork0

Answers:


285

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

# 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

23
我相信应该如此git rebase --onto HEAD <sha1-of-root> master
安德鲁(Andrew)

5
是的,但是您想要<upstream> 的原始根提交git rebasegit rebase在<branch>(master)中应用不在<upstream>中的提交;HEAD不在master,因此您的版本尝试应用所有master
安德鲁(Andrew)

7
是的,请确保它是git rebase --onto HEAD <sha1-of-root>master,在<sha1-of-root>中使用相同的位置git checkout <sha1-of-root>。否则,您将有2个first commit
安迪

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

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

567

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

git rebase -i --root

文献资料


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

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

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

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

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

66

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

git rebase --interactive --root

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

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

这是--root来自Git rebase文档的说明(重点是我的):

重新设置所有可从中到达的提交<branch>,而不是使用来限制它们<upstream>这使您可以在分支上重新建立根提交


12

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

如果您要创建存储库,并且预先知道将来会基于它的“第一个”实际提交而重新建立基础,则可以通过在开始时进行明确的空提交来完全避免此问题:

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

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


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

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

4

您可以使用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在这种情况下,该选项的确是关键,它也能够处理root提交。
sschuberth 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.