从master更新Git分支

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

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

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

1160107 次浏览

你有两个选择:

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

检查每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推送:

git push origin b1

或者,您可以执行rebase:

git fetchgit rebase origin/master

您可以合并,也可以使用git樱桃选择跨分支应用单个提交。

git rebase master是正确的方法。合并意味着将为合并创建一个提交,而rebasing则不会。

如果你一直断断续续地在一个分支上工作,或者在你工作的时候在其他分支上发生了很多事情,最好将你的分支重新建立在master上。这样可以保持历史整洁,让事情更容易跟踪。

git checkout mastergit pullgit checkout local_branch_namegit rebase mastergit push --force # force required if you've already pushed

备注:

  • 不要重设你与他人合作过的分支。
  • 您应该重新基于您将合并到的分支,该分支可能并不总是主分支。

有一章是关于重新基于http://git-scm.com/book/ch3-6.html的,还有网络上的大量其他资源。

你基本上有两个选择:

  1. 您合并。这实际上非常简单,是一个完全本地的操作:

    git checkout b1git merge master# repeat for b2 and b3

    这使得历史与发生的完全相同:您从master分叉,对所有分支进行更改,最后将master的更改合并到所有三个分支中。

    git可以很好地处理这种情况,它是为同时在各个方向发生的合并而设计的。你可以相信它能够正确地将所有线程组合在一起。它根本不在乎分支b1合并master,还是master合并b1,合并提交对git来说看起来都是一样的。唯一的区别是,哪个分支最终指向这个合并提交。

  2. 你重新定位。具有SVN或类似背景的人会觉得这更直观。命令类似于合并情况:

    git checkout b1git 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。它有它的用途。但是无论何时你使用它,你都需要意识到你在历史上撒谎的事实。你至少应该编译测试新的提交。

@cmaster做出了最详细的回答。简而言之:

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

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

使用主分支副本更新(备份)等其他分支。您可以按照任一方式(rebase或合并)…

  1. 重新定位(不会对备份分支进行任何额外的提交)。
  2. 合并分支(将有一个额外的自动提交到备份分支)。

    注意:Rebase只不过是建立一个新基地(一个新副本)

git checkout backupgit merge mastergit push

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

git checkout backupgit rebase mastergit push

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

这个问题有两种选择。

1)git rebase

2)git合并

只有diff与以上两者合并的情况下,会在历史中有额外的提交

1)git检出分支(b1、b2、b3)

2)git rebase的起源/主(在冲突的情况下,通过执行git rebase在本地解决-继续)

3)git推送

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

1)git check out"your_branch"(b1, b2, b3)

2)git合并主

3)git推送

从master更新你的分支:

  git checkout mastergit pullgit checkout your_branchgit merge master
  1. git检出主机
  2. git拉取
  3. git签出feature_branch
  4. git rebase master
  5. git push-f

你需要在和主人重归于好后用力推一把

如果您想恢复上次提交并删除日志历史记录

使用下面的命令可以让你说你想去以前的提交,它的提交ID为SHA-71 e 2 e 57458 b de 883 a 37 b 332035 f 784 c 6653 ec 509,你可以指向这个提交,它不会在这个提交之后显示任何日志消息,之后所有的历史记录都将被删除。

git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master

有两种方法

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

    - git checkout master- git pull- git checkout your-feature-branch- git merge master //resolve conflicts if any and commit- git push

2:如果您想将更改重新建立在main之上。

 git checkout master #Switch to main branchgit pull #Take latestgit checkout your-feature-branch #Switch to story branchgit pull --ff-only # Ensure branch is up to dategit 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 commitsgit push -f origin your-feature-branch # As you have rewritten the commit history, you have to **force push** the commits

对于所有发现此线程寻找易于使用且一致的解决方案以将当前分支与master上的最新更改合并的人:

您可以将其添加到shell配置中:

alias merge='currentBranch=$(git rev-parse --abbrev-ref HEAD) && git checkout master && git pull && git checkout $currentBranch && git merge master'

这个别名适用于5个命令:

currentBranch=$(git rev-parse --abbrev-ref HEAD) # gets your current branch(needed for point 4)git checkout master # checks out mastergit pull # gets latest changes from mastergit checkout $currentBranch # checks out the in point 1 saved branchgit merge master # merges your current branch with master

添加别名后,您可以简单地使用命令“合并”来“更新”您当前正在处理的分支。

令人惊讶的是,我使用的最常见的方法没有被提及。当工作基于Trunk的开发风格时,这很常见,其中main不断更新,一个人从它的分支工作。

假设main已经有了更新的代码,并且您在分支b1中。如果不是这样,您将需要git fetch

因此,要使用main中的更改更新b1,您可以简单地使用

git pull origin main

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