我是 Git 的新手,现在处于这种情况:
master所需的内容,这是我的问题: master分支代码更新所有其他分支?
您有两种选择:
第一个是合并,但这会为合并创建一个额外的提交。
结帐每个分支:
git checkout b1然后合并:
git merge origin/master然后推送:
git push origin b1另外,您可以重新设置基准:
git fetch
git rebase origin/master
您基本上有两种选择:
您合并。这实际上很简单,而且是一个完美的本地操作:
git checkout b1
git merge master
# repeat for b2 and b3这样就完全保留了历史:您从 master 分支,对所有分支进行了更改,最后将 master 的更改合并到所有三个分支中。
git可以很好地处理这种情况,它是专为同时发生在各个方向的合并而设计的。您可以相信它能够正确地将所有线程聚集在一起。它根本不在乎分支b1合并master还是master合并b1 ,合并提交对 git 看起来都一样。唯一的区别是,哪个分支最终指向此合并提交。
你变基了。具有 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的开发很重要时。
这样的结果可能是,您无法区分三个提交E , F和G哪个实际上引入了回归,从而减小了git bisect的值。
我并不是说您不应该使用git rebase 。它有其用途。但是,无论何时使用它,您都需要意识到自己在说谎历史。而且您至少应该编译测试新提交。
git rebase master是执行此操作的正确方法。合并将意味着将为合并创建一个提交,而不会重新设置基础。