Git,取消第一次提交的最新提交

Git,取消第一次提交的最新提交,git,Git,我创建了我的项目的第一个提交,但是忘记忽略node_模块 我试图取消提交。但是,它会返回以下信息(抱歉,虚拟机没有复制/粘贴功能): 正如你在上面的截图中所看到的,它无法达到我的预期。(红线用于隔离命令和帮助阅读) 考虑到最近的提交是第一次提交,我如何取消它?您不需要删除提交。您可以删除节点模块,编辑.gitignore,并修改对上一次提交的更改(这也是您的第一次提交): 如果您坚持要删除提交,则可以运行 git update-ref -d HEAD git push -f git rese

我创建了我的项目的第一个提交,但是忘记忽略node_模块

我试图取消提交。但是,它会返回以下信息(抱歉,虚拟机没有复制/粘贴功能):

正如你在上面的截图中所看到的,它无法达到我的预期。(红线用于隔离命令和帮助阅读)


考虑到最近的提交是第一次提交,我如何取消它?

您不需要删除提交。您可以删除节点模块,编辑
.gitignore
,并修改对上一次提交的更改(这也是您的第一次提交):

如果您坚持要删除提交,则可以运行

git update-ref -d HEAD
git push -f

git reset
命令失败的原因是
git reset
实际上并没有删除提交。相反,它将您从当前分支名称标识的当前提交移动到同一分支上的上一次提交。但只有一个承诺!它没有以前的提交。因此,没有其他地方可去

在这种情况下,您可以通过运行
git rm--cached node_modules
从索引中删除所有
node_modules
文件来更新索引,同时将它们单独保留在工作树中,然后运行
git commit--amend
--amend
所做的是修改提交操作。它不向当前分支添加提交,而是将当前提交推到一边,以便新的提交取而代之

当您有多个提交时,这在图像上更有意义。例如,如果您有三个具有三个不同哈希ID的提交,我们将在这里分别称为
A
B
C
,您可以这样绘制它们:

A--B--C   <-- master
请注意,现有的提交
C
仍保留在存储库中。没有明显的方法可以找到它:
git log
不会显示它,因为
git log
现在以
D
开始,这是
master
上的最后一次提交,它会返回到
B
,然后返回到
A

不过,在本例中,没有以前的提交。您现有的提交集将绘制为:

A   <-- master
同样,没有明显的方法可以找到您刚刚“替换”的提交。它仍然存在,并且在默认情况下会保留至少30天,以防你决定要它回来,但在大多数情况下,它只是不存在了。最终,你的Git会放弃它,因为它没有名字,任何人都无法找到它

但是,如果您已经将commit
A
发送给其他一些Git,例如使用
Git push origin master
,那么该Git仍然有commit
A
的副本。您必须让他们用新的和改进的
B
替换他们的
A
。为此,通常需要使用
git-push--force-origin-master
git-push--force与lease-origin-master一起使用

如果您还没有将commit
A
发送到其他一些Git存储库,那么这些都不是必需的

     C  [abandoned]
    /
A--B--D   <-- master
A   <-- master
A

B   <-- master