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

时间:2020-03-22 11:23:12

标签: git

我创建了项目的第一个提交,但忘了忽略node_modules。

我尝试this solution取消提交。但是,它返回了这个信息(抱歉,没有复制/粘贴功能的虚拟机):

enter image description here

如您在上面的屏幕快照中所见,它无法完成我所期望的。 (红线用于隔离命令并帮助阅读)

考虑到这是第一次提交,如何取消最新提交?

2 个答案:

答案 0 :(得分:3)

您不需要删除提交。您可以删除节点模块,编辑.gitignore并将更改修改为最后一次提交(在您的情况下也是第一次提交):

# changes
git commit --amend
git push -f

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

git update-ref -d HEAD
git push -f

答案 1 :(得分:1)

您的git reset命令失败的原因是git reset实际上没有删除提交。相反,它会将您从当前分支名称所标识的当前提交移动到同一分支上的上一个提交。但是只有一次提交!它没有先前的提交。因此,无处可去。

Maroun said一样,您可以更新索引-在这种情况下,通过运行git rm --cached node_modules从索引中删除所有node_modules个文件,而将它们保留在工作树中,然后运行git commit --amend--amend所做的是修改提交操作。 代替添加到当前分支中,而将当前提交推到另一端

当您进行多个提交时,从图形上来说更有意义。例如,如果您有三个提交(在这里我们将分别称为ABC使用三个不同的哈希ID),则可以这样绘制它们:

A--B--C   <-- master

在创建git commit --amend时,使用C会将D推开:

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

请注意,现有提交C保留在您的存储库中。根本没有找到查找的明显方法:git log将不会显示它,因为git log现在以D开头,现在是 last 在您的master上提交,然后向后退回到B,然后退回到A

但是,在这种情况下,没有先前的提交。您现有的一组提交将被绘制为:

A   <-- master

当Git推开A来插入B时,您会得到:

A

B   <-- master

同样,没有明显的方法来找到刚刚“替换”的提交。它仍然存在,并且默认情况下会至少保留30天,以防万一您决定要回去,但是对于大多数用途来说,它已经消失了。最终,您的Git会删除它,因为它没有任何人可以找到的名字。

但是,如果您已将提交A发送给某些 other Git,例如使用git push origin master,则 Git仍然具有副本提交A。您必须让他们用新的和经过改进的A替换其B。为此,通常需要使用git push --force origin mastergit push --force-with-lease origin master

如果您还没有将提交A发送到其他Git存储库,则没有必要。