2012-11-20 64 views
2

我有一个功能分支,我有一些提交。然后我运行了git rebase master并将该分支合并回了master。恢复从主人本地分支提交

所以它像

git checkout -b somebranch 
......some work commits here ..... 
git checkout master 
git fetch 
git merge origin/master 
git checkout somebranch 
git rebase master 
git checkout master 
git merge somebranch 

现在我需要从主拔出我的somebranch所有提交了完全,可能以后需要把它合并到主。

更新:变化推到前掌握一些时间,有合并后多提交,因此恢复到头将无法正常工作

+0

我既不完全理解这个问题,也没有得到与* revert *相关的​​方式。 –

+0

请感觉恢复为删除,而不是git恢复命令。我只需要删除我在主分支中执行的更改。但我敢肯定它与git还原有关 – waney

+0

为什么不重新设置master到特性分支的rebase/merge之前的位置? –

回答

2
git checkout -b somebranch # from "A" 
......some work commits here x, y, z ..... 
git checkout master 
git pull # call new HEAD "B" 

因此,我们必须像

A -> a1 -> a2 -> B <= master 
\ 
    x -> y -> z  <= somebranch 

然后:

git checkout somebranch 
git rebase master 

A -> ... -> B <= master 
      \ 
       x' -> y' -> z' <= somebranch 

git checkout master 
git merge somebranch # call new HEAD "C" 


A -> ... -> B -------------> C <= master 
      \   /
       x' -> y' -> z' <= somebranch 

所以,在这一点上,你可以很容易撤消你不需要的合并,只需倒带大师到B。但是,一旦你C(和其他人已经看到它,和/或完成它的工作),这变得很难。


简单的解决方法就是恢复对somebranch所有提交:

git revert x'..z' 

和推动。

现在,在您再次合并somebranch之前,您必须重新绑定它(就像您之前所做的那样)。这很有效,但你最终会在主人的历史中产生一些噪音。


如果人数量有限,所看到的和/或承诺孩子,你可以与他们协调,有可能避免这种情况,但它是一个大量的工作。 你必须确保一切,他们正在努力致力于如果可能推,然后你就可以变基这样的:

A -> ... -> B -------------> C -> c1 -> c2 -> D <= master 
      \   /
       x' -> y' -> z' <= somebranch 

这样:

   c1' -> c2' -> D' <= master 
      /
A -> ... -> B -------------> C -> c1 -> c2 -> D 
      \   /
       x' -> y' -> z' <= somebranch 

现在中间的分公司将被孤立,新主管D'没有您的更改,并且somebranch仍然完好无损,因此您可以稍后进行合并。通过做

git rebase --onto B C c1 
git push --force 

其他人现在必须更新到新的头D',例如:

要做到这一点,利用

git fetch 
git checkout master 
git reset --hard origin/master 

需要注意的是,如果有人确实有本地提交仍然依赖于C(并且在重新绑定时不会在c1..D链中看到),他们需要重新绑定或挑选新的历史记录。这可能是很多(容易出错)的工作,所以尽可能避免,如果可能的话。

+0

+1不能做得更好,很好的答案 –

0

如果合并提交仍然是最新的,如果你还没有推说提交回上游,git reset --hard HEAD^应该让你回到合并之前的提交 - 即将您的master分支返回到git merge origin/master之后的位置。

+0

更改我说的是旧的,并且是前一段时间被推送的,并且在主设备上面有很多提交 – waney

+0

在这种情况下,它可能会变得混乱。在我头顶,我会建议1)在有问题的合并之前在提交时创建一个新的分支,2)在合并到新的分支之后,樱桃挑选所有的东西,3)声明你的新主人。当然,这有上游影响,因为它已被推动,但这可能是最简单的方法来消除一个合并提交... – twalberg

1

master的本地副本上,您可以尝试以下操作,该操作将使用恢复的更改(与您在主服务器上完成的操作相反)创建新的提交。

git revert OLDER_COMMIT^..NEWER_COMMIT

其中OLDER_COMMIT是第一个提交您的特性分支的提交和NEWER_COMMIT是最后一次提交您的分支中。

或者,你可以尝试

git revert -n OLDER_COMMIT..NEWER_COMMIT

将恢复通过提交所做的更改,但不创建与恢复的改变任何新的承诺。恢复只修改工作树和索引。

注:与使用1.7.4+