撤销最后一次提交并推送

23

同时学习GIT和GitKraken。我在一个文件aa.cpp中做了小的更改,借助GitKraken进行了提交和推送到远程仓库。突然间,我发现我已经推送了整个项目目录中的所有文件,这让我很不满意。

现在我需要从仓库中删除不需要的文件。我想要删除远程仓库中最近一次的推送记录并尝试重新进行提交和推送。如何使用GIT命令删除最后一次提交?如何使用GitKraken实现相同的操作?


阅读此答案,一旦您删除所需的提交,只需推送到远程即可。 - CodeWizard
3个回答

37

如果您已经推送了此提交,则有可能其他人已经拉取了该分支。在这种情况下,重写您的分支历史记录是不可取的,您应该撤销此提交:

git revert <SHA-1>
git push origin branch

这里的<SHA-1>是你想要删除的提交哈希值。要查找此哈希值,只需在分支上键入git log并检查第一条记录。

使用 git revert 实际上会创建一个镜像图,该图与您想要删除的提交相反。这是撤销公共分支上的提交的首选方法,因为它仅将新信息添加到分支中。

如果您确定您是唯一使用此分支的人,则有另一种选择:

git reset --hard HEAD~1

随后是

git push --force origin branch

但是只有在没有其他人分享这个分支的情况下,您才应该使用此选项。


2
一个稍微更好的 --force 版本是 --force-with-lease。这将比较远程仓库与您的本地源副本,并且如果自从您上次获取以来有其他人向该分支推送了提交,则不会覆盖它。 - Michael

7
我的做法是输入git status,这会让我们确认当前所在的分支,然后执行以下操作:
git log

然后,您会看到类似于这样的内容:
commit aa09a82fb69af2d1aebde51d71514f7a03c3a692
Author: User <user@useremail.com>
Date:   Fri Nov 4 15:36:22 2016 -0400

    Fix issue with vertical scroll being forced

commit 411771837efe3ed555395e77fd35105a500ab758
Author: User <user@useremail.com>
Date:   Thu Nov 3 15:50:42 2016 -0400

    Add user notifications

commit f43b262f4e02b5a7268280e1230d44e36d1e547b
Author: User <user@useremail.com>
Date:   Thu Nov 3 12:11:00 2016 -0400

    All your base are belong to us

所以,这告诉我们commit aa09a82f是你的最后一个提交,commit 41177183是它之前的一个提交,那么:
git reset --hard 41177183

这让我们回到了那个提交,保留了远程备份。再次运行 git status,确保一切准备就绪,以进行双重推送(我个人非常执着于验证当前分支,特别是在同时处理多项任务时):

git push origin :<branch_name>
git push origin <branch_name>

现在,你应该已经准备就绪了,但最好还要做以下检查:

git fetch --all --prune
git branch -av

该功能可以清理分支列表,并显示本地和远程分支以比较提交信息。

另外,如果与团队合作,请确保他们在继续之前知道此事。您不希望在删除最后一个提交并推送之前,他们在其端拉取或推送分支。


0

我希望你正在一个单独的分支上工作,而不是主分支(如果你使用git-flow,则为develop分支)。对于我的示例,我将使用my-broken-branch作为分支名称;)

我的步骤如下:
删除远程分支,我们稍后会推送更新版本。

git push origin :my-broken-branch

接下来从本地分支中删除最后一次提交。HEAD^1指的是比当前早一次的提交。

git reset HEAD^1

现在,继续添加您需要的文件并像往常一样提交。最后将您的分支推送到远程。它将在那里重新创建该分支,没有人需要知道已更改的提交。

git push origin my-broken-branch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接