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

这个问题在这里已经有了答案:

  • 编辑Git中的根提交? 5个答案

  • 正如下面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(和这个SO问题)中提到的那样,这个想法是:

  • 创建新的临时分支
  • 将它倒回到你想要使用git reset --hard进行更改的提交中
  • 更改该提交(它将成为当前HEAD的顶部,并且您可以修改任何文件的内容)
  • 在更改的提交上重建分支,使用:

    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 (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
    
    链接地址: http://www.djcxy.com/p/23435.html

    上一篇: Change first commit of project with Git?

    下一篇: What are the benefits of learning Vim?