在不同分支上进行git pull

245

如果我正在一个分支上工作,然后意识到我需要将另一个分支合并到我的分支中,这是我的当前工作流程(以此示例为例,假设我正在处理my-branch并想要合并到 master 分支):

git stash
git checkout master
git pull
git checkout my-branch
git merge master
git stash pop

在git中,是否有一种方法可以拉取除当前已检出的分支之外的其他分支?或者说是否有更好的方法来做到这一点?

例如,这是我想要做的事情(再次假设我在my-branch上并且想将master合并进来):

git pull master
git merge master

git-pull手册说,git pull只是get fetch后跟着git merge,那么有没有办法在当前分支之外的分支上执行git pull的合并部分呢?

或者我所要求的根本不可能实现?


你可以在my-branch上进行get pull master操作,完成工作后,你可以前往master分支并执行git merge my-branch。 - Alexandre Mendes
我不喜欢git pull,因为它可能在你不知情的情况下引入合并提交,并且我希望将所有跟踪分支更新到最新状态。为此,我编写了一个插件,它可以获取并快速前进任何跟踪分支。我和其他人已经使用它相当长一段时间了,它绝对是一个省时的工具。好处是,如果不是快速前进合并,它会让你解决并改进它。这对我们来说很有效,因为我们经常使用rebase工作流程。 - John Szakmeister
啊,我明白了...你想要将你的分支与主分支同步。我的工具无法做到这一点。 - John Szakmeister
@nobled 是的...我一开始误解了你想做什么。我以为你想要将master更新并避免切换分支--在这种情况下,我的工具会有所帮助。但你还想将master合并到你的分支中,这个工具对此无济于事。 - John Szakmeister
3
这个回答解决了你的问题吗?不使用checkout合并、更新和拉取Git分支 - icc97
显示剩余2条评论
9个回答

407
我找到了一个适合我的 Git 命令:

Fetch

git fetch origin master:master

以上的语法如下(感谢@Adam):
git fetch <remote> <src>:<dst>

合并

然后(如果您想立即合并):

git merge master

11
如果你想在不同的本地分支名称下拉取分支,这个语法其实很有用。 - DustWolf
7
这应该是被采纳的答案,因为它完全回答了问题。 被采纳的答案没有提供正确的命令,并且根据问题的描述执行了出人意料的操作。 - stricq
10
get fetch origin branch:branch与从branch调用的git pull是否完全相同? - C. Binair
18
澄清一下:这里的语法是:git fetch <remote> <src>:<dst> - Adam
2
如果我因为某些原因不想获取所有分支,我可以只执行 git fetch origin branch2,然后从 origin/branch2 合并到我的工作分支。我还可以澄清本地的 branch2 不会被更新。每当我切换到 branch2 时,我也必须执行 git merge origin/branch2 - Seangle
显示剩余7条评论

68
我们可以使用git pull命令从同一代码库的另一个分支获取更改,示例如下:
$ git pull origin <target-branch>

请参阅man git-pullEXAMPLES部分:
   •   Merge into the current branch the remote branch next:

           $ git pull origin next

8
你应该解释你的答案或至少添加一些参考资料,这样其他人才能完全理解你的答案。 - devasia2112
让我们在开头添加这个结账部分,以确保我们正在拉取正确的分支: git checkout <目标分支> - nirojshrestha019
3
“我们可以从另一个分支获取更改…”这个标题非常误导。需要更改为“我们可以合并来自另一个分支的更改…”。 - dqbydt
是的,这个答案误导了问题,如果你在你的分支上运行它,会造成相当大的混乱。 - laurent

43

试一下这个:

git pull yourRepositoryName master

11
我尝试过这个方法,但我猜我没有意识到你需要输入的RepositoryName是什么。它不是仓库的实际名称,而是用于检出仓库的url。例如:git pull git@github.com:foo/bar.git master - nobled
22
如果你使用默认的"origin"别名,你应该运行"git pull origin master"。 - nobled
3
没错。你可以使用 git remote add yourAlias https://github.com/yourGitHubRepo´ 来指定自己的别名。 - Robert Kraaijeveld
8
如果有人需要,git remote -v 命令将显示任何别名及其对应的 URL。这是关于别名的更多信息:http://gitref.org/remotes/。 - nobled
6
这并没有回答这个问题。这个命令会将给定的分支合并到你当前的分支中。要找到正确的命令,请查看Chris的回答。它也拥有最多的票数。 - stricq
显示剩余3条评论

