如何在git中删除第一次提交?

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

做任何事情之前的修改是什么?这个修订版有名称或标签吗?

124559 次浏览

在第一次提交之前什么都没有,因为每次提交都引用父提交。这使得第一次提交非常特殊(孤儿提交),因此没有办法引用前一个“状态”。

所以如果你想修复提交,你可以简单地git commit --amend:这将修改提交而不创建另一个。

如果你只是想从头开始,删除.git存储库,并使用git init创建另一个存储库

如果你想保留其他分支,但例如让master分支重新启动而不向其他分支提供公共历史记录,一个安全的方法是创建一个新的存储库,并将其内容推送到旧的存储库中:

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

这将在旧的存储库中创建newmaster分支,其历史记录与任何其他分支都不相同。当然,你也可以用git push -f重写master

如果您想销毁所有分支和所有现有内容,那么只需运行即可

rm -rf .git/

您可能只想编辑您的第一次提交(因为在git repo中总是有第一次提交)。考虑使用git commit --amend --reset-author代替通常的git commit --amend

另一种方法是:

  1. 签出到你想要保留(比如dev) git checkout dev的分支
  2. 现在,删除你想要重置git branch -D master的分支
  3. 现在,创建一个具有相同名称git checkout --orphan master的空分支

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

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

git update-ref -d HEAD

它将删除命名的引用HEAD,因此它将是当前分支的重置(轻轻地,你不会失去你的工作)所有的提交

如果你想合并第一次提交和第二次提交,你可以使用rebase命令:

git rebase -i --root

最后一种方法是创建一个孤儿分支,一个具有相同内容但没有任何提交历史的分支,并在其上提交你的新内容:

git checkout --orphan <new-branch-name>
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH


# Add all the files:
git add -A


# Commit the changes:
git commit -am "Initial commit"


# Delete the old branch:
git branch -D master


# Rename the temporary branch to master:
git branch -m master


# Finally, force update to our repository:
git push -f origin master

如果你只是提交了它,但没有推送它,那么只需再次删除.目录和git init……

这个问题的答案取决于:

  • 你想要删除一个分支上的第一个AND ONLY提交(同时保留其他分支),或者是否

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

第二种方法相对简单。本质上,你必须重新基于根-这里的大多数答案都是关于如何做到这一点。

第二种(从一个分支中删除第一个和唯一的提交,同时保留其他分支)更难。或者,至少,如果你想让它发生,并让变化反映在GitHub或Bitbucket中,尤其困难。(据我所知)在Git中根本没有办法在没有提交的情况下推送或强制推送一个分支。还有(再次,据我所知)根本没有办法在GitHub或Bitbucket中创建一个新的、没有提交的空分支。因此,为了创建一个完全空的分支,您实际上必须创建一个新的存储库,然后添加您想要的分支(包括您想要的提交)——根据@user1338062的回答。

所以我希望这个答案澄清了什么可能不是很明显-有两种不同的方法需要采取,对于两种不同的(或多或少合理的)场景,这是这两个的事情,你可能想要能够做到,以便完全掌握做什么OP要求。

我正在寻找一种方法来撤销所有的git提交从一个回购,就像他们从来没有发生过。

调整基准在一定程度上会起作用。但是,第一次(按时间顺序来看,最早的git提交)总是会有问题,因为它没有父节点,所以会出错。

这些答案都不能完全解决我的问题。但经过大量的搜索和试错,我发现这个工作!

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

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