在Git中编辑root提交?

13r*_*ren 307 git git-rebase git-amend git-commit git-rewrite-history

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

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*
Run Code Online (Sandbox Code Playgroud)

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

ecd*_*lma 527

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

git rebase -i --root
Run Code Online (Sandbox Code Playgroud)

  • 是否可以使用此命令重新绑定所有分支的根?似乎这样会将当前分支分离到新根上,所有其他分支将保留在旧根上 (2认同)
  • FWIW:我也希望将此视为公认的答案,特别是因为它与我一直以来最喜欢的“git”命令相匹配,用于在开发的早期阶段清理新项目的历史记录,即:“git rebase --interactive” --autosquash --autostash --root` (2认同)
  • @Leo您的评论是什么意思?我看不到第一部分和第二部分之间的链接-花一点时间与它有什么关系? (2认同)

CB *_*ley 263

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

# 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
Run Code Online (Sandbox Code Playgroud)

  • 我相信这应该是`git rebase --onto HEAD <sha1-of-root> master`. (22认同)
  • [ecdpalma的回答](http://stackoverflow.com/a/14630424/247696)下面更容易,更简单,有更多的选票,向下滚动人! (8认同)
  • 是的,确保它是`git rebase --onto HEAD <sha1-of-root>`master,其中`<sha1-of-root>`与`git checkout <sha1-of-root>`中使用的相同.否则,你将有2个'第一次提交'. (7认同)
  • 是的,但是你想要`git rebase`的<upstream>的_original_ root提交.`git rebase`在<branch>(`master`)中应用不在<upstream>中的提交; `HEAD`不在`master`中,所以你的版本试图应用所有`master`. (4认同)
  • @Cupcake:您是否测试过旧版本的命令?它应该工作正常.修改只是更改提交消息,因此旧的和新的root提交引入了完全相同的更改,因此会自动跳过旧的root提交.第二个`HEAD`确保考虑所有提交,并且我们可以使用rebase的两个参数版本移回master.请注意,这个答案早于rebase的`--root`选项的存在. (2认同)

小智 63

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

git rebase --interactive --root
Run Code Online (Sandbox Code Playgroud)

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

reword <root commit sha> <original message>
pick <other commit sha> <message>
...
Run Code Online (Sandbox Code Playgroud)

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

重新引用可以访问的所有提交<branch>,而不是使用<upstream>.这允许您在树枝上重新定义根提交.


jak*_*b.g 12

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

如果你正在创建一个repo,并且知道你将来会在其"第一次"实际提交之上进行变基,你可以通过在开头做一个明确的空提交来完全避免这个问题:

git commit --allow-empty -m "Initial commit"
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不是意味着,为了使这个工作,你需要有先见之明(或通灵)在项目的最开始做出空的提交*?对我来说这似乎是***非常情境***,而且一般***不实用***.你怎么看?如果我已经进行了100次提交会发生什么,我突然需要编辑根提交.在这种情况下,如果我在开始时没有进行那个空提交,这仍然可以工作吗? (3认同)
  • 在拥有100个根提交之后,可能根本不希望编辑根提交的消息。有时我碰巧只是想拥有一个git repo,做一些垃圾的提交,知道一旦达到某种可用状态,我就将它们压缩为一个,并重新编写消息。无论如何,现在我改变了主意,我认为第一次提交绝对最有用的事情是放置`.gitattributes`文件而不是执行空提交。 (2认同)