恢复已被推动的git pull

时间:2013-08-12 17:34:03

标签: git git-merge git-push git-pull git-reset

我不确定这是否重复,因为它是一种一次性的情景:

我有一个“beta”分支,并启动了一个新的“重构”分支。

  1. 我在“refactor”分支中做了一堆代码。
  2. 我将最新的测试结果从测试版转移到了重构器(git checkout refactor && git pull origin beta
  3. 我的更改已准备就绪,因此我检查了测试版,并将更改从重构更改为测试版。 (git checkout beta && git pull origin refactor
  4. 意识到我的测试版分支不是最新的,所以不得不做一个git pull来最新测试。
  5. 现在beta分支是最新的,做了另一个git pull origin refactor以确保最新的那个(有一个自动提交消息,重构被合并到beta)。
  6. 我推了我的代码:(
  7. 所以现在我意识到我做错了两件事:

    1. 在第3步中,我应该先做一个git pull,以便我有最新的beta版变更集
    2. 在第3步中,我意识到我应该调用git merge refactor而不是git pull origin refactor(不要问我为什么这样做,这是星期一,我只想把我真棒的重构代码放到beta开始测试)。我现在意识到,如果我已经完成了这两件事,那么后面的步骤都不需要。
    3. 所以我的问题是这样的:技术上,所有的代码都在那里看起来很好,但github上的网络图看起来非常时髦,我没有一个干净的“合并”提交,我可以轻松回滚到我的合并分支需要还原,而beta现在已经从重构分支中提交了所有个人提交。有没有一种简单的方法可以回滚我的合并并以更干净的方式做到这一点?

      我已经尝试过git checkout beta && git reset --hard beta@{"1 hour ago"}了,但问题是让我进入过时的本地版本的测试版,而不是在我发布合并之前本应该是最新版本的版本应该先做git pull。我觉得应该有一种方法可以像git reset --hard origin/beta@{"1 hour ago"}那样在1小时前重置为远程 beta分支,然后执行git merge refactor?我是否能够推动这些更改并确保远程提交被覆盖?

      提前感谢您的帮助!我对使用“git reset”做任何事都犹豫不决,因为重构非常重要,并且测试版有很多未决的变化,我没有这么做,所以我更担心搞砸重置并丢失代码我担心不得不手动恢复被拉入的重构分支的提交。

1 个答案:

答案 0 :(得分:0)

你是否强行推动了beta分支?

如果是这样,我假设您不需要将此与其他开发人员同步,因此可以再次强制推送。在那种情况下,我建议:

  • 做一个交互式的rebase例如最后10次提交“git rebase -i HEAD~10”
  • 删除从重构分支合并的提交,并确保测试版是干净的并更新分支的最新版本
  • 强行推动
  • 转到重构分支并在测试版上重新定义(git checkout refactor&& git rebase beta)
  • 转到测试版并在没有ff的情况下合并重构(git checkout beta&& git merge --no-ff refactor)
  • 这将为您提供精美可读的历史图表

如果你不能进行强制推动,那么你可以使图表更加复杂化。您可以为每个从重构中退出的提交执行还原提交。通过这种方式,您可以将beta分支变为干净且更新的状态。之后,只需重复上部食谱的最后3个步骤。你会得到漂亮的图表,但是在此之前的历史仍然存在。