删除未推送的 git 提交,但保留所有本地工作

Delete unpushed git commits, but keep all local work

我的本地目录中有一些大文件,包含在我认为阻止我的 git 推送继续进行的提交中:

Counting objects: 194, done.
Delta compression using up to 4 threads.
Connection to bitbucket.org closed by remote host.
fatal: The remote end hung up unexpectedly
Compressing objects: 100% (190/190), done.
error: pack-objects died of signal 13
error: failed to push some refs to 'myrepo'

至少,我相当确定是文件大小导致推送失败。我只想删除提交的记录,这样我就可以返回并为这些文件添加一个。git忽略,再次提交并推送。

A git 状态给出:

On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

是否可以删除提交,同时保留我的工作目录中的所有更改?我正在努力寻找一个似乎不涉及将我的存储库重置为 master 较早提交的答案(我想保留我最近的所有本地工作!)。任何建议将不胜感激。

运行:

git reset origin/master 

这将基础提交移回 origin/master,但保留工作树原样。从这一点开始,您可以添加 .gitignore 并进行新的提交。

该提交仍将存在于您的本地存储库中,但不会成为您新提交的祖先,因此在您进行推送时不会传输。

您可以使用 git reset --soft <commit id> 来达到这个目的。要快速返回 3 次提交,您可以使用 HEAD^3 代替提交 ID。

此命令会将提交状态重置为更早的日期,而不会更改您的任何文件。这将产生这样的效果,即您所做更改的所有文件都是已更改的已删除提交,然后您可以在没有大文件的情况下再次提交它们。

来自man git-reset

--soft

Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.