我正在处理两个(私有)功能分支。
a -- b -- c <-- Master
\ \
\ d -- e <-- Branch1
\
f -- g <-- Branch2
在这些分支上工作了一段时间后,我发现我需要从 Branch2 到 Branch1 的更改。我想将 Branch2 中的更改重新设置为 Branch1。我想以以下结尾:
a -- b -- c <-- Master
\
d -- e -- f -- g <-- Branch1
我很确定我需要将第二个分支变基到第一个,但我不完全确定正确的语法以及我应该签出哪个分支。
这个命令会产生预期的结果吗?
(Branch1)$ git rebase --onto Branch1 Branch2
切换到 Branch2
git checkout Branch2
在 Branch1 更改之上应用当前(Branch2)更改,保持 在 Branch2:
git rebase Branch1
这会让你在 Branch2 中得到想要的结果:
a -- b -- c <-- Master
\
d -- e <-- Branch1
\
d -- e -- f' -- g' <-- Branch2
您可以删除 Branch1.
注意:如果你在
Branch1
,你将使用 Git 2.0(2014 年第二季度)能够输入:
git checkout Branch2
git rebase -
在这种情况下,作为
-
参数的 rebase
表示“我们之前所在的分支”。参见 Brian Gesiak 的 commit 4f40740modocache
:
rebase
:允许“-
”简写为上一个分支教 rebase 与
和checkout
相同的速记,将分支命名为merge
上的当前分支;也就是说,“rebase
”的意思是“我们之前所在的分支”。-
谨慎使用此功能,因为它不太明确,一个小错误可能会导致状态混乱。
这个解决方案应该完全按照要求执行(在 Branch1 上添加 Branch2 的提交,同时留在 Branch1 上):
git checkout Branch1
git cherry-pick master..Branch2
你会得到这个。
a -- b -- c <-- Master
\
d -- e -- f' -- g' <-- Branch1 (current)
\
f -- g <-- Branch2
这将按顺序挑选 Branch2 上的每个提交到 Branch1。然后你可以删除 Branch2.
我知道你要求变基,但我会 Cherry-Pick 我想从 Branch2 移动到 Branch1 的提交。这样,我就不需要关心什么时候从 master 创建了哪个分支,并且我可以更好地控制合并。
a -- b -- c <-- Master
\ \
\ d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
\
f -- g <-- Branch2
我是不是误解了这个问题?我的直觉是像这样使用
rebase
的--onto
标志:
git rebase --onto branch1 master branch2
变基前:
* 6263580 (HEAD -> branch2) add g
* c802c88 add f
| * c80cfb0 (branch1) add e
| * aea5708 add d
| * 2e522fe (master) add c
|/
* 0613527 add b
* e2a0c4d add a
变基后:
* 7f6a363 (HEAD -> branch2) add g
* 4cbab60 add f
* c80cfb0 (branch1) add e
* aea5708 add d
* 2e522fe (master) add c
* 0613527 add b
* e2a0c4d add a
这使得它变得明确和清晰,哪些提交集正在重新基于什么