从主更新Git分支

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

  • 我有四个分支(master,b1,b2和b3)。
  • 在b1-b3工作之后,我意识到我应该在所有其他分支上对分支主人进行更改。
  • 我改变了我在master所需要的…这是我的问题:

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

你有两个select:

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

结帐每个分支:

 git checkout b1 

然后合并:

 git merge origin/master 

然后推:

 git push origin b1 

或者,你可以做一个rebase:

 git fetch git rebase origin/master 

你基本上有两个select:

  1. 你合并。 这其实很简单,而且是一个完美的本地操作:

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

    这就像发生的事情一样留下了历史:你从主人那里分stream,你改变了所有的分支,最后你把主人的改变并入所有三个分支。

    git可以很好的处理这种情况,同时也是为了合并而devise的。 你可以相信它能够正确地把所有的线程连在一起。 它根本不关心是否分支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 

    但是,这个重新发行给了你这个历史:

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

    关键是, E'F'G'的提交从来没有真正存在过,而且可能从未经过testing。 他们甚至可能不会编译。 实际上通过rebase创build无意义的提交是非常容易的,特别是当master的变化对b1的开发很重要的时候。

    这样做的结果可能是,你不能区分EFG这三个提交中哪一个实际上引入了一个回归,从而降低了git bisect的价值。

    我不是说你不应该使用git rebase 。 它有它的用途。 但是每当你使用它的时候,你都需要意识到你在讲述历史。 而且你至less应该编译testing新的提交。

git rebase master是这样做的正确方法。 合并意味着将为合并创build一个提交,而重新分配不会。

如果你一直在一个分支上工作,或者在其他分支上发生了很多事情,那么最好把分支重新分配给主分支。 这保持了历史的整洁,使事情更容易遵循。

 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上有一章关于重新定义的章节,以及networking上的大量其他资源。;

你可以合并,或者你可以通过使用git樱桃挑选跨分支申请个人提交。

@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` 

您不应该重写分支历史logging,而应将其保留为实际状态以备将来参考。 当合并到主,它创build一个额外的提交,但这是便宜的。 提交不花钱。