35

将分支branch1的更改合并到分支branch2

假设您有以下分支:

  • master
  • branch1
  • branch2

所以你想要将分支branch1的更改合并到分支branch2。这里是你可以做的事情:

git checkout branch2
git pull origin branch1

2
@GustavoParrado 这个问题是关于在不同分支上进行git pull。因此,虽然我正在将branch1拉到branch2,但这也是一个相关的答案。 - nirojshrestha019

15

你也可以尝试这个:

git fetch
git merge origin/master

这不会更新您本地的 master 指针,但它将最新的 origin/master 合并到您当前的本地分支中。


如果我的本地master指针没有更新,那么从master合并到my-branch的合并不会找到任何要合并的更改吗?(假设在运行git fetch之前,我已经将master合并到了my-branch中,并且fetch在master中发现了更改) - nobled
假设您正在master分支上。git pull实际上只是git fetchgit merge origin/master的快捷方式。fetch部分会更新所有远程跟踪指针(origin/masterorigin/whatever)并下载所有相关对象。这不执行合并 - 这意味着现在您可以选择要将什么合并到哪里。 - Peter
1
这是一篇不错的阅读材料,其中有一些很好的图表,用来说明这个主题:https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches - Peter

5

如果您通常将一些远程分支合并到自己的“feature/*”分支中,比如“master”,“develop”或“release/*”,那么最好的策略不是合并,而是在一个远程分支上进行变基。然后,您的分支提交将被应用于其他分支历史的顶部。这使得您可以快速地将其合并进入该远程分支。

git pull origin master
git rebase master

3
坚实的方法是:
git checkout master
git pull --ff origin master
git checkout devel
# git merge --ff devel

所以这里有一个别名。

git config --global alias.update-branch '! bash -c "X1=\`git symbolic-ref HEAD 2> /dev/null | cut -b 12-\`; echo pulling branch $1 ... && git checkout $1 && git pull --ff origin $1 && git checkout \$X1 "'

# call it from 'devel' branch:
git update-branch master

您可以对其进行改进以符合您的要求,例如立即将主分支合并到当前分支中,...


0

步骤1:

git checkout yourBranch

步骤2:

git fetch origin master

步骤三:

git pull origin master

3
FYI:第二步(git fetch)是不必要的,因为第三步(git pull)在内部执行了获取操作。这在 https://git-scm.com/docs/git-pull 的第一行就有解释。 - Nik O'Lai

0
如果您需要从一个本地分支拉取到另一个本地分支,这是我使用的方法。以此示例为例:
$ git branch
  master
  branch1 

假设您需要在branch1上进行错误修复,因此您从它创建了一个名为branch2的新分支,并将其拉到本地repo。
远程树:
            C0    C1    C2
Master      x------x
                   |
Branch1            x-----x
                   |
Branch2            x-----x

本地的树:

            C0    C1    C2
Master      x------x
                   |
Branch1            x-----x
                   |
Branch2            x-----x

你忘记切换到branch2并在branch1上进行了bugfix,现在看起来像这样:

远程树:

            C0    C1    C2
Master      x------x
                   |
Branch1            x-----x
                   |
Branch2            x-----x

本地的树:

            C0    C1    C2    C3
Master      x------x
                   |
Branch1            x-----x-----x
                   |
Branch2            x-----x

正如您所看到的,branch1 中有我们需要的数据,但是只存在于本地而不是远程

所以我们无法执行以下操作:

$ git pull origin branch1

在这里我们需要做的是只需输入 . 即可。

$ git checkout branch2
$ git pull . branch1     ✔️

现在你可以在branch2中看到错误修复。然后你可以切换到branch1并且撤销最后一次提交,这样没有人会知道你的失误。现在它看起来像这样:

远程树:

            C0    C1    C2
Master      x------x
                   |
Branch1            x-----x
                   |
Branch2            x-----x

本地的树:

            C0    C1    C2    C3
Master      x------x
                   |
Branch1            x-----x
                   |
Branch2            x-----x-----x

希望你懂得使用 Git :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接