我如何删除unpushed git提交?
我无意中犯了错误的分支。 我如何删除该提交?
删除最近的提交,保持你所做的工作:
git reset --soft HEAD~1
删除最近的提交, 破坏你所做的工作:
git reset --hard HEAD~1
不要删除它:只有一个提交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
做一个git rebase -i FAR_ENOUGH_BACK
并放下你不想要的提交。
如果您想将该提交移到另一个分支,请获取提交的SHA
git rev-parse HEAD
然后切换当前分支
git checkout other-branch
cherry-pick
other-branch
的承诺
git cherry-pick <sha-of-the-commit>
为了您的参考,我相信您可以“硬切”从您当前的分支中提交,不仅使用git reset –hard,还使用以下命令:
git checkout -B <branch-name> <SHA>
事实上,如果你不关心检查,你可以设置分支到任何你想要的:
git branch -f <branch-name> <SHA>
这将是一个程序化的方式来移除分支提交,例如,为了复制新的提交(使用rebase)。
假设你有一个从主站断开的分支,因为你已经从其他位置获取源并将其转储到分支中。
你现在有一个你已经应用了更改的分支,我们称之为“主题”。
您现在将创build主题分支的副本,然后将其重定位到分支“dump”中的源代码转储:
git branch topic_duplicate topic git rebase --onto dump master topic_duplicate
现在,您的更改将基于“dump”的起点重新应用于分支topic_duplicate中,但仅限于自“master”以来发生的提交。 所以你的改变,现在主人现在重新应用“转储”,但结果最终在“topic_duplicate”。
然后你可以用“topic_duplicate”代替“dump”:
git branch -f dump topic_duplicate git branch -D topic_duplicate
或与
git branch -M topic_duplicate dump
或者只是丢弃转储
git branch -D dump
也许你也可以在清除当前的“topic_duplicate”之后进行樱桃select。
我想说的是,如果你想更新基于不同祖先的当前“重复”分支,你必须首先通过执行git reset --hard <last-commit-to-retain>
删除以前的“cherrypicked”提交git reset --hard <last-commit-to-retain>
或git branch -f topic_duplicate <last-commit-to-retain>
,然后通过重新绑定或樱桃select复制其他提交(从主要主题分支)。
重新激活只适用于已经有提交的分支,所以你需要复制你的主题分支,每次你想这样做。
Cherrypicking更容易:
git cherry-pick master..topic
所以整个序列将归结为:
git reset --hard <latest-commit-to-keep> git cherry-pick master..topic
当你的主题重复的分支已经签出。 这将从当前的副本中删除先前挑选的提交,并且只是重新应用当前“转储”(不同的祖先)顶部的“主题”中发生的所有更改。 在使用不同的“下游”主站来检查您的本地更改是否仍然适用于“真正的”上游主站时,似乎是一个相当方便的方法。 或者,您可以生成一个diff,然后将其应用于任何Git源代码树之外。 但是通过这种方式,您可以保留基于发行版本的最新修改(修补版)版本,而您的实际开发是针对真正的上游主控。
所以只是为了演示:
- 重置将使你的分支指向一个不同的提交(–hard还检出了以前的提交, – 软件保持索引中添加文件(如果你再次提交,将提交),默认( – 混合)不会检查以前的提交(擦除本地更改),但会清除索引(尚未添加任何提交)
- 你可以强制一个分支指向不同的提交
- 您可以立即检查该提交
- 重新分配工作在当前分支提交
- 樱桃采摘意味着从不同的分支复制
希望这有助于某人。 我的意思是重写这个,但现在我不能pipe理。 问候。
如果您有代码的备份(包括.git
文件夹),请从最新的代码库中删除.git文件夹。 将旧的.git
文件夹复制到最新的代码库。 执行git pull
。
注意:只有当您的时间不够用,请使用这个解决scheme,并且困惑了很多。