从master更新Git分支

时间:2010-10-06 21:18:20

标签: git git-branch

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

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

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

10 个答案:

答案 0 :(得分:525)

您有两种选择:

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

结帐每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推:

git push origin b1

或者,你可以做一个rebase:

git fetch
git rebase origin/master

答案 1 :(得分:427)

您基本上有两种选择:

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

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

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

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

    这样做的结果可能是,您无法区分三个提交中的哪一个EFG实际引入了回归,从而减少了git bisect

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

答案 2 :(得分:230)

git rebase master是执行此操作的正确方法。合并意味着将为合并创建提交,而不进行重组。

答案 3 :(得分:46)

如果您一直在分支机构上工作,或者在您开展某项工作时在其他分支机构中发生了很多事情,那么最好将您的分支机构重新分配到主服务器上。这使历史保持整洁,使事情更容易遵循。

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

答案 4 :(得分:13)

@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时,它会创建一个额外的提交,但这很便宜。提交不需要花费。

答案 5 :(得分:12)

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

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

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

  3. git checkout backup
    git merge master
    git push
    

    (重复其他分支,如有任何类似backup2&amp; etc ..,)

    git checkout backup
    git rebase master
    git push
    

    (重复其他分支,如有任何类似backup2&amp; etc ..,)

答案 6 :(得分:9)

您可以合并,也可以使用git cherry-pick在分支机构中应用单个提交。

答案 7 :(得分:5)

要通过母版更新您的分支机构:

  git checkout master
  git pull
  git checkout your_branch
  git merge master

答案 8 :(得分:1)

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

1)git rebase

2)git merge

在合并的情况下,只有两者同时使用diff才会在历史记录中有额外的提交

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

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

3)git push

或者,git merge选项是类似的方式

1)git checkout“ your_branch”(b1,b2,b3)

2)git merge master

3)git push

答案 9 :(得分:1)

  1. git checkout master
  2. git pull
  3. git checkout feature_branch
  4. git rebase master
  5. git push -f

在对抗大师之后,需要大力推动