在Git中编辑root提交?

时间:2010-01-22 18:21:35

标签: git git-rebase git-commit git-rewrite-history amend

有办法从以后的提交中更改消息:

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

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

5 个答案:

答案 0 :(得分:503)

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

git rebase -i --root

答案 1 :(得分:249)

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

# 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

答案 2 :(得分:59)

要展开ecdpalma's answer,您现在可以使用--root选项告诉rebase您要重写root / first commit:

git rebase --interactive --root

然后根提交将显示在rebase TODO列表中,您可以选择编辑或重新编写它:

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

这是来自the Git rebase docs--root的解释(强调我的):

  

重新启动从<branch>可到达的所有提交,而不是使用<upstream>限制它们。 这允许您在分支上重新定义根提交

答案 3 :(得分:11)

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

如果您正在创建一个repo,并且事先知道您将在其“第一次”实际提交之后进行变基,那么您可以通过在开头做一个明确的空提交来完全避免这个问题:

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

然后才开始做“真正的”提交。然后,您可以轻松地在标准方式的基础上进行重新设置,例如git rebase -i HEAD^

答案 4 :(得分: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