【问题标题】:Rebase feature branch onto another feature branch将功能分支重新定位到另一个功能分支
【发布时间】:2013-01-31 08:25:43
【问题描述】:

我正在开发两个(私有)功能分支。

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

在处理这些分支一段时间后,我发现我需要从 Branch1 中的 Branch2 进行更改。我想将 Branch2 中的更改重新定位到 Branch1。我想最终得到以下结果:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

我很确定我需要将第二个分支重新第一个分支,但我不完全确定正确的语法以及我应该检查哪个分支。

这个命令会产生预期的结果吗?

(Branch1)$ git rebase --onto Branch1 Branch2

【问题讨论】:

  • 为了回答您的问题,我将创建一个测试存储库,创建您展示的提交结构并尝试您展示的命令。但我认为你可以自己做,所以我不打算这样做:)
  • 谢谢。我非常想在第一次做到这一点,以至于我没有想到我可以很容易地自己测试这个:-)
  • 我是这么认为的,这就是我发布该评论的原因 :) 每次我做某事时,我不确定它是否会像我认为的那样做,我创建一个测试存储库并在那里执行我的测试。或者,我创建一个真实存储库的副本并在该副本上执行测试。
  • 注意:Git 2.0 将为这种变基引入一个快捷方式:git rebase -。见my answer below
  • 次要注意:这里的答案给出了 branch2 作为结果。 OP想要branch1。还是我错过了什么?

标签: git git-rebase feature-branch


【解决方案1】:
  1. 切换到 Branch2

    git checkout Branch2
    
  2. 在 Branch1 更改之上应用当前 (Branch2) 更改,保持不变 在 Branch2 中:

    git rebase Branch1
    

这会让你在 Branch2 中得到想要的结果:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

你可以删除 Branch1。

【讨论】:

  • 谢谢!在变基后删除分支时,我收到一条消息,指出分支未完全合并。我想我可以放心地忽略此消息并强制删除?
  • 他不想在 Branch1 中进行所有更改吗?
  • 这似乎与他想要的相反,不是吗?
  • 确实,@tomasz_kusmierczyk 和 @1252748,我自己也感到困惑。但后来我意识到,在 Branch1 中执行git rebase 将重写 Branch1 历史记录,以便在从 Branch2 复制的更改之上拥有 Branch1 的更改。这将导致以下提交顺序,a - b - f - g - c' - d' - e'
  • @tomasz_kusmierczyk 和 1252748,这与他想要的并不相反,这正是他想要的。分支名称无关紧要,您可以随时更改它们。
【解决方案2】:

注意:如果您使用的是 Branch1,您将使用 Git 2.0(2014 年第二季度)能够输入:

git checkout Branch2
git rebase -

commit 4f40740Brian Gesiak modocache

rebase:允许上一个分支的“-”简写

教 rebase 使用与 checkoutmerge 相同的简写来将分支命名为 rebase 当前分支;也就是说,“-”表示“我们之前所在的分支”。

【讨论】:

  • 不错,但也有点危险。有时冗长会获胜。但话又说回来,我也喜欢 Java... (-:
【解决方案3】:

我知道你已经接受了答案,但是如果你想完全按照你的要求去做(在 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。

【讨论】:

  • 这非常有用。我在另一个(本地)分支上进行了一些提交,尚未推送到 git。我使用git cherry-pick mybranch...origin/mybranch 将这些提交选择到当前分支。
【解决方案4】:

我知道你要求 Rebase,但我会选择 Cherry-Pick 我想从 Branch2 移动到 Branch1 的提交。这样一来,我就不需要关心何时从 master 创建了哪个分支,并且我可以更好地控制合并。

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2017-07-04
    • 2020-12-15
    • 2017-07-01
    • 1970-01-01
    • 2013-12-05
    • 2023-04-09
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多