将功能分支重新定位到另一个分支的特定提交
Rebase a feature branch onto a specific commit of another branch
我正在尝试将一个功能分支(从 master 分支出来)变基到另一个分支的特定提交上。
我的初始状态如下
C -- D branch1
/
A -- B -- E -- F master
\
branch2 (zero commits after creating the branch)
我首先将 branch2 重新定位到 master 中的 A 上,效果很好。我现在的状态(据我理解)应该是这样的
C -- D branch1
/
A -- B -- E -- F master
\
B -- E -- F branch2
我验证了 branch2 在提交 A 时从 master 分支出来,并且与 master 分支一致。我现在想要得到的是这个
A -- B -- E -- F master
\
B -- E -- F branch2
\
C -- D branch1
我试过了
git checkout branch1
git rebase --onto B branch2
但这导致了一大堆冲突,我完全不明白这些是怎么产生的。也许我完全误解了 rebase 的作用?
注意:在成功将branch1 rebase到branch2的B之后,我打算将master重置为A,所以最终版本应该是这样的。
A master
\
B -- E -- F branch2
\
C -- D branch1
您的假设存在一些问题。首先,b运行ches 只是指向提交的指针。你从这个开始,master
被检出。
C -- D branch1
/
A -- B -- E -- F master
在 git branch branch2
之后你有这个。
C -- D branch1
/
A -- B -- E -- F master & branch2
注意这里没有stub b运行ch,master
和branch2
都指向F,除了名字,没有区别
结帐后 branch2
和 git rebase A
没有任何变化。 branch2
的祖先已经有 A
,它仍然指向 F
。您应该已经收到类似 Current branch branch2 is up to date
.
的消息
当你做 git checkout branch1
和 git rebase --onto B branch2
时,这会混淆事情。有一个假定的第三个参数,当前签出的 b运行ch。你实际上 运行 是 git rebase --onto B branch2 branch1
。也就是说 "take the commits reachable by branch1 but not by branch 2 (the same as git log branch2..branch1
or C and D) and put them onto B"。这应该是一个空操作,但是如果 b运行ch1 和 b运行ch2 有任何共同的变化,rebase 将把它们扔掉。
如果 C 和 E 进行了相同的更改,您最终会遇到这种情况,并且可能会发生冲突。
C -- D original branch1
/
A -- B -- E -- F master & branch2
\
D1 branch1
这没有多大意义,但这就是当您尝试在两个堂兄弟之间变基时发生的情况。
另请注意,变基后的 b运行ch 的 ID 为 D1,而非 D。提交 ID 合并了其父代的 ID,因此 ID 必须更改。 rebase
不会重写历史,它会创造新的历史并告诉你它一直都是这样。一个微妙但重要的区别。您的原始提交仍然存在...一段时间。
如果你想从这里开始:
C -- D branch1
/
A -- B -- E -- F master & branch2
至此。
A master
\
B -- E -- F branch2
\
C -- D branch1
可以将其翻转过来,以便与您拥有的更好对齐。
C -- D branch1
/
B -- E -- F branch2
/
A master
您需要做的就是将 master
移动到 A。有几种方法可以做到这一点,一种是 git branch -f master A
。这迫使 master
移动到 A
。
我正在尝试将一个功能分支(从 master 分支出来)变基到另一个分支的特定提交上。 我的初始状态如下
C -- D branch1
/
A -- B -- E -- F master
\
branch2 (zero commits after creating the branch)
我首先将 branch2 重新定位到 master 中的 A 上,效果很好。我现在的状态(据我理解)应该是这样的
C -- D branch1
/
A -- B -- E -- F master
\
B -- E -- F branch2
我验证了 branch2 在提交 A 时从 master 分支出来,并且与 master 分支一致。我现在想要得到的是这个
A -- B -- E -- F master
\
B -- E -- F branch2
\
C -- D branch1
我试过了
git checkout branch1
git rebase --onto B branch2
但这导致了一大堆冲突,我完全不明白这些是怎么产生的。也许我完全误解了 rebase 的作用?
注意:在成功将branch1 rebase到branch2的B之后,我打算将master重置为A,所以最终版本应该是这样的。
A master
\
B -- E -- F branch2
\
C -- D branch1
您的假设存在一些问题。首先,b运行ches 只是指向提交的指针。你从这个开始,master
被检出。
C -- D branch1
/
A -- B -- E -- F master
在 git branch branch2
之后你有这个。
C -- D branch1
/
A -- B -- E -- F master & branch2
注意这里没有stub b运行ch,master
和branch2
都指向F,除了名字,没有区别
结帐后 branch2
和 git rebase A
没有任何变化。 branch2
的祖先已经有 A
,它仍然指向 F
。您应该已经收到类似 Current branch branch2 is up to date
.
当你做 git checkout branch1
和 git rebase --onto B branch2
时,这会混淆事情。有一个假定的第三个参数,当前签出的 b运行ch。你实际上 运行 是 git rebase --onto B branch2 branch1
。也就是说 "take the commits reachable by branch1 but not by branch 2 (the same as git log branch2..branch1
or C and D) and put them onto B"。这应该是一个空操作,但是如果 b运行ch1 和 b运行ch2 有任何共同的变化,rebase 将把它们扔掉。
如果 C 和 E 进行了相同的更改,您最终会遇到这种情况,并且可能会发生冲突。
C -- D original branch1
/
A -- B -- E -- F master & branch2
\
D1 branch1
这没有多大意义,但这就是当您尝试在两个堂兄弟之间变基时发生的情况。
另请注意,变基后的 b运行ch 的 ID 为 D1,而非 D。提交 ID 合并了其父代的 ID,因此 ID 必须更改。 rebase
不会重写历史,它会创造新的历史并告诉你它一直都是这样。一个微妙但重要的区别。您的原始提交仍然存在...一段时间。
如果你想从这里开始:
C -- D branch1
/
A -- B -- E -- F master & branch2
至此。
A master
\
B -- E -- F branch2
\
C -- D branch1
可以将其翻转过来,以便与您拥有的更好对齐。
C -- D branch1
/
B -- E -- F branch2
/
A master
您需要做的就是将 master
移动到 A。有几种方法可以做到这一点,一种是 git branch -f master A
。这迫使 master
移动到 A
。