从master更新Git分支

Ionuț Staicu 631 git git-branch

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

  • 我有四个分支(master,b1,b2和b3).
  • 在我使用b1-b3之后,我意识到我在分支主机上有一些改变,应该在所有其他分支中.
  • 我改变了我需要的东西master......这是我的问题:

如何使用master分支代码更新所有其他分支?

Chris Kooken.. 576

您有两种选择:

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

结帐每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推:

git push origin b1

或者,你可以做一个rebase:

git fetch
git rebase origin/master

  • 你正在将主人合并到b1.为什么你有'推动原点大师'......没有意义.你没有改变主分支.我认为119 upvote是错误的:/ (20认同)
  • 不要使用合并方法,使用`git rebase master`是正确的答案 (17认同)
  • 我对这种方法很担心.当我运行git log --graph时,图表显示master实际上已合并到主题分支.从长远来看,这会导致任何问题吗?我认为最佳实践总是将主题分支合并回主人.请评论. (13认同)
  • 对于以后阅读的我们来说,@ Kursion对错字的担心已通过作者的编辑得到解决。另外,下面第二个最高的答案与该答案基本相同,但带有分支结构图和关于您为什么不希望重新设置基准的警告。 (3认同)
  • 如果您要使用合并工作流程,请留意此问题:http://www.randyfay.com/node/89 (2认同)

cmaster.. 459

你基本上有两个选择:

  1. 你合并.这实际上非常简单,并且是一个完美的本地操作:

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

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

    git可以很好地处理这种情况,它是专为在各个方向发生的合并而设计的.您可以相信它能够正确地将所有线程组合在一起.它根本不关心分支b1合并mastermaster合并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
    

    然而,rebase给你这个历史:

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

    关键是,提交E',F'并且G'从未真正存在,并且可能从未经过测试.他们甚至可能无法编译.通过rebase创建无意义的提交实际上非常容易,特别是当改变master对于开发很重要时b1.

    这样做的结果可能是,你无法分清哪三个提交的E,FG实际上引入了回归,减少的价值git bisect.

    我不是说你不应该使用git rebase.它有它的用途.但是每当你使用它时,你需要意识到你在撒谎的事实.你应该至少编译测试新的提交.

  • 历史是谎言 (8认同)
  • 作为一个长期的SVN用户,我更喜欢rebase的合并选项:使用任何版本控制,保持对所做更改及其原因的准确记录非常非常重要.我可以看到rebase的吸引力是为了简化明显的历史记录,但是你应该回过头来添加E',F',G'的提交注释 - 并且最好将rebase自动添加到这些注释中.否则,如果构建/测试/测试部署过程在G'上中断,则必须确定在没有完整信息的情况下进行更改的原因. (2认同)

Michael J. G.. 234

git rebase master是这样做的正确方法.合并意味着将为合并创建提交,而重新设置则不会.

  • 当你已经推送到原点时,如果你重新定义,你将重写提交历史记录,这将与你的远程分支冲突.我认为rebase只能用于拉动或者你没有推到远程分支. (52认同)
  • rebase和merge两个作品,rebase最适合私人分支,因为它提供了更清晰的历史图表.这个答案是最好的 (7认同)
  • 如果您是唯一一个在远程分支上工作的人,您可以使用git push --force origin功能来更新具有重新定位的本地分支的远程分支.http://stackoverflow.com/questions/8939977/git-push-rejected-after-feature-branch-rebase (6认同)
  • 需要更清楚地说明清晰度(对于单用户或小团队来说很好)或凌乱的事实(对于多贡献者代码分支 - 可维护性所需要的(根据我的经验 - YMMV))之间的权衡. (5认同)

小智.. 50

如果您一直在分支机构上工作,或者在您从事某些工作时在其他分支机构中发生了很多事情,那么最好将您的分支机构重新设置为主机.这使历史保持整洁,使事情更容易遵循.

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上有一章关于变基的内容,以及网上的大量其他资源.


小智.. 16

@cmaster做了最精心的回答.简单来说:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

您不应该重写分支历史记录,而是将它们保持在实际状态以供将来引用.在合并到master时,它会创建一个额外的提交,但这很便宜.提交不需要花费.


小智.. 12

使用主分支副本更新其他分支,例如(备份).你可以按照任何一种方式(rebase或merge)......

  1. 做rebase(不会对备份分支进行任何额外的提交).
  2. 合并分支(将自动额外提交到备份分支).

    注意:Rebase只是建立一个新的基础(一个新的副本)

git checkout backup
git merge master
git push

(如果有任何类似backup2等的话,请重复其他分支..)

git checkout backup
git rebase master
git push

(如果有任何类似backup2等的话,请重复其他分支..)


Brian Agnew.. 9

您可以合并,或者您可以使用git cherry-pick在分支机构之间应用单个提交.