如何删除git中的第一个提交?

如何删除git中的第一个提交?,git,repository,commit,git-commit,Git,Repository,Commit,Git Commit,我很好奇如何删除git中的第一个提交 提交任何东西之前的修订是什么?此修订版是否有名称或标记?在第一次提交之前没有任何内容,因为每次提交都引用一个父提交。这使得第一次提交非常特殊(孤立提交),因此无法引用以前的“状态” 因此,如果您想要修复提交,您可以简单地git commit--amend:这将修改提交,而无需创建另一个提交 如果您只想从头开始,请删除.git存储库,并使用git init创建另一个存储库如果您想保留其他分支,但例如,让主分支重新开始,而不必与其他分支共享历史,实现这一点的一个

我很好奇如何删除git中的第一个提交


提交任何东西之前的修订是什么?此修订版是否有名称或标记?

在第一次提交之前没有任何内容,因为每次提交都引用一个父提交。这使得第一次提交非常特殊(孤立提交),因此无法引用以前的“状态”

因此,如果您想要修复提交,您可以简单地
git commit--amend
:这将修改提交,而无需创建另一个提交


如果您只想从头开始,请删除
.git
存储库,并使用
git init
创建另一个存储库如果您想保留其他分支,但例如,让
主分支重新开始,而不必与其他分支共享历史,实现这一点的一个安全方法是创建一个新的存储库,并将其内容推送到旧版本中:

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster
这将在旧存储库中创建
newmaster
分支,其历史记录与任何其他分支都不相同。当然,您也可以使用git push-f
覆盖
主文件

如果要销毁所有分支和所有现有内容,只需运行

rm -rf .git/

您可能只想编辑第一次提交(因为git repo中总是有第一次提交)。考虑使用<代码> Git提交-修改-重置作者<代码>,而不是通常的代码> Git提交-修改< /C> > < /P> < P>您可以做的另一种方式是:

  • 签出到要保留的分支(比如dev)
    git签出dev
  • 现在,删除要重置的分支
    git branch-D master
  • 现在,创建一个同名的空分支
    git checkout--orphan master

  • 当然,所有这些都取决于您的用例,但是如果您有多个分支,那么删除
    .git
    目录就没有意义了。

    对于我来说,最安全的方法是使用
    update ref
    命令:

    git update-ref -d HEAD
    
    git rebase -i --root
    
    它将删除命名的引用
    ,因此它将重置(轻轻地,您不会丢失您的工作)当前分支的所有提交

    如果要将第一次提交与第二次提交合并,可以使用
    rebase
    命令:

    git update-ref -d HEAD
    
    git rebase -i --root
    
    最后一种方法是创建一个孤立分支,一个具有相同内容但没有任何提交历史记录的分支,并在其上提交新内容:

    git checkout --orphan <new-branch-name>
    
    git签出--孤立
    
    如果您刚刚提交了它,但没有推送它,那么只需删除.git目录,然后再次删除
    git init

    问题的答案取决于:

    • 您希望删除分支上的第一个也是唯一一个提交(同时保留其他分支不变),或者

    • 您希望删除某个分支上的第一次提交,同时“保留”后续提交(以及其他分支)

    第二个相对简单。基本上,你必须重新定位到根——这里的大多数答案都是关于如何做到这一点的

    执行第二个操作(从一个分支中删除第一个也是唯一的提交,而不使用其他分支)更难。或者,至少,如果您希望它发生,并且希望更改反映回GitHub或Bitbucket中,那么就更难了。据我所知,在Git中根本没有办法推送或强制推送没有提交的分支。而且(同样,就我所见)根本没有办法在GitHub或Bitbucket中创建一个新的空分支,而不进行提交。因此,您必须创建一个新的存储库,以便创建一个完全空的分支,然后按照@user1338062的回答添加回您想要的分支(包括您想要的提交)


    因此,我希望这个答案澄清了可能不明显的问题——需要采取两种不同的方法,针对两种不同(或多或少合理)的情况,这两种情况都是您可能希望能够做到的,为了完全掌握操作的要求。

    我一直在寻找一种方法来撤销回购中的所有git提交,就像它们从未发生过一样

    重新定基将在一定程度上起作用。然而,第一次(按时间顺序是最早的git提交)总是会有问题,因为它没有父级,所以会出错

    这些答案对我来说都不能完全解决这个问题。但经过大量的搜索和尝试和错误,我发现这是可行的

    git update-ref -d HEAD
    git push origin master -f
    

    希望这对你有帮助。祝你度过愉快的一天。

    从git开始,你应该知道修改是没有意义的。您可以谈论提交或它们的相对SHA。还有,你为什么要这么做?第一次提交是所有内容的基础。您可以将几个提交挤在一起,包括第一次提交,它将成为新的第一次提交,但是删除第一次提交(或者删除除最后一次提交以外的任何提交)意味着什么呢?@Shahbaz是的,这是最好的方法,请看下面的例子:您可以使用
    git rebase-i--root
    。有关详细信息,请参阅以下SO答案:的可能副本具有删除当前分支的根提交的正确解决方案:
    git filter branch--父筛选器“sed's/-p/'”HEAD
    此答案不正确:有一种方法可以恢复到第一次提交之前的状态。请参见下文。如果最初配置错误,则
    --amend
    也不会正确更新作者。这正是我所需要的,所以我使用了被接受的答案,然后做了一个新的承诺。我真的不明白为什么有人认为没有答案,即使显然没有(我把这个短语放在这里,因为答案很旧)。这不是被接受的答案,这太糟糕了。同样糟糕的是,谷歌上的大多数点击都或多或少地说“你不能撤销第一次提交”。这对我起了作用。谢谢感谢@danielpops对您的支持!很高兴看到我回答了