撤消快速合并


71

我对git repo做了一些更改,希望撤消。

我的git仓库看起来像这样:

A-B----     master
   \   /
    C-D     * develop

我在develop分支上,忘记了它与master分支不同,在上进行了更改develop,将其合并到中master,然后将其推送到我的遥控器(称为publish)。

因为自从B(祖先)以来,master上没有任何更改,所以git进行了快速合并。

现在,我的仓库看起来像这样:

A-B-C-D   master, develop, remotes/publish/master, remotes/publish/develop.

我想还原上一次合并,还原master到B。

从我在如何撤消Git中的最后一次提交中阅读的内容,我曾经git reset sha-of-Bmaster分支恢复到修订版B。

问题:

  • 如何还原develop到版本D?
  • 然后如何将这些更改推回远程/发布?

1
博客文章进行了总结,并对我做了什么,应该做的事情以及如何解决此问题进行了更详细的介绍:capnfabs.net/software/…–
Fabian


对于唯一的开发人员来说,这可能是一件好事,但对于那些进行协作的人,使用revert而不是更有意义reset吗?
Snowcrash 2015年

1
@Snowcrash:git revert -m 1 hashValue将失败,并提示hashValue不是合并消息。因为它是快速向前合并。
Tihomir

Answers:


94

如果您重置分支母版,它将不会碰到develop分支。为了使一切井井有条,您应该:

git checkout master
git reset --hard sha-of-B
git checkout develop
git reset --hard sha-of-D
git checkout master
git merge develop --no-ff

9
@SimonBoudrias:从不推荐push --force。使用git push publish --force-with-lease代替。
罗伯·西默

30
  • 想象您仍然在合并和推送的主控
  • git reset --hard @{1}
    • 这会将分支“ master”重置为您的计算机上退一步的位置(即“ B”)
  • 对于开发无能为力,因为它仍应位于“ D”
  • git push publish develop
    • 这以通常的方式推动分支“发展”
  • git push publish master --force-with-lease
    • 向后推分支“ master”,并--force-with-lease以安全的方式通过获得许可
    • 使用may--force可能会默默地覆盖其他人的工作,所以我从不使用
  • 或两者都使用以下令人惊讶的语法进行推送操作:
    • git push publish develop --force-with-lease=master

4
“ git reset --hard @ {1}”非常适合我的情况。我-不可以进行合并,它有100多次提交,不需要为每个合并进行软重置。谢谢!+1
布莱德·伯德

我不小心做了一个git checkout develop && git merge -而不是git checkout develop && git merge --no-ff --(-表示最后一个分支)。上面的答案对我来说非常有效,因为我之间没有做任何事情,并且仍在开发中:git reset --hard @{1} && git merge --no-ff feature/my-feature-branch
Thomas Praxl

作为对此的可用性/信心提示:git checkout @{1}在进行重大更改以在该提交时重置事物之前,它可能会帮助确保当前分支和历史记录看起来像您想要的那样。
Unixmonkey

“发布”在做git push publish什么?我在git-push文档中或Googling的“ git publish”中看不到该单词。
Noumenon

2
@Noumenon这是问题中建立的存储库的名称。在git push手册页中称为<repository>
罗伯·西默

0

好像您develop在跑步时就被签出了git reset,这就是让您感到困惑的原因。

您可以修复develop如下:

git checkout develop
git merge --ff-only D

现在,您可以还原master回B:

git checkout master
git reset --hard B

回到develop并推动它:

git checkout develop
git push develop

感谢您的回答!我肯定在master分支上,我只是在读gitkgui错误。我将相应地编辑我的问题。
Fabian Tamp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.