繁体   English   中英

从 master 更新 Git 分支

[英]Update Git branches from master

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

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

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

您有两个选择:

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

结帐每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推:

git push origin b1

或者,你可以做一个rebase:

git fetch
git rebase origin/master

您基本上有两种选择:

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

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

如果您一直在断断续续地处理一个分支,或者在您处理某事时在其他分支中发生了很多事情,最好将您的分支重新设置为 master。 这使历史保持整洁,并使事情更容易遵循。

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

注意事项:

  • 不要对你与其他人合作过的分支进行 rebase。
  • 您应该基于要合并的分支,该分支可能并不总是主分支。

http://git-scm.com/book/ch3-6.html上有一章是关于变基的,网上还有很多其他资源。

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

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

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

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

 git checkout backup git merge master git push

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

 git checkout backup git rebase master git push

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

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

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

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

从主更新你的分支:

  git checkout master
  git pull
  git checkout your_branch
  git merge 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.js 之上重新调整您的更改。

 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

对于发现此线程的每个人都在寻找易于使用且一致的解决方案以将当前分支与 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 master
git pull # gets latest changes from master
git checkout $currentBranch # checks out the in point 1 saved branch
git merge master # merges your current branch with master

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

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

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

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

git pull origin main

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

这个问题有两种选择。

1) git rebase

2) git 合并

在合并的情况下,只有与上述两者的差异,才会在历史记录中进行额外的提交

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

2) git rebase origin/master (如果发生冲突,通过执行 git rebase --continue 在本地解决)

3) git 推送

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

1) git checkout "your_branch"(b1,b2,b3)

2)git合并主

3) git 推送

以防万一,如果您想恢复到最后一次提交并删除日志历史记录

使用下面的命令假设您要转到具有 commitID SHA - 71e2e57458bde883a37b332035f784c6653ec509的上一个提交,您可以指向此提交,它在此提交后不会显示任何日志消息,之后所有历史记录都将被删除。

git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM