Git: 如何将一个远程分支基于另一个远程分支进行变基?

3
我有两个远程git分支(称它们为“RemoteA”和“RemoteB”)。
“RemoteB”是一段时间以前从“RemoteA”分支出来的。之后,在两个分支上都应用了许多提交,但现在我想让“RemoteB”接收“RemoteA”的所有提交。
A-B-C-D-E  (RemoteA)
 \
  F-G-H-I  (RemoteB)

我的一个想法是尝试基于“RemoteA”最新的标签重新创建“RemoteB”的衍合分支,但我看到一些社区帖子建议不要这样做。是否可行(如果有示例命令将不胜感激),如果可以,我是否应该尝试?

A-B-C-D-E  (RemoteA)
         \
          F-G-H-I  (RemoteB)

另一个想法是从“RemoteA”创建一个新分支,称之为“RemoteC”,并手动从“RemoteB”挑选更改。针对这种情况,有哪些最佳实践?


"远程"分支是您(本地)git记住了从其他人的(远程)git得到的内容。 您不能更改他们所做的事情,只有在执行它们时才能更改。 因此,尽管可能通过低级命令欺骗您的git认为它们重新设置了其远程并且您随后接受了它,但这不是一个好主意,因为他们没有,做了。 所以不要尝试对远程进行变基。 先在本地进行变基,然后说服另一个人(远程)接受您的更改。 - torek
2个回答

4
因为这些是远程分支(并且假设你不是在独自工作),所以将一个分支变基到另一个分支是一个非常糟糕的想法。
这是因为将"B"变基到"A"会重新创建整个"B"历史记录。任何检索远程"B"的其他人现在都必须处理它(通常意味着他们正在查看冲突变更)。你将让你的合作者们感到苦恼。
要从"A"中获取更改并将其合并到"B"中,请检出您本地版本的"B",然后将"A"合并到其中。然后将更新后的“B”推送到远程存储库。
一般规则是:除非你是唯一在与该远程一起工作的人,否则不要对已经在远程存储库中的分支进行变基。

我不喜欢将"A"合并到"B"的原因是,这似乎会使我的历史记录看起来相当不干净。这就是为什么我在考虑创建branchC。有没有办法通过合并来获得相对清晰的历史记录? - JackHughes
如果你想要一个“线性历史”(我猜这就是你所说的“干净的外观”),那么你必须创建一个全新的分支,在这个分支上将“B”变基到“A”(或者你重写远程的“A”,但这样你的合作者需要知道)。在任何一种情况下,变基都会有效地破坏历史信息的一个重要方面——当你追求“干净的外观”时,请记住这一点。 - Sigi
简而言之:您的原始想法是创建一个新分支“C”进行变基,这是正确的,并且在实践中可行。但是,在此之后,您对“A”和“B”分支要做什么?将它们丢弃吗?这似乎会不必要地干扰工作流程。 - Sigi
谢谢你的信息,Sigi。我想我会从Branch"B"检出/创建一个名为“C”的本地分支,将Branch"C"在Branch"A"上进行变基,然后将Branch"C"作为远程分支推送到服务器上。Branch"A"将继续存在并继续开发。Branch"B"将有点不活跃,但我认为这应该没问题。这个过程只会在很少的情况下发生,所以我不介意有一些杂项分支挂在那里。 - JackHughes

0
这种情况下的最佳实践是什么? 主要取决于其他人是否有机会在两个分支中已经看过提交。
  • 如果一个分支(比如RemoteB)已经在你的本地机器上,并且从未推送到公共仓库,你可以安全地将其变基到另一个分支之上:

    git checkout RemoteB
    git rebase RemoteA
    
  • 否则,通常的方法是将一个分支合并到另一个分支中:

    git checkout RemoteB
    git merge RemoteA
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接