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

我想在我的项目的第一次提交中改变一些东西,而不丢失所有后续提交。有什么办法可以做到吗?

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

174246 次浏览
如果你只想修改第一次提交,你可以尝试git rebase并修改提交,这类似于这篇文章: # EYZ0 < / p >

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

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

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

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

我个人认为“git rebase -i --root”应该在不需要“--onto”的情况下工作,让你“编辑”甚至是历史上的第一个 没有人费心是可以理解的,因为人们很少在历史开始的时候重写。< / p >

# EYZ0。


(原答案,2010年2月)

正如在Git常见问题解答(和这个所以问题)中提到的,这个想法是:

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

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

The trick is to be sure the information you want to remove is not reintroduced by a later commit somewhere else in your file. If you suspect that, then you have to use filter-branch --tree-filter to make sure the content of that file does not contain in any commit the sensible information.

In both cases, you end up rewriting the SHA1 of every commit, so be careful if you have already published the branch you are modifying the contents of. You probably shouldn’t do it unless your project isn’t yet public and other people haven’t based work off the commits you’re about to rewrite.

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 (i.e. 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

正如在1.7.12发布说明中所述,您可以使用

$ git rebase -i --root