用Git改变项目的第一次提交?

我想在我的项目的第一次提交中改变一些东西,而不会丢失所有后续的提交。 有没有办法做到这一点?

我不小心列出了我的原始邮件在源代码中的评论,我想改变它,因为我从垃圾邮件索引GitHub垃圾邮件。

正如下面 ecdpalma所提到的, git 1.7.12+ (2012年8月)增强了git rebase的选项--root

现在可以使用“ git rebase [-i] --root $tip ”将所有导致“ $tip ”的历史重写到根提交。

这个新行为最初是在这里讨论的 :

我个人认为,“ git rebase -i --root ”应该不需要“ --onto ”就可以工作,甚至可以“编辑”历史上的第一个。
可以理解的是,没有人会打扰,因为在历史的开始之前,人们往往不是经常重写而不是其他的。

接下来是补丁 。


(原来的答案,2010年2月)

正如Git FAQ (以及这个问题 )中提到的,这个想法是:

  1. 创build新的临时分支
  2. 将其倒回到您想要使用git reset --hard进行更改
  3. 改变提交(这将是当前HEAD的顶部,你可以修改任何文件的内容)
  4. 在更改的提交之上重build分支,使用:

     git rebase --onto <tmp branch> <commit after changed> <branch>` 

诀窍是要确保您要删除的信息不会被稍后在文件中的其他位置再次提交。 如果您怀疑,那么您必须使用filter-branch --tree-filter来确保该文件的内容在任何提交中都不包含合理的信息。

在这两种情况下,您最终都会重写每个提交的SHA1,因此如果您已经发布了要修改其内容的分支,请小心。 除非你的项目还没有公开,而其他人没有把你要改写的提交的工作从工作中解放出来,否则你可能不应该这样做。

如1.7.12发行说明中所述 ,您可以使用

 $ git rebase -i --root 

git rebase -i允许您方便地编辑以前的任何提交, 除了根提交 。 以下命令显示如何手动执行此操作。

 # tag the old root, "git rev-list ..." will return the hash of first commit git tag root `git rev-list HEAD | tail -1` # switch to a new branch pointing at the first commit git checkout -b new-root root # make any edits and then commit them with: git commit --amend # check out the previous branch (ie master) git checkout @{-1} # replace old root with amended version git rebase --onto new-root root # you might encounter merge conflicts, fix any conflicts and continue with: # git rebase --continue # delete the branch "new-root" git branch -d new-root # delete the tag "root" git tag -d root 

如果你只想修改第一个提交,你可以尝试git rebase和修改提交,这是类似于这个post: 如何修改git指定的提交?

如果你想修改所有包含原始邮件的提交,filter-branch是最好的select。 有一个如何在Pro Git这本书上全局更改电子邮件地址的例子,你可能会发现这个链接有用http://git-scm.com/book/en/Git-Tools-Rewriting-History