我是 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
是执行此操作的正确方法。合并将意味着将为合并创建一个提交,而不会重新设置基础。