【问题标题】:How to remove the first commit in git?如何删除 git 中的第一个提交?
【发布时间】:2012-06-10 07:08:45
【问题描述】:

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

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

【问题讨论】:

  • 从 git 开始,你应该知道修订是没有意义的。您可以谈论提交或它们的相关 SHA。另外,你为什么要这样做?第一次提交是一切的基础。您可以将几个提交压缩在一起,包括第一个提交,它成为新的第一个提交,但是甚至删除第一个提交(或删除除最后一个提交之外的任何提交)意味着什么?
  • @Shahbaz 是的,这是最好的方法,例如:ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
  • 您可以使用git rebase -i --root。有关详细信息,请参阅以下 SO 答案:stackoverflow.com/questions/2246208/…
  • This answer有删除当前分支的root commit的正确解决方案:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD

标签: git repository commit git-commit


【解决方案1】:

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

git update-ref -d HEAD

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

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

git rebase -i --root

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

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

【讨论】:

  • 这不是公认的答案太糟糕了。谷歌上的大多数点击或多或少都说“你无法撤消第一次提交”,这也太糟糕了。这对我有用。谢谢!
  • 感谢@danielpops 的支持!很高兴注意到我在 3 年后回答了这个问题。与此同时,Git 也在不断发展。
  • 我使用了 rebase,将第二次提交标记为“squash”,然后执行 --force push to origin。谢谢!
  • git update-ref -d HEAD 是删除所有历史记录的最安全方法,而不仅仅是初始提交。
  • 我做到了,它删除了我添加到第一次提交中的所有文件。伤心。至少没多少
【解决方案2】:

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

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

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

【讨论】:

  • 这个答案不正确:有一种方法可以恢复到第一次提交之前的状态。请参阅下面的tzi's answer
  • --amend 如果最初配置错误,也不会正确更新作者。这就是我所需要的,所以我使用了接受的答案,然后只是做了一个新的提交。
  • 我真的不明白有人在什么基础上得出结论没有答案,即使显然没有(我把这句话放在这里是因为答案很老了)。
【解决方案3】:
# 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

【讨论】:

  • 不是答案:问题是“如何删除第一次提交”,而不是“如何删除除最后一次提交之外的所有内容”。
  • 我正在寻找这个。谢谢!
  • 这个答案是从here复制过来的。
  • 对我来说,我想摆脱 bitbucket 中的 .gitignore 文件,因为它阻止了我第一次从本地 repo 推送到 bitbucket。我通过使用 git push -f origin master 强制它来解决它。现在回想起来,我想我也可以通过在我的本地仓库中添加一个 .gitignore 来解决它
【解决方案4】:

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

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

这些答案都没有完全解决我的问题。但经过大量搜索和反复试验后,我发现它可以工作!

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

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

【讨论】:

  • 为了让任何阅读此答案的人清楚: 这会删除每个提交,但 OP 只想删除对 repo 所做的第一个提交;不要运行它来删除第一个提交,因为它会删除所有提交。
  • 我在运行上面的命令时也遇到了错误“错误:src refspec Master 不匹配任何错误:未能将一些引用推送到
【解决方案5】:

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

【讨论】:

  • 不是答案:问题想删除第一个提交,而不是修改最后一个提交的属性。
  • @peterh-ReinstateMonica 澄清:可以在交互式变基期间修改提交以完全更改其内容,但也需要提供 --reset-author 以更改作者。这样,您可以完全按照自己的喜好替换第一个提交。另见 CharlesB 的回答。
【解决方案6】:

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

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

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

【讨论】:

  • 执行此操作后,您必须在推送之前删除远程分支。否则,当你尝试推送时,你会遇到这个错误:! [rejected] master -> master (non-fast-forward) - error: failed to push some refs to 'git@github.com:r1/r2.git' - 提示:更新被拒绝,因为你当前分支的尖端是后面 - 提示:它的远程对应物。在再次推送之前集成远程更改(例如提示:'git pull ...')... - 如果您执行 git pull 所有提交都会返回。
  • @dxvargas yust do git push -f 强制更新远程分支。
【解决方案7】:

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

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

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

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

rm -rf .git/

【讨论】:

  • 不是答案: OP 想要删除第一个提交,而不是使用当前工作树作为初始提交来启动新的 git 存储库。
  • @peterh 我同意 git rebase --root 可能是 OP 想要的,但考虑到这个答案有两个赞成票,我会避免删除它,以防有人仍然认为它相关。
  • 我认为这个答案是完全相关的——如果你想删除某个分支中的第一个提交,而 is 只有一个提交! (但是您还希望将其他提交保留在其他分支中;并且您还希望这样做以使更改最终出现在 Bitbucket 或 Github 中,而不仅仅是在本地。)我相信这个答案是做到这一点的一种方法,并且我认为这可能是这里唯一的方法。 (那是因为——据我所知——没有办法强制将没有提交的本地分支推送到有一些提交的远程分支上。)
【解决方案8】:

如果您刚刚提交但未推送,则只需删除 .git 目录和 git init 再次...

【讨论】:

  • @peterh 是的。您假设(我认为)OP 的问题是要删除第一个提交但保留后续提交。另一种可能性(我认为它与 OP 的问题完全匹配——并且这个答案 is 是一个答案)是想要从分支中删除第一个且唯一的提交,将其恢复为完全空的。
  • @MikeBeaton 你是对的。我删除了我的评论,但随后我需要投票以结束这个问题,因为这个问题不清楚。请注意,虽然只有我得到了这个评论,但在我身后有 40000 名访问者,其中很大一部分人在 google 上发现了这个问题 - 他们没有得到他们想要的。
  • 这似乎很极端。删除问题?难道不能(完全很好地)争辩说,对于一个完全合理的问题的完整答案是需要采取两种不同的方法,这取决于是否……等等? (我的意思是,我,一方面,想知道当它不是唯一的提交时如何删除第一个提交,以及当它时如何删除第一个提交> 唯一的提交。这当然不是很明显,而且确实取决于具体的实现细节,事实上,在每种情况下都需要非常不同的方法。)
【解决方案9】:

问题的答案取决于是否:

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

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

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

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

所以我希望这个答案能澄清可能不明显的问题 - 对于两种不同(或多或少合理)的场景,您需要采取两种不同的方法,这两种情况都是可能希望能够做到,以便完全掌握 OP 要求的操作。

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 2019-09-25
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2013-08-11
    • 2013-06-29
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多