我是Git的新手,现在处于这种情况:
- 我有四个分支(master,b1,b2和b3)。
- 在研究了b1-b3之后,我意识到我需要在分支主控上进行一些更改,这些更改应该在所有其他分支中进行。
- 我更改了所需的东西
master
,这是我的问题:
如何使用master
分支代码更新所有其他分支?
我是Git的新手,现在处于这种情况:
master
,这是我的问题:如何使用master
分支代码更新所有其他分支?
Answers:
您有两种选择:
第一个是合并,但这会为合并创建一个额外的提交。
结帐每个分支:
git checkout b1
然后合并:
git merge origin/master
然后推送:
git push origin b1
或者,您可以重新设置基准:
git fetch
git rebase origin/master
got push origin master
...没有道理。您没有更改主分支。我认为119 upvote是一个错误:/
git rebase master
是正确的答案
您基本上有两个选择:
您合并。这实际上很简单,并且是一个完美的本地操作:
git checkout b1
git merge master
# repeat for b2 and b3
这样就完全保留了历史:您从master分支,对所有分支进行了更改,最后将master的更改合并到所有三个分支中。
git
可以很好地处理这种情况,它是专为同时发生在各个方向的合并而设计的。您可以信任它能够正确地将所有线程聚集在一起。它根本不在乎分支是b1
merges master
还是master
merges 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
关键在于,commits E'
,,F'
以及G'
从未真正存在过,并且可能从未进行过测试。它们甚至可能无法编译。实际上,通过rebase创建不必要的提交非常容易,尤其是当master
对于中的开发很重要时b1
。
其结果可能是,您无法区分这三个提交中的哪个E
,F
和G
实际上引入了回归,减少的价值git bisect
。
我并不是说你不应该使用git rebase
。它有其用途。但是,无论何时使用它,都需要意识到自己在说谎历史。而且您至少应该编译测试新提交。
git checkout <source branch>
git pull
。然后继续进行上述操作:git checkout b1
...
git merge
和git rebase
。没有回避这些。git rebase
的优点是可以隐藏重定基础的几个阶段(即,将同一分支按顺序重定到几个不同的提交中,以减少每个阶段的冲突量)。尽管如此,仅凭历史记录就存在一个事实,这使得在这样一个多阶段的重新记录过程中变得更容易了……这就是为什么我总是喜欢合并,即使这意味着我需要用几次合并提交来使历史混乱。
git rebase master
是执行此操作的正确方法。合并将意味着将为合并创建一个提交,而不会重新设置基础。
如果您一直在断断续续地进行分支工作,或者在进行某些工作时其他分支发生了很多事情,那么最好将分支重新建立到主分支上。这样可以使历史记录保持整洁,并使事情更容易遵循。
git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed
笔记:
在http://git-scm.com/book/ch3-6.html上有一个关于变基的章节,以及网络上其他资源的负载。
用主分支副本更新其他分支(如(备份))。您可以按照任何一种方式进行操作(变基或合并)...
合并分支(将自动向备份分支提交额外的提交)。
注意:Rebase就是建立新的基础(新副本)
git checkout backup git merge master git push
(如果有backup2等,请重复其他分支。)
git checkout backup git rebase master git push
(如果有backup2等,请重复其他分支。)
您可以合并,也可以使用git cherry-pick在分支之间应用单个提交。