协慌网

登录 贡献 社区

从主更新 Git 分支

我是 Git 的新手,现在处于这种情况:

  • 我有四个分支(master,b1,b2 和 b3)。
  • 在研究了 b1-b3 之后,我意识到我在分支主控上应该进行一些更改,这些更改应该在所有其他分支中进行。
  • master所需的内容,这是我的问题:

master分支代码更新所有其他分支?

答案

您有两种选择:

第一个是合并,但这会为合并创建一个额外的提交。

结帐每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推送:

git push origin b1

另外,您可以重新设置基准:

git fetch
git rebase origin/master

您基本上有两种选择:

  1. 您合并。这实际上很简单,而且是一个完美的本地操作:

    git checkout b1
    git merge master
    # repeat for b2 and b3

    这样就完全保留了历史:您从 master 分支,对所有分支进行了更改,最后将 master 的更改合并到所有三个分支中。

    git可以很好地处理这种情况,它是专为同时发生在各个方向的合并而设计的。您可以相信它能够正确地将所有线程聚集在一起。它根本不在乎分支b1合并master还是master合并b1 ,合并提交对 git 看起来都一样。唯一的区别是,哪个分支最终指向此合并提交。

  2. 你变基了。具有 SVN 或类似背景的人会发现这更加直观。这些命令类似于合并的情况:

    git checkout b1
    git rebase master
    # repeat for b2 and b3

    人们喜欢这种方法,因为它在所有分支机构中都保留了线性的历史记录。但是,此线性历史只是一个谎言,您应该意识到是这样。考虑以下提交图:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1

    合并产生真实的历史记录:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1

    重新设置后,将为您提供以下历史记录:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1

    关键是,提交E'F'G'从未真正存在过,并且可能从未进行过测试。他们甚至可能不编译。通过 rebase 创建荒谬的提交实际上非常容易,尤其是当master b1的开发很重要时。

    这样的结果可能是,您无法区分三个提交EFG哪个实际上引入了回归,从而减小了git bisect的值。

    我并不是说您不应该使用git rebase 。它有其用途。但是,无论何时使用它,您都需要意识到自己在说谎历史。而且您至少应该编译测试新提交。

git rebase master是执行此操作的正确方法。合并将意味着将为合并创建一个提交,而不会重新设置基础。