从主更新Git分支


675

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

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

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


3
我在这里找到了答案:如何使用git-merge合并选择性文件?
wjandrea

58
Git使另一个简单的任务变得困难。Git开发人员应在其SDLC循环中使用堆栈溢出作为反馈。30万人应该表明Git的工作流程存在严重问题。他们需要雇用UX专家,因为他们显然不能自己正确地进行混合。
jww

Answers:


620

您有两种选择:

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

结帐每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推送:

git push origin b1

或者,您可以重新设置基准:

git fetch
git rebase origin/master

15
我对此方法感到担心。当我运行git log --graph时,该图显示母版实际上已合并到主题分支。从长远来看,这会引起任何问题吗?我认为最佳做法是始终将主题分支合并回主站点。请评论。
Patrick

2
如果要使用合并工作流,请注意以下问题:randyfay.com/node/89
Hampus Ahlgren

22
您正在将master合并到b1中。你为什么got push origin master...没有道理。您没有更改主分支。我认为119 upvote是一个错误:/
Yves Lange

22
不要使用合并方法,使用git rebase master是正确的答案
Weston Ganger

6
对于以后阅读的我们来说,@ Kursion对错字的担心已通过作者的编辑得到解决。另外,下面第二个最高的答案与该答案基本相同,但带有分支结构图和关于您为什么不希望重新设置基准的警告。
超过剧场'18

495

您基本上有两个选择:

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

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

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

    git可以很好地处理这种情况,它是专为同时发生在各个方向的合并而设计的。您可以信任它能够正确地将所有线程聚集在一起。它根本不在乎分支是b1merges master还是mastermerges 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
    

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

    其结果可能是,您无法区分这三个提交中的哪个EFG实际上引入了回归,减少的价值git bisect

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


我正在合并另一个源分支(不是master分支),添加到这个不错的答案的其他步骤是在合并(在本地拥有最新代码)之前在本地仓库上对其进行更新:git checkout <source branch> git pull。然后继续进行上述操作:git checkout b1...
Rod 2015年

3
作为SVN的长期用户,我更喜欢使用merge选项而不是rebase:使用任何版本控制,对所做的更改及其原因保持准确的记录非常非常重要。我可以看到rebase简化了明显的历史记录的吸引力,但是您应该返回并添加到E',F',G'的提交注释中,并且最好将rebase自动添加到这些注释中。否则,如果构建/测试/测试部署过程在G'上中断,则您必须找出为什么在没有完整信息的情况下进行更改的原因。
WillC '16

12
历史是个谎言
piratemurray

谢谢我使用“ git merge any-branch-name”将一个分支代码合并到另一个分支。在本地时,我可以在分支2上测试分支1的代码
Priti

1
@blamb冲突发生的同时与合并git mergegit rebase。没有回避这些。git rebase的优点是可以隐藏重定基础的几个阶段(即,将同一分支按顺序重定到几个不同的提交中,以减少每个阶段的冲突量)。尽管如此,仅凭历史记录就存在一个事实,这使得在这样一个多阶段的重新记录过程中变得更容易了……这就是为什么我总是喜欢合并,即使这意味着我需要用几次合并提交来使历史混乱。
cmaster-恢复莫妮卡

238

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


52
当您已经推向原点的时候该怎么办,如果您重新定基,将重写提交历史记录,这将与远程分支冲突。我认为应该仅在拉动或未将其推送到远程分支时使用rebase。
马特·史密斯

6
如果您是唯一在远程分支上工作的人,则可以执行git push --force origin功能,以使用重新建立基础的本地分支来更新远程分支。stackoverflow.com/questions/8939977/…–
stormwild

7
重新设置基础并合并两者,重新设置最适合私有分支,因为它提供了更清晰的历史记录图。这个答案是最好的
Junjun Liu

5
需要更清楚地了解清晰度(对于单用户或小型团队来说是伟大的)或凌乱的事实(对于多贡献者代码分支-可维护性所必需(根据我的经验-YMMV))之间的折衷。
WillC '16

1
关于“如果您已经推送了该怎么办?” -> git rebase的黄金法则是永远不要在公共分支上使用它
Trevor Boyd Smith,

53

如果您一直在断断续续地进行分支工作,或者在进行某些工作时其他分支发生了很多事情,那么最好将分支重新建立到主分支上。这样可以使历史记录保持整洁,并使事情更容易遵循。

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上有一个关于变基的章节,以及网络上其他资源的负载。


感谢您的简单解决方案
其他高个子家伙

18

@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时,它会创建一个额外的commit,但这很便宜。承诺不花钱。


13

用主分支副本更新其他分支(如(备份))。您可以按照任何一种方式进行操作(变基或合并)...

  1. 进行基准化(不会对备份分支进行任何额外的提交)。
  2. 合并分支(将自动向备份分支提交额外的提交)。

    注意:Rebase就是建立新的基础(新副本)

git checkout backup
git merge master
git push

(如果有backup2等,请重复其他分支。)

git checkout backup
git rebase master
git push

(如果有backup2等,请重复其他分支。)



1

有两个选项可以解决此问题。

1)git rebase

2)git合并

在合并的情况下,只有两个以上的差异都将在历史记录中有额外的提交

1)git checkout分支(b1,b2,b3)

2)git rebase起源/主服务器(如果发生冲突,则通过执行git rebase --continue在本地解决)

3)git push

另外,git merge选项是类似的方式

1)git checkout“您的分支”(b1,b2,b3)

2)git合并大师

3)git push


0

从母版更新您的分支:

  git checkout master
  git pull
  git checkout your_branch
  git merge master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.