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

问题描述 投票:116回答:8

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

在做出任何事情之前的修改是什么?此修订版是否有名称或标记?

git repository commit git-commit
8个回答
228
投票

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

git update-ref -d HEAD

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

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

git rebase -i --root

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

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

39
投票

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

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

如果您只想重新开始,请删除.git存储库,并使用git init创建另一个存储库


8
投票

Check out to a temporary branch:

git checkout --orphan TEMP_BRANCH

Add all the files:

git add -A

Commit the changes:

git commit -am“初始提交”

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


6
投票

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


2
投票

另一种方法是:

  1. 结账到你想要保留的分支(说dev)git checkout dev
  2. 现在,删除要重置git branch -D master的分支
  3. 现在,创建一个名为git checkout --orphan master的空分支

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


2
投票

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

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

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

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

rm -rf .git/

0
投票

如果您刚刚提交但未推送它,那么只需删除.git目录和git init ...


0
投票

问题的答案取决于是否:

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

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

要做第二个(从分支中移除第一个和唯一的提交,而单独留下其他分支)则更难。或者,至少,如果您希望它发生并且将更改反映在GitHub或Bitbucket中,则会更加困难。有(据我所知)Git中没有任何方法可以推送或强制推送没有提交的分支。而且(再次,据我所知)根本没有办法在GitHub或Bitbucket中创建一个没有提交的新的空分支。所以你基本上必须创建一个新的存储库,以便创建一个完全空的分支,然后根据@ user1338062的答案添加你想要的分支(包括你想要的提交)。

所以我希望这个答案澄清一些可能不明显的东西 - 需要采取两种不同的方法,对于两种不同的(或多或少合理的)方案,这两种方案都是你可能想要做的事情,按顺序排列完全掌握做OP的要求。

© www.soinside.com 2019 - 2024. All rights reserved.