893

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

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

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

4

11 回答 11

845

你有两个选择:

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

检查每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推:

git push origin b1

或者,您可以进行变基:

git fetch
git rebase origin/master
于 2010-10-06T21:21:02.023 回答
668

你基本上有两个选择:

  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
    

    然而,变基会为您提供以下历史记录:

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

    关键是,提交E'F'G'从未真正存在过,并且可能从未经过测试。他们甚至可能无法编译。实际上,通过 rebase 创建无意义的提交非常容易,尤其是masterb1.

    这样做的结果可能是,您无法区分三个提交中的哪一个EF实际上G引入了回归,从而降低了git bisect.

    我并不是说你不应该使用git rebase. 它有它的用途。但是,无论何时使用它,您都需要意识到您在历史上撒谎的事实。你至少应该编译测试新的提交。

于 2015-02-13T17:44:08.027 回答
260

git rebase master是这样做的正确方法。合并意味着将为合并创建提交,而变基则不会。

于 2012-04-20T06:03:38.397 回答
71

如果您一直在断断续续地在一个分支上工作,或者在您一直在处理某事时在其他分支上发生了很多事情,那么最好将您的分支重新定位到 master 上。这使历史保持整洁,并使事情更容易理解。

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

于 2013-10-11T11:14:14.283 回答
28

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

于 2017-01-18T10:08:05.247 回答
16

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

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

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

git checkout backup
git merge master
git push

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

git checkout backup
git rebase master
git push

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

于 2018-01-17T13:54:56.990 回答
11

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

于 2010-10-06T21:27:18.490 回答
10
  1. git结账大师
  2. git 拉
  3. git checkout feature_branch
  4. git rebase 大师
  5. git 推送 -f

在对 master 进行 rebase 后,您需要进行有力的推动

于 2020-11-06T06:10:05.273 回答
9

从 master 更新您的分支:

  git checkout master
  git pull
  git checkout your_branch
  git merge master
于 2020-01-10T10:28:55.517 回答
1

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

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

git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master
于 2021-11-25T11:28:39.830 回答
0

这个问题有两种选择。

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推送

于 2019-09-14T11:45:51.987 回答