246

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

提交任何事情之前的修订是什么?此修订版是否有名称或标签?

4

9 回答 9

455

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

git update-ref -d HEAD

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

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

git rebase -i --root

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

git checkout --orphan <new-branch-name>
于 2015-09-24T15:55:31.933 回答
44

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

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

如果您只想重新开始,请删除.git存储库,然后使用git init

于 2012-06-06T09:27:31.373 回答
13
# 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
于 2017-07-28T10:47:37.553 回答
12

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

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

这些答案都没有为我解决这个问题。但是经过大量的搜索和反复试验,我发现这行得通!

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

希望这对您有所帮助。祝你有美好的一天。

于 2019-10-22T05:20:22.040 回答
6

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

于 2013-05-02T20:27:48.527 回答
3

您可以做的另一种方法是:

  1. 结帐到您要保留的分支(例如 dev)git checkout dev
  2. 现在,删除要重置的分支git branch -D master
  3. 现在,创建一个同名的空分支git checkout --orphan master

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

于 2013-08-08T16:57:08.907 回答
2

如果您想保留其他分支,但是例如让master分支重新开始,而没有其他分支的共同历史记录,实现此目的的一种安全方法是创建一个新存储库,并将其内容推送到旧存储库中:

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

这会newmaster在旧存储库中创建分支,其历史记录与任何其他分支都不相同。当然,你也可以mastergit push -f.

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

rm -rf .git/
于 2012-06-06T09:31:12.107 回答
1

如果您刚刚提交但没有推送它,那么只需删除.git目录并git init再次...

于 2018-08-27T11:19:42.437 回答
0

问题的答案取决于是否:

  • 您想删除分支上的第一个且仅提交(同时保留其他分支),或者是否

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

其中第二个相对简单。您基本上必须重新定位到 root - 这里的大多数答案都是关于如何做到这一点的。

做第二个(从一个分支中删除第一个也是唯一一个提交,同时不理会其他分支)更难。或者,至少,如果您希望它发生并且让更改反映在 GitHub 或 Bitbucket 中,则尤其困难。(据我所知)在 Git 中根本没有办法推送或强制推送没有提交的分支。而且(再次,据我所见)根本没有办法在 GitHub 或 Bitbucket 中创建一个没有提交的新的空分支。因此,您基本上必须创建一个新存储库才能创建一个完全空的分支,然后添加回您想要的分支(包括您想要的提交) - 根据@user1338062 的回答。

因此,我希望这个答案能够澄清可能不明显的问题 - 对于两种不同(或多或少合理)的场景,您可能希望能够按照顺序执行两种不同的方法完全掌握 OP 的要求。

于 2019-02-27T17:45:04.997 回答