如何删除未推送的git commit?

这篇博客讨论了如何在git中删除未推送的提交,包括如何保留工作、删除提交、移动提交到其他分支以及使用git reset和rebase等高级操作。同时也提供了详细的操作步骤和示例。
摘要由CSDN通过智能技术生成

我不小心犯了错误的分支。 如何删除该提交?


#1楼

删除最近的提交,并保留已完成的工作:

git reset --soft HEAD~1

删除最近的提交, 破坏您已完成的工作:

git reset --hard HEAD~1

#2楼

进行git rebase -i FAR_ENOUGH_BACK并删除不需要的提交行。


#3楼

如果要将该提交移至另一个分支,请获取有问题的提交的SHA

git rev-parse HEAD

然后切换当前分支

git checkout other-branch

然后cherry-pick other-branch

git cherry-pick <sha-of-the-commit>

#4楼

不要删除它:仅执行一次git cherry-pick就足够了。

但是,如果您在错误的分支上进行了几次提交,那么git rebase --onto

假设您有:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

,然后可以标记master并将其移动到您想要的位置:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

,将y分支重置在原本应位于的位置:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

,最后移动您的提交(重新应用它们,进行新的提交)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

#5楼

供您参考,我相信您不仅可以使用git reset --hard,还可以使用以下命令从当前分支“硬切”提交:

git checkout -B <branch-name> <SHA>

实际上,如果您不关心签出,则可以使用以下方法将分支设置为所需的任意值:

git branch -f <branch-name> <SHA>

例如,这是从分支删除提交的一种编程方式,以便将新提交复制到分支(使用rebase)。

假设您有一个与主服务器断开连接的分支,因为您已从其他位置获取了源并将其转储到该分支中。

现在,您在其中应用了更改的分支中,我们将其称为“主题”。

现在,您将创建主题分支的副本,然后将其重新基于位于分支“ dump”中的源代码转储:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

现在,您的更改将基于“转储”的起​​点重新应用到分支topic_duplicate中,但仅应用自“ master”以来发生的提交。 因此,自从母版以来所做的更改现在重新应用在“转储”的顶部,但结果以“ topic_duplicate”结尾。

然后,您可以通过执行以下操作将“ dump”替换为“ topic_duplicate”:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

或搭配

git branch -M topic_duplicate dump

或者只是丢弃转储

git branch -D dump

清除当前的“ topic_duplicate”之后,也许您也可以选择。

我要说的是,如果您要基于其他祖先更新当前的“重复”分支,则必须首先通过执行git reset --hard <last-commit-to-retain>删除先前的“樱桃精选”提交git reset --hard <last-commit-to-retain>git branch -f topic_duplicate <last-commit-to-retain> ,然后通过变基或摘樱桃来复制其他提交(从主主题分支)。

变基仅在已经具有提交的分支上起作用,因此,每次需要这样做时,都需要复制主题分支。

采摘更容易:

git cherry-pick master..topic

因此,整个序列将归结为:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

当您的主题重复分支已签出时。 这将从当前重复项中删除先前选择的提交,而只是将当前“转储”(不同祖先)顶部“主题”中发生的所有更改重新应用。 在使用不同的“下游”母版检查您的本地更改是否仍然还适用于此时,将开发基于“真实”上游母版似乎是一种相当方便的方法。 或者,您可以只生成一个差异,然后将其应用到任何Git源代码树之外。 但是通过这种方式,您可以保留基于发行版本的最新修改(修补)版本,而实际开发却与真正的上游母版相对。

因此,仅演示一下:

  • reset将使您的分支指向另一个提交(--hard还会签出上一个提交,--soft将添加的文件保留在索引中(如果再次提交则将提交),而默认文件(--mixed)不会签出上一个提交(清除本地更改),但会清除索引(尚未添加任何提交内容)
  • 您可以强制分支指向其他提交
  • 您可以在立即检查该提交的同时执行此操作
  • 对当前分支中存在的提交进行重新计算
  • 摘樱桃意味着从其他分支复制

希望这对某人有帮助。 我本来打算重写它,但现在无法管理。 问候。


#6楼

我不知道为什么我找到的最佳答案只是在评论中! 由丹妮丝以86票赞成

git reset --hard origin

此命令将使本地存储库与远程存储库同步,从而消除您对本地存储库所做的所有更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值