关于git:如何在新初始化的存储库中撤消提交(未推送)


How to undo a commit in freshly initialized repository (not pushed)

本问题已经有最佳答案,请猛点这里访问。

我初始化了一个repo,但现在想撤销第一个(并且只)提交。

由于新创建的repo指向一个尚不存在的ref,因此这三种取消提交所有错误的解决方案

所以我的问题是,我如何撤销尚未被推送的回购协议中的承诺,因此还没有得到REF?

注:我也试过,没有成功。


注意:从技术上讲,这不会撤消提交,但同样好的是,空存储库几乎没有功能。要真正清空存储库,请参阅下面的。

git commit --amend应该工作。下面是一个演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git init
Initialized empty Git repository in .../.git/
$ echo test changing root commit > README
$ git add README
$ git commit -m initial
[master (root-commit) 90e83ae] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ echo different readme > README
$ git add README
$ git commit --amend --no-edit
[master 8e159b1] initial
 Date: Sat Mar 2 21:00:53 2019 -0800
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ git log --all --decorate --oneline --graph
* 8e159b1 (HEAD -> master) initial

请注意,"不同的自述"是这个新的根提交的内容:

1
2
3
4
5
6
7
8
9
$ git show --pretty=oneline
8e159b1f0d397b31cb1be5168e77ba200269c62a (HEAD -> master) initial
diff --git a/README b/README
new file mode 100644
index 0000000..ef0411a
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+different readme

如果在新的根提交中有您不想要的文件,请使用git rm(可能与--cached一起)删除它们。

如果您真的想删除master分支及其单个提交,然后像通常在新的空存储库中那样在master分支上,那么它需要额外的几个步骤,至少只要您想使用正常(而不是管道)命令。步骤如下:

  • git branch -m master delete:将master分支重命名
  • git checkout --orphan master:回到不存在的master分支上。
  • git branch -D delete删除不需要的分支
  • git read-tree --empty:清空当前索引
  • 工作树不受这个过程的干扰。


    如果您只有一个要删除的提交,则只需删除记录提交日志ID的.git/logs/refs/heads/master文件。还可以删除记录master分支提交的.git/refs/heads/master文件。您还可能希望删除存储最后一个提交ID的.git/logs/HEAD文件。删除这些引用之后,对象最终将被垃圾收集。

    但是,也许再次删除整个.git目录和git init目录更容易、更快。