合并失败的分支恢复到以前的提交

时间:2014-08-05 10:47:31

标签: git

我昨天在一个功能分支上工作,并与develop合并。更新阻止了我的事情所以我检查了我的分支的先前提交。然后我从那时起做了更多的提交。今天我想合并再次开发以获取之前阻止我的更改但我的分支认为它是最新的开发虽然我可以从代码中看到它不是。我已经将另一个功能分支合并到了开发中,并再次尝试查看新的开发参考是否会有所帮助,但当我尝试将开发合并到我的功能分支时,我看到:

Merge made by the 'recursive' strategy
1 file changed...

所以这是从另一个分支中获取变化,而不是从我感兴趣的分支中获取变化。我是否需要使用除递归之外的策略来运行合并?

非常感谢任何想法

C

1 个答案:

答案 0 :(得分:1)

作为Vality said in a comment,这个:

  

所以我检查了我的分支的先前提交。然后我从那时起做了更多的提交。

建议您创建一个匿名分支(在#34;分离的HEAD"上),其提交现在只能在reflog中找到。

要让他们回来,请使用git reflog来显示导致HEAD更改的事情列表"。在日志中,您将看到如下内容:

d1574b8 HEAD@{15}: checkout: moving
     from 11d9593a8479fb8b069eb81ff4368637186122bb to master
11d9593 HEAD@{16}: commit: example
9c4ea50 HEAD@{17}: checkout: moving from master to HEAD~3

11d9593(或它的长版本)这样的值是原始SHA-1; HEAD@{number}字段是拼写SHA-1的短手方式(有时不是那么短)。大括号内的数字会更改 - 它们会上升,HEAD@{0}是最新的 - 因为您在HEAD上执行各种操作,例如git checkoutgit commit,但SHA -1s是永久性的。 1

如果您想要恢复提交,例如我上面提到的example提交的提交,您可以先给它命名,这样您就不必记住它的编号,而且在reflog条目到期后不会被删除。对于名称,您可以使用分支:

git branch recovered-as-branch 11d9593

或标签:

git tag recovered-as-tag 11d9593

(使用您喜欢的任何名称;请注意recovered-as-whatever是一个可怕的名称,除非用作示例。)

这里的区别在于,如果你把它作为一个分支,你可以使用git checkout来获取它并添加更多的提交,分支名称将继续进行那些新的提交,就像任何其他分支一样;如果你把它作为一个标签,你仍然可以对它进行git checkout,但你会回到那个"分离的HEAD"再次模式,所以如果你做了更多的提交,它们将只在reflog中找到,就像你在这个时候遇到的情况一样。 (这没有什么不妥,事实上,你可以做的一些技巧在这个"分离的HEAD"模式下实际上更容易。这就是git rebase互动的方式 - 例如,rebase脚本可以做到这一点。分离HEAD模式的主要问题是,如果你忘记了它,你很容易忘记这些东西。)


1 好吧,永久,直到reflog条目本身到期并且提交是#34;垃圾收集"。默认情况下,HEAD@{42}等Reflog条目会在30到90天后过期,但您可以在git配置中更改此设置。