gpt4 book ai didi

git - 从 master 还原本地分支的提交

转载 作者:太空狗 更新时间:2023-10-29 14:39:41 24 4
gpt4 key购买 nike

我有一个功能分支,其中有一些提交。然后我确实运行了 git rebase master 并将该分支 merge 回 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 中的所有提交从 master 中完全 pull 出,可能需要稍后将其 merge 回 master。

更新:前段时间推送到master,merge后commit多,reset to head不行

最佳答案

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

因此,此时,您可以轻松地撤消您不需要的 merge ,只需将 master 倒回 B。然而,一旦您推送 C(并且其他人已经看到它,和/或在它之上完成工作),这就变得困难了。


简单的解决方案是恢复somebranch上的所有提交:

git revert x'..z'

然后推送。

现在,在您可以再次 merge somebranch 之前,您必须对其进行 rebase (就像您最初所做的那样)。这行得通,但你最终会在 master 的历史中产生一些噪音。


如果只有少数人见过和/或 promise 过 child ,并且您可以与他们协调,则可以避免这种情况,但需要大量工作。如果可能,您必须确保他们正在处理的所有内容都已提交并推送,然后您可以对其进行 rebase :

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 仍然完好无损,因此您可以稍后 merge 。

为此,请使用:

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

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

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

请注意,如果有人确实有仍然依赖于 C 的本地提交(并且在 c1..D 中尚不可见)当你 rebase 时链接),他们将需要 rebase 或挑选它们到新的历史。这可能是很多(容易出错的)工作,因此最好尽可能避免。

关于git - 从 master 还原本地分支的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13481485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com