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

现在我需要完全从 master 中提取某个分支中的所有提交,可能需要稍后将其合并回 master。

更新:前一段时间将更改推送到 master 并且合并后有很多提交,因此重置为 head 将不起作用

4

3 回答 3

3
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

因此,此时,您可以轻松撤消不需要的合并,只需将 master 倒回到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

其他所有人现在都必须更新到新的 head D',例如通过执行以下操作:

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

Note that if anyone does have local commits that still depend on C (and aren't already visible in the c1..D chain when you rebase), they'll need to rebase or cherry-pick them across to the new history. This is potentially a lot of (error-prone) work, so better to avoid if possible.

于 2012-11-20T21:49:52.087 回答
1

在本地副本上,master您可以尝试以下操作,这将使用还原的更改创建一个新的提交(与您在 master 上所做的相反)。

git revert OLDER_COMMIT^..NEWER_COMMIT

哪里OLDER_COMMIT是您的功能分支提交的第NEWER_COMMIT一次提交,并且是您的功能分支的最后一次提交。

或者,您可以尝试

git revert -n OLDER_COMMIT..NEWER_COMMIT

这将恢复提交所做的更改,但不会使用恢复的更改创建任何新提交。还原仅修改工作树和索引。

注意:使用1.7.4+

于 2012-11-20T21:20:09.973 回答
0

如果合并提交仍然是最新的,并且如果您尚未将该提交推回上游,git reset --hard HEAD^则应将您放回到合并之前的提交上 - 即将您的master分支返回到它之后的位置git merge origin/master

于 2012-11-20T20:41:41.387 回答