在我的主分支中,我在本地执行了一个git merge some-other-branch,但从未将更改推到原始主。我不是有意合并,所以我想撤销它。合并后做git status的时候,我得到的信息是:
1 2
| # On branch master
# Your branch is ahead of 'origin/master' by 4 commits. |
根据我发现的一些指示,我试着跑步
但现在我收到了git status的消息:
1 2
| # On branch master
# Your branch is ahead of 'origin/master' by 5 commits. |
我不希望我的分支机构在任何数量的承诺方面领先。我该怎么回到这一点?
- 如果你需要保留历史,换句话说,有一个变化,任何人从你或你已经推动它某处使用解决方案尤里乌沙科夫回答下面!
- 请取消选择当前的得票答案,这是不安全的(正如许多人指出的),尽管仍在收集选票。对我来说,"MBO"看起来是最好的,尽管它的得分要少得多。
- 如果您需要保留历史,请使用下面的Yuri解决方案!(只需添加到@sedrik comment的链接)
- 相关:恢复到以前的Git提交。
- 这是直接从GitHub获得的一个很好的资源:如何撤消和Git有关的任何内容
- Git-三棵树的故事(头、索引和工作树用一种非常有用的方式解释):重置去神秘化
- 还有一个简单的任务被git搞得很困难。Git开发人员应该在其SDLC循环中使用堆栈溢出作为反馈。1200万人应该表示Git的工作流程出了严重的问题。他们需要雇佣一个用户体验专家,因为他们显然不能自己去做。
使用git reflog检查合并前的承诺(git reflog将是比git log更好的选择)。然后您可以使用以下方法重置它:
1
| git reset --hard commit_sha |
还有另一种方法:
它将使你返回1个承诺。
请注意,任何已修改和未提交/未显示的文件都将重置为未修改状态。为了不让他们改变藏匿或见下面的--merge选项。
正如@velmont在他的回答中建议的,在这个直接案例中使用:
1
| git reset --hard ORIG_HEAD |
可能会产生更好的结果,因为它应该保留您的更改。ORIG_HEAD将直接指向合并发生之前的提交,因此您不必自己寻找它。
另一个技巧是使用EDOCX1开关(5)而不是EDOCX1开关(8),因为它不会不必要地重置文件:
1
| git reset --merge ORIG_HEAD |
--merge
Resets the index and updates the files in the working tree that are different between and HEAD, but keeps those which are different between the index and working tree (i.e. which have changes which have not been added).
- 我不认为这会(总是?)工作——"合并前一个"将是从另一个分支合并进来的最新提交——它不会是当前分支上最新的提交。正确的?(这可能是git log默认选择显示的结果——可能有不同的git log或git reflog输出可用于此操作)
- 我想这可能取决于你们是否合并。
- 在我的例子中,Git日志显示了合并提交,并列出了合并后导致合并提交的两个父提交。我使用Git日志来确定列出的父提交中哪些属于我合并到当前分支中的分支,然后重置为其他提交(因为合并之前该提交必须是当前分支的头)。我会谨慎使用HEAD~#符号,因为您可能不知道合并带来了多少提交。
- @约翰巴赫是对的。在git log输出中,您需要查看两个父提交。一个是分支中的最新提交,一个是合并到的分支中的最新提交。您希望对合并到的分支的父级提交ecx1(2)。
- @johnbachir:只要"合并"不是一个真正的快速前进,它将导致一个新的提交,在日志的顶部,并且这个提交有两个父母(如果您进行八达通合并,则超过2个父母)。如果删除这一个合并提交,那么从合并中传入的所有旧提交也将消失。为了安全起见,在重置之后,Git会告诉您新的头在哪里:"head is now at 88a04de"。我总是看这个,以确保我最终达到了我预期的目标。我的项目使用一个标准的分支命名方案来保持记忆。
- 我发现有用的是查看"git reflog"并查找我在master中所做的最后一次提交。那么做git reset --hard 。
- 我认为,如果是FF合并,最好是使用如下内容:git reset--keep master@1_
- git branch -a -v将向您显示所有本地和远程分支及其sha,因此如果您想匹配,请使用sha作为远程/主服务器。
- 也许这个警告应该进入答案本身:总是避免重写git历史!
- 使用head~n不适用于大n,而查找commit hash对于大n来说是一件痛苦的事情。
- 如果合并是最后一次状态更改,那么git reset --hard HEAD@{1}也会起作用,否则使用git reflog来查找所需的sha或修订引用。另见man gitrevisions。
- 你可以不做手工工作,而做我下面答案中的一行,在没有手动位的情况下总是可以工作的。
- @维尔蒙特:你没注意到的是,我的答案现在是4(四)岁。提醒我:从那时起Git已经发展了多少?是的,我会更新答案,因为你是正确的:)
- @Marcingil Orig_Head至少存在于2009年),也就是5年前。
- @但远不是——合并;)不管怎样,你的回答很酷。
- 不要重设Git——硬。您将丢失代码。
- "git reset--合并orig头"刚丢失了大量更改:-
- 除回顾历史外,git reset --hard还将不可逆转地放弃任何局部修改。git reset --keep重置历史,同时保留本地更改(如果有),更安全。
- 我做得更糟了,我没有注意就改变了来源。幸运的是解决了!——--- git reset --hard [sha-commit-before-merge] git push [origin] [branch] --force——来源
- 您也可以执行git reset --hard origin/master,而不是指定commit sha。
- +用于Git重置——硬Orig_头
- @马辛吉尔,你能不能更新一下答案,告诉我你会丢失Git重置的代码——很难?或者让git重置——合并答案的顶部,而不是结尾?我刚刚丢了一些零钱。它们相对来说是微不足道的,但对于下一个人来说,它们可能不是。
- @Skypecakes:好吧,我假设如果有人想做"撤销"——人们希望一些更改被恢复/丢失。不管怎样,我很好奇这个场景,如果您丢失了更改,您是如何执行重置的。只应删除合并提交本身,而不应删除其他内容。
- @我丢失的代码(在我看来)与撤销无关。这是一组从未提交过更改的已修改文件。我已经坐了一个月左右的变化;还不需要,但将来可能有用。在git重置之后,这些更改就消失了。这些更改的文件都没有参与合并(或者在合并操作期间我会得到错误)。我一直在各个分支之间移动,而这些更改并没有提交,Git似乎从来都不关心,所以它突然删除了它们,这让我很惊讶。
- @Skypecakes为您丢失的代码感到抱歉,但是坐在一个已更改且未提交的代码上一个月(甚至在本地,而不是推送)对我来说真的是难以置信。如果你还没有预料到重置可以做什么,我强烈建议你读一下Git的书。不管怎样,我可以添加一个警告。
- @感谢您添加了警告!我不是要道歉,就像我说的,对我来说没什么大不了的。但对其他人来说可能是。谢谢你的建议,我会在有机会的时候读一下Git的书。
- 这是直接从GitHub获得的一个很好的资源:如何撤消和Git有关的任何内容
- 请先威胁Orig-head方法,它更可能是人们想要的
- "Git重置——硬orig-head"实际上可能不会保留您的更改。也许最好提醒一下。
假设您的本地主机不在源站/主机之前,您应该能够
1
| git reset --hard origin/master |
那么你当地的master分公司应该和origin/master一模一样。
- @卡特,这不是最好的答案。在合并之前,源站/主服务器可能会比本地主服务器早一些提交,在这种情况下,这可能无法给出所需的结果。
- @德鲁瓦·萨加尔是的,但是只要吉特不说你落后了,而且你不去接电话,你就应该没事了。
- 这很好,但是如果您进行了远程自动合并(例如,GitHub上的合并请求),那么您需要重置为提交(接受的答案)。
- 谢谢!如果(并且只有当)您有一个远程存储库,这是完美的。
- 如果没有远程参考,我怎么做?,git reflog是否找到我之前的合并位置,然后git reset --hard HEAD@{some_number}工作?
- 不,这不是这个问题的完美答案,见"假设"条款。MBO的回答实际上涵盖了这种情况,而合并并不是唯一的本地提交。
- 是的,如果你读到他问题的最后一句话,这是最好的答案:I don't want my branch to be ahead by any number of commits. How do I get back to that point?,似乎他想回到原点/主点。
- 再一次,也许这个警告应该进入答案本身:总是避免重写git历史!
- 我的回答也一样,但更安全。:)你不需要所有"假设"的东西。
- 这是直接从GitHub获得的一个很好的资源:如何撤消和Git有关的任何内容
- git reset——硬原点/
见Git手册第4章和Linus Torvalds的原始帖子。
要撤消已推送的合并,请执行以下操作:
1
| git revert -m 1 commit_hash |
如Linus所说,如果您再次提交分支,请确保恢复还原。
- ^--这里唯一正确的答案是如何在不破坏历史记录的情况下恢复合并。如果您使用共享回购,这一点很重要。
- 为什么这个答案没有更多的赞成票?
- 这并没有被更多地否决,因为从未推动过更改,所以没有理由将意外合并添加到历史记录中。本地删除并继续。
- 恢复一个没有被推动的承诺在历史上看起来很难看,并且使之更加混乱。如果你还没有推它,把你的头向后移几下更有意义,然后推。
- 记住要检查你是否回到了正确的分支(选项M)
- "这并没有得到更多的支持,因为……"——不过,对于像我这样的人来说,因为我们/已经/推动了更多的承诺,这是非常宝贵的。
- @完美主义者同意了:)有一种愿望可以把这个答案转移到另一个问题上——(也许有?)
- 有关还原的详细信息:链接
- 要确保此还原有效,可以执行git diff hash1 hash2,其中hash1是提交的还原,hash2是试图返回其状态的旧提交。无输出=成功!通过多次执行此操作,我可以回滚多个提交,首先恢复最近的合并并向后工作。吉特迪夫告诉我,我最终进入了我想要的状态。
- 注意,这并不能真正解决原始海报的问题。原来的海报已经使用了git revert -m 1 。问题是,这样做并不能消除他所做的意外合并(而且还没有推动)。其他涉及硬重置的答案更适合于原始海报的问题。
- @纸杯蛋糕:给贾斯汀的评论投赞成票。他大约3年前就已经解释过了。
- 我无意中合并到了错误的分支,直到后来有几个人推送了提交,我才注意到。只是我需要的。
- 为了澄清@petterhietavirta的评论,如果您无法获得-m 1所期望的结果,请尝试-m 2:您本质上选择了两个提交中的哪一个应被视为主线/您希望处于的状态。
- 另外,如果您想"重做"合并,您可以使用cx1(1)来"重做"合并恢复侧的更改。
- 这的确很有价值!无论在谷歌上如何搜索这个主题,我们都很难找到这个解决方案。谢谢您!虽然您的过度语义方法元是赞赏的,但在这里,这是不必要的!这是一个"宽泛的主题",这个答案对在这个主题下搜索的人很有用:)
- Git文档表示-m选项意味着:"-m父编号"-我不知道这意味着什么想法?
- @bkspugeon提交通常具有父级-上一次提交。合并提交有多个父级,因为它可以从两个分支获取工作并将它们合并在一起。使用-m选项,可以指定要将合并结果与查找其更改内容时要比较的父级,以便将其反转。
- 这是直接从GitHub获得的一个很好的资源:如何撤消几乎所有与Git有关的内容
奇怪的是,最简单的命令丢失了。大多数答案都有效,但是撤销刚才的合并,这是一种简单而安全的方法:
1
| git reset --merge ORIG_HEAD |
参考文件ORIG_HEAD将指向合并前的原始提交。
(--merge期权与合并无关。它就像git reset --hard ORIG_HEAD,但更安全,因为它不涉及未承诺的更改。)
- 是的,这是迄今为止最简单的方法。我想知道为什么与其他答案相比,它的选票如此之少。
- 如果你从那以后弄脏了你的工作树,那么git reset --merge ORIG_HEAD会保留这些更改。
- 谢谢匿名,我只是更新了帖子,而不是使用合并策略重置。默认情况下更安全。:)
- 这是我的答案。不需要git reflog或其他东西。谢谢您。
- 是的,最好的答案。这是一个例子,说明StackOverflow投票系统基本上只是奖励提前发布的答案。
- @SamtheBest回答者从一个答案中得到了他们总代表的2/3以上,你还想要什么奖励?当然,当另一个答案有3年的先期开始时,要达到顶峰需要时间。
- @伊瓦尼我相信,当人们对一个答案投票时,当给出一个新的答案时,他们会被提示重新投票。投票系统过于静态,基本上是基于时间的,而不是基于动态和质量的。
- @萨姆斯贝斯特,我投了352张赞成票,大多数是关于答案的。我不喜欢每次有新的答案发布到这些问题上时都收到通知。352张选票并不多,这里会有人在数千个职位上投票。关于附加答案的通知将a)是烦人的,b)不是规模。
- @Ivarni采样+趋势算法?发挥你的想象力!!每个问题都有解决方案。
- @SamtheBest很好,请随意将其作为一个特性请求发布到meta上,只是警告它很可能不会得到积极的响应。
- @我知道,伊瓦尼是的,很遗憾他们很久以前就没有考虑过积分系统,那时的积分系统不会有如此大的变化。现在的任何改变都必须逐步实施。公平地说,刚开始的时候,游戏化还没有被很好地理解。现在,积分制显然是以时间为导向,而不是以质量为导向,因为我们有后知之明。
- 所以我建议最好的答案是接受这个。所以那些只检查第一个答案的人也能看到它:)
- 完美的解决方案。希望我早点看到。希望我能投票+10而不是+1。多谢!
- 如果合并和存储设置不允许强制-f,则没有工作对象
- 这是唯一正确的答案(我不是说这是最好的答案-注意区别)。比如说,在师父身上,我在T1、T3和T5做了3次承诺。比如说,在Branch1上,我在t2、t4和t6上做了3条评论(假设t1、t2、t3、t4、t5和t6按时间顺序排列)。任何类似于git reset --hard HEAD~5的命令只会重置head(可以删除master和branch1中的提交)。只有--merge选项才能删除merge。
- @Manu的--merge选项实际上并没有删除合并,你可以使用--hard它也会很好地工作。这里的线索是参考猎户座的头部,它是在你合并到你站的地方之前设置的。:)
- 为什么这不是选定的已接受答案?那么选票就少了?
- @yinted你说的"如果你弄脏了你的工作树,git reset——合并orig-head保留了那些更改"是什么意思?你说的合并后更改文件是什么意思?不管怎样,我进行了合并,然后解决了一些冲突。但是我想重新设置合并,并按照这个答案中的说明进行了操作。一切正常,它没有保留合并后所做的更改。我的本地回购与我进行合并之前的头寸很相似。
- 当我运行它时,这绝对没有任何作用…
- git reset --hard ORIG_HEAD命令对我来说非常有效——可能是因为在本地git merge尝试撤销之后,我没有对存储库进行任何其他更改。该命令只需将存储库的状态重置回合并前的状态。谢谢你给我的小费!
对于较新的Git版本,如果尚未提交合并,并且存在合并冲突,则只需执行以下操作:
来自man git merge:
[This] can only be run after the merge has resulted in conflicts. git merge --abort will abort the merge process and try to reconstruct the pre-merge state.
- 他的合并已提交但未被推送(参见标题),他已合并,只有当他仍在合并过程中时,您的命令才起作用。
您应该重置为上一个提交。这应该有效:
或者甚至使用HEAD^^来恢复该恢复提交。如果你不确定应该后退多少步,你可以给出一个完整的sha参考。
如果您有问题,并且您的主分支没有任何本地更改,可以重置为origin/master。
- 最好的答案是imho,它包含了OP自己的一个(假设只有一个步骤要恢复,这在Q中似乎是如此),以及randomguy3的快捷方式一个(当"你的主分支没有任何本地更改"时工作)。
- 你的评论,英格和康斯坦丁,为什么?你是在我的答案被创造出来之后来到这里的,这是更正确的。往上走一步通常是错误的,你必须计算出你需要走多远。Git已经为你设置了ORIG_HEAD,为什么不使用它呢?
- 它也会重置本地更改吗?使愉快。
- 这对我来说非常有效,像这样重新设置头部比这里一半的答案更有意义。
- 头^等于在头之前提交?而且^ ^两个承诺是优先的吗?猜测这对快进合并不起作用?
最近,我一直在使用git reflog来帮助解决这个问题。只有合并刚刚发生,并且它在您的计算机上时,这才起作用。
git reflog可能返回如下内容:
1 2 3 4 5 6
| fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting |
第一行指示发生了合并。第二行是我合并前的时间。我只是简单地强迫这个分支机构在合并前跟踪,然后继续。
- 回答很好,谢谢!需要撤销合并,但其他的答案把合并搞得更糟,用reflog得到sha,然后把它传给git reset就行了。
使用Modern Git,您可以:
旧语法:
老派:
但实际上,值得注意的是,考虑到MERGE_HEAD存在,git merge --abort只相当于git reset --merge。这可以在合并命令的git帮助中读取。
1
| git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. |
合并失败后,在没有MERGE_HEAD的情况下,可以用git reset --merge撤消合并失败,但不一定用git merge --abort撤消合并失败,因此它们不仅是同一事物的新旧语法。
就我个人而言,我发现git reset --merge在日常工作中更强大、更有用,所以我总是使用它。
- 对我来说很好。其他每一篇文章都说这很复杂,但这确实达到了预期的效果。我想这只会起作用,因为有冲突,这并不能完全回答最初的问题。
- 这个答案并没有把重点放在操作的情况上,而忽略了重要的上下文。
好吧,这里其他人给我的答案很接近,但没用。我就是这么做的。
这样做…
1 2
| git reset --hard HEAD^
git status |
…给了我以下状态。
1 2 3
| # On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively. |
然后,我不得不多次输入同一个git reset命令。每次我这样做,信息都会被一个改变,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| > git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded. |
此时,我看到状态消息发生了变化,所以我尝试执行git pull,这似乎有效:
1 2 3 4 5 6 7 8 9
| > git pull
Updating 2df6af4..12bbd2f
Fast forward
app/views/truncated | 9 ++++++---
app/views/truncated | 13 +++++++++++++
app/views/truncated | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master |
长话短说,我的命令归结为:
1 2 3 4 5
| git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull |
- 或者你可以用HEAD^^^^。
- 甚至可以重置为origin/master;)
您可以使用git reflog查找上一次结账。有时候,这是一个很好的状态,你想回到。
具体地说,
1 2
| $ git reflog
$ git reset --hard HEAD@{0} |
- 谢谢您!你救了我半天的工作。但是我不能用任何命令退出reflog模式。
- @katarzyna使用"q"键退出reflog
如果尚未提交,则只能使用
它将撤消合并(以及您所做的所有操作)。
- 尝试了这个方法,它实际上增加了我的本地分支机构领先的提交数。
要解决这个问题,还需要恢复到与源站匹配的状态(即,在源站之前没有提交)。进一步研究发现,有一个reset命令用于:
git reset --hard @{u}
注:@{u}是origin/master的简称。(当然,您还需要这个远程存储库才能工作。)
为了获得一个额外的选择,我主要遵循这里描述的分支模型:http://nvie.com/posts/a-successful-git-branching-model/,因此通常与--no-ff合并(不快速前进)。
我刚刚阅读了这个页面,因为我意外地将一个测试分支而不是我的发布分支与用于部署的master合并了(网站,master是实时的)。测试分支还有两个合并到它的分支,总共大约有六个提交。
所以为了恢复整个承诺,我只需要一个git reset --hard HEAD^,它就恢复了整个合并。由于合并没有快速转发,合并是一个块,后退一步是"分支未合并"。
只能使用两个命令恢复合并或通过特定提交重新启动:
git reset --hard commitHash(您应该使用要重新启动的提交,例如44a587491e32eafa1638ac7738)
git push origin HEAD --force(将新的本地主分支发送到origin/master)
祝你好运,继续!
最简单的答案是奥迪尼奥-维尔蒙特给出的答案。
先做git reset --merge ORIG_HEAD。
对于那些在推送更改后希望重置的用户,请执行此操作(因为这是所有Git重置合并问题的第一篇文章)
git push origin HEAD --force
这将以某种方式重置,这样拉后就不会再次获得合并的更改。
我可以通过一个不涉及查找提交ID的命令来解决这个问题。
1
| git reset --hard remotes/origin/HEAD |
被接受的答案对我来说不起作用,但这个命令实现了我想要的结果。
- 确切地!它将您的更改重置为分支的头!不要一个接一个地做
如果您的合并和相应的提交还没有被推送,那么您总是可以切换到另一个分支,删除原来的分支并重新创建它。
例如,我不小心将一个开发分支合并到master中,并想撤销它。使用以下步骤:
1 2 3
| git checkout develop
git branch -D master
git branch -t master origin/master |
哇!master与origin处于同一阶段,您的错误合并状态将被清除。
- 注意:这不仅会撤消合并,而且会撤消自最新的push-to-origin以来所做的任何本地提交。
如果您正在进行合并,可以随时中止合并。git merge --abort
- 谢谢兄弟,我正要做那些可怕的事情,回答正确。幸运的是我向下滚动。我只想删除合并头
策略:创建一个新的分支,从那里一切都很好。
理由:恢复合并很困难。有太多的解决方案,这取决于许多因素,例如您是否提交或推动了合并,或者合并后是否有新的提交。此外,您还需要对Git有一个相对深入的了解,以使这些解决方案适合您的案例。如果你盲目地遵循一些指示,你可以以一个"空合并"结束,在那里什么都不会被合并,进一步的合并尝试将使git告诉你"已经是最新的"。
解决方案:
假设你想把dev合并成feature-1。
查找要接收合并的修订:
1 2 3
| git log --oneline feature-1
a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one |
查看(及时返回):
从那里创建一个新分支并签出它:
1
| git checkout -b feature-1 |
现在可以重新启动合并:
合并:git merge dev。
修复合并冲突。
承诺:git commit。
当您对结果满意时,删除旧分支:git branch --delete feature-1。
如果你想要一个命令行的解决方案,我建议你按照MBO的答案去做。
如果你是新手,你可能会喜欢图形化的方法:
启动gitk(从命令行,或右键单击文件浏览器,如果有的话)
您可以很容易地在那里发现合并提交-从顶部的第一个节点有两个父节点
沿着链接到第一个/左父级(合并前当前分支上的父级,我通常为红色)
在选定的提交上,右键单击"重置分支到这里",在那里选择硬重置
如果提交合并:
1 2 3 4
| git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard |
首先,确保你已经承诺了一切。
然后将存储库重置为以前的工作状态:
1
| $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 |
或者使用--hard(这将删除所有本地的、未提交的更改!):
1
| $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard |
使用错误合并提交之前存在的哈希。
通过以下方式检查要在以前正确版本的基础上重新提交的提交:
1 2 3 4 5 6 7 8 9
| $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
...
commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
... |
在正确版本的存储库顶部应用您的权限提交,方法是:
我认为您可以执行git rebase -i [hash] [branch_name],其中[hash]是要倒带的多远的标识散列,加上一个(或多个要返回的提交),然后在编辑器中删除您不再需要的提交行。保存文件。出口。祈祷。它应该重绕。你可能需要做一个git reset --hard,但在这一点上应该是好的。如果不想将特定提交保存在历史记录中,也可以使用它将它们从堆栈中拉出,但这样会使存储库处于可能不需要的状态。
git stash
git branch -d the_local_branch
git checkout -t
git stash apply
这对我很有用。!
最简单的机会,比这里说的任何事情都简单:
删除您的本地分支(本地,而不是远程),然后再次拉它。这样,您将撤消主分支上的更改,并且任何人都将受到您不想推动的更改的影响。从头开始。
如果您注意到合并后需要立即恢复,并且在尝试合并后没有做任何其他操作,则可以发出以下命令:git reset --hard HEAD@{1}。
从本质上讲,如果合并后没有其他承诺,合并后的sha将指向HEAD@{0},因此HEAD@{1}将是合并前的前一点。
在这种情况下,您需要使用git reset --hard 重置分支。如果要在重新设置之前保存更改,请确保创建新的分支和git checkout 。
您也可以使用git reset --hard 将状态重置为特定的提交。
如果已推动更改,则可以使用git revert 。一定要了解如何在其他场景中使用git revert和git check out。
您可以使用git reset命令。
git-reset - Reset current HEAD to the
specified state. git reset [--mixed |
--soft | --hard | --merge] [-q] [] git reset [-q] []
[--] … git reset --patch
[] [--] […]
Git复位
- 我试过git reset、git reset --merge和git reset --hard,但最后我还是得到了相同的信息,即5次提交比源站/主站提前。