从master更新Git分支

Ion*_*icu 631 git git-branch

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

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

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

Chr*_*ken 576

您有两种选择:

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

结帐每个分支:

git checkout b1
Run Code Online (Sandbox Code Playgroud)

然后合并:

git merge origin/master
Run Code Online (Sandbox Code Playgroud)

然后推:

git push origin b1
Run Code Online (Sandbox Code Playgroud)

或者,你可以做一个rebase:

git fetch
git rebase origin/master
Run Code Online (Sandbox Code Playgroud)

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

cma*_*ter 459

你基本上有两个选择:

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

    git checkout b1
    git merge master
    # repeat for b2 and b3
    
    Run Code Online (Sandbox Code Playgroud)

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

    git可以很好地处理这种情况,它是专为在各个方向发生的合并而设计的.您可以相信它能够正确地将所有线程组合在一起.它根本不关心分支b1合并mastermaster合并b1,合并提交看起来与git完全相同.唯一的区别是,哪个分支最终指向此合并提交.

  2. 你的变形.具有SVN或类似背景的人发现这更直观.命令类似于合并情况:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    
    Run Code Online (Sandbox Code Playgroud)

    人们喜欢这种方法,因为它在所有分支中保留了线性历史.然而,这种线性历史是谎言,你应该意识到它是.考虑这个提交图:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    
    Run Code Online (Sandbox Code Playgroud)

    合并导致真实的历史:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    
    Run Code Online (Sandbox Code Playgroud)

    然而,rebase给你这个历史:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mic*_*ray 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认同)
  • re “如果你已经推送了怎么办?” --&gt; [git rebase 的黄金法则是永远不要在公共分支上使用它](https://www.atlassian.com/git/tutorials/merging-vs-rebasing)。 (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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 不要改变你与他人合作的分支机构.
  • 你应该在你将要合并的分支上进行重新定义,这可能并不总是掌握.

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`
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

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

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

git checkout backup
git merge master
git push
Run Code Online (Sandbox Code Playgroud)

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

git checkout backup
git rebase master
git push
Run Code Online (Sandbox Code Playgroud)

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


Gon*_*ica 12

令人惊讶的是,我使用的最常用方法没有被提及。在基于主干的开发风格中,这种情况很常见,这种风格master不断更新,并且从其中的一个分支开始工作。

假设master已经有了更新的代码并且您位于分支中b1。如果情况并非如此,您将需要git fetch.

因此,要更新b1中所做的更改master,您只需使用以下代码即可提取代码

git pull origin master
Run Code Online (Sandbox Code Playgroud)

当您或其他人访问其他分支并想要更新时,也必须在其他分支中执行相同的操作。


Bri*_*new 9

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


San*_*ani 9

有两种方法

  1. 您想将 master 分支合并到您的分支中

    - git checkout master
    - git pull
    - git checkout your-feature-branch
    - git merge master //resolve conflicts if any and commit
    - git push
    
    Run Code Online (Sandbox Code Playgroud)

2:如果您想在 main 之上重新调整您的更改。

 git checkout master #Switch to main branch
 git pull #Take latest
 git checkout your-feature-branch #Switch to story branch
 git pull --ff-only # Ensure branch is up to date
 git rebase -i origin master #Interactively rebase your commits on top of master. So your changes are on top of latest commits in main.
 git rebase --continue #Resolve conflicts and rebase --continue to continue with next commits
 git push -f origin your-feature-branch # As you have rewritten the commit history, you have to **force push** the commits
Run Code Online (Sandbox Code Playgroud)


小智 6

从主更新你的分支:

  git checkout master
  git pull
  git checkout your_branch
  git merge master
Run Code Online (Sandbox Code Playgroud)


小智 6

  1. git结帐大师
  2. git checkout feature_branch
  3. git rebase 大师
  4. git push -f

你需要在对 master 进行 rebase 后做一个强推