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
链中看到),他们需要重新绑定或挑选新的历史记录。这可能是很多(容易出错)的工作,所以尽可能避免,如果可能的话。
我既不完全理解这个问题,也没有得到与* revert *相关的方式。 –
请感觉恢复为删除,而不是git恢复命令。我只需要删除我在主分支中执行的更改。但我敢肯定它与git还原有关 – waney
为什么不重新设置master到特性分支的rebase/merge之前的位置? –