GIT变基连接功能分支

时间:2017-09-28 12:53:03

标签: git git-merge rebase git-rebase git-flow

我有一个开发分支和一个功能分支,我们称之为功能/ A. 当有人进行远程开发时,我正在拉它然后我去功能/ A并将其重新定义为开发。现在我想创建一个名为feature / B的新分支,并且"继承"它来自feature / A并进行一些开发(我需要feature / B中的功能/ A代码),但我想知道当我将我的功能/ A重新设置为开发时会发生什么。

    dev
     |
1----4
 \
  \---2--------3
      |        |
     f/A      f/B

然后我将再次提交功能/ A

    dev
     |
1----4
 \
  \---2--------3
       \        |
        |      f/B
        5
       f/A

当我将功能/ A重新设定为开发时,我将

    dev      f/A
     |        |
1----4---2'---5'
 \
  \---2--------3
      /        |
     /        f/B
    5 (commit without any assiciated branch that git will remove as trash after several days)

现在我必须将功能/ B重命名为功能/ A吧?是否有可能在该rebase之后提交2和3将覆盖提交2'并承诺5'在我的功能/ B中我会再次使用旧代码吗?

不要忘记我需要在我的功能/ B中提交5个更改

1 个答案:

答案 0 :(得分:1)

嗯... rebase是一个非常灵活的命令。它可以做很多事情,所以真正的问题是如何告诉它完全按你的意思去做。

所以关注点似乎是你有

1 -- 4 <--(dev)
 \    \
  \    2' -- 5' <--(A)
   \
    2 -- 3 <--(B)

如何将B重新定义到A。 (您提供的有关如何达到这一点的其他信息并不重要;我们可以只关注当前的提交图。悬挂提交5在这里也无关紧要。)

您询问2是否可能以某种方式最终覆盖2' ......我没有看到那里的问题。如果您正在重新定位的分支是BA并且其历史记录将不受影响。

一个小问题是2B的历史记录,而不是A的历史记录。这个不应该是的问题,因为我们希望2应用与2'相同的文本更改 - 条件rebase会检测到。但是,如果在重新定位A时存在冲突解决方案 - 或者我认为其他更隐蔽的可能性 - 补丁比较可能会搞砸。

这意味着,你能够说出

git rebase A B

提交23将被识别为源提交,但2有望被发现为2'的副本并被丢弃。将创建3'以在3之上应用2(相对于5)的更改,从而产生

1 -- 4 <--(dev)
      \
       2' -- 5' <--(A)
              \
               3' <--(B)

如果失败,那么当git尝试重播2时,您可能会看到冲突。那时你会中止变基。

(我看不出会发生这种情况,但是如果rebase成功完成但是你发现它错误地重新复制了2的更改,那么你仍然可以将其退出;使用

git checkout B
git reset --hard B@{1}

撤消rebase。)

如果您必须中止rebase或撤消它,那么“计划B”将是

git rebase --onto A 2 B

其中2是一个引用commit 2的表达式(例如它的SHA ID,或给定示例中的B^等)。这将确保只有3被视为重写的候选提交(因为2是上游)但仍将执行重播到5