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

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


当前回答

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

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

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

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

rm -rf .git/

其他回答

另一种方法是:

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

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

这个问题的答案取决于:

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

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

To do the second (removing the first and only commit from a branch whilst leaving other branches alone) is harder. Or, at least, especially harder if you want it to happen and for the change to be reflected back in GitHub or Bitbucket. There is (as far as I can tell) no way at all in Git to push or force push a branch with no commits. And there is also (again, as far as I can see) no way at all to create a new, empty branch with no commits on it in either GitHub or Bitbucket. So you essentially have to create a new repository in order to create a completely empty branch, and then add back the branches which you want (including the commits which you want) - as per @user1338062's answer.

所以我希望这个答案能澄清一些可能不太明显的问题——有两种不同的方法需要采取,针对两种不同的(或多或少合理的)场景,这两种都是你可能想要能够做到的事情,以便完全掌握做OP要求的事情。

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

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

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

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

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

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

git update-ref -d HEAD

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

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

git rebase -i --root

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

git checkout --orphan <new-branch-name>

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

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

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

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

rm -rf .git/