我不小心搞错了分支。 如何删除该提交?
删除最近的提交,保留你所做的工作:
git reset --soft HEAD~1
删除最近的提交,破坏你所做的工作:
git reset --hard HEAD~1
如果您希望将该提交移动到另一个分支,请获取该提交的SHA
git rev-parse HEAD
然后切换当前支路
git checkout other-branch
然后选择提交到其他分支
git cherry-pick <sha-of-the-commit>
不要删除它:因为只有一个提交git就足够了。
但是如果你在错误的分支上提交了几次,这就是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重置——硬切,还可以用下面的命令:
git checkout -B <branch-name> <SHA>
事实上,如果你不关心签出,你可以将分支设置为任何你想要的:
git branch -f <branch-name> <SHA>
这是一种从分支中删除提交的编程方式,例如,为了将新的提交复制到分支中(使用rebase)。
假设您有一个与master断开连接的分支,因为您从其他位置获取了源并将其转储到分支中。
现在您有了一个应用更改的分支,让我们称其为“topic”。
现在你将创建一个主题分支的副本,然后将其重新基于位于分支"dump"中的源代码转储:
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
现在,您的更改将基于“dump”的起点重新应用到分支topic_duplicate中,但只应用自“master”以来发生的提交。所以你的改变,因为master现在重新应用在“dump”的顶部,但结果在“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”后进行选择。
我想说的是,如果你想要基于不同的祖先更新当前的“副本”分支,你必须首先通过git重置删除之前的“cherrypicsed”提交——hard <last-commit-to-retain>或git branch -f topic_duplicate <last-commit- retain>,然后通过重基或樱桃选择复制其他提交(从主主题分支)。
重基只适用于已经有提交的分支,所以每次需要重复主题分支时都需要重复主题分支。
采摘要容易得多:
git cherry-pick master..topic
所以整个序列将归结为:
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
当主题副本分支签出时。这将从当前副本中删除之前选择的提交,并在当前“转储”(不同的祖先)之上重新应用“topic”中发生的所有更改。这似乎是一种相当方便的方法,可以在“真正的”上游主服务器上进行开发,同时使用不同的“下游”主服务器来检查您的本地更改是否仍然适用于该主服务器。或者,您也可以生成一个diff,然后将其应用到任何Git源代码树之外。但是通过这种方式,您可以保持基于发行版的最新修改(修补)版本,而您的实际开发是针对真正的上游主版本。
为了证明:
Reset会让你的分支指向一个不同的提交(——hard也会检查出之前的提交,——soft会在索引中保留添加的文件(如果你再次提交,它会被提交),默认的(——mixed)不会检查出之前的提交(抹去你的本地更改),但它会清除索引(还没有为提交添加任何东西) 您可以强制一个分支指向不同的提交 你也可以在立即签出提交的同时这样做 重基工作在当前分支中的提交上 樱桃采摘意味着从不同的分支复制
希望这能帮助到一些人。我本来想重写一遍的,但是现在写不出来了。的问候。
我想知道为什么我找到的最好的答案只在评论里!(作者:丹妮丝,领先86票)
git reset --hard origin
此命令将同步本地存储库与远程存储库,从而消除您在本地所做的所有更改。 您还可以按照Cleary在评论中建议的那样,执行以下操作来获取您在原点中拥有的确切分支。
git reset --hard origin/<branch>
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别