如何使用 git 同时拉取多个分支?

如何使用 git 同时拉取多个分支?

在 repo 中我有多个分支,其中包括“master”和“develop”,它们被设置为跟踪远程分支“origin/master”和“origin/develop”。

我是否可以指定希望 master 和 development 同时合并(快进)?

当我git pull现在这样做时,我得到了如下结果:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

所有远程分支都已获取,但只有我当前所在的分支与其对应的远程分支合并。

所以我必须这么做git checkout master......

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

...然后git pull再次切换回开发,以获得所需的结果。

我知道我可以创建别名/脚本来执行这些步骤。但如果可能的话,我想避免这样做,因为它容易出错并且效率不高
编辑:好的,让我重新表述一下。我的目标不是阻止或反对 git 的脚本/别名自定义。如果存在内置解决方案,我更喜欢它 :)

答案1

您可以设置一个git fetch与 refspecs 一起使用的别名,以便仅使用一个命令即可快速合并您的分支。在您的用户.gitconfig文件中将其设置为别名:

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

用法:git sync

其工作原理如下:

  1. git checkout --quiet HEAD直接检查你当前的提交,让你进入分离头状态。这样,如果您处于masterdevelop状态,则可以将工作副本与这些分支指针分离,从而允许移动它们(当您的工作副本已签出它们时,Git 不会允许您移动分支引用)。

  2. git fetch origin master:master develop:develop使用 refspecs 来fetch快速转发本地存储库中的masterdevelop分支。语法基本上告诉 Git“这里是 形式的 refspec <source>:<destination>,获取<destination>并快速转发到 相同的点<source>”。因此,别名中的源是来自 的分支origin,而目标是这些分支的本地存储库版本。

  3. 最后,git checkout --quiet -检查您最后所在的分支,无论之前的命令是否失败。因此,如果您在master运行 时处于 状态git sync,并且一切成功,您将离开分离的头部状态并检查最近更新的master

也可以看看我对 git 的回答是:在不检出的情况下更新本地分支?

答案2

git fetch --update-head-ok origin master:master develop:develop

这是@40XUserNotFound 答案的简短版本,请注意它可能会移动你的 HEAD,在运行此命令之前请确保你有一个干净的工作目录。

--update-head-ok做什么这个答案通过分离 HEAD 来执行此操作,相反,它只是告诉 fetch 可以移动 HEAD(您的工作目录所在的位置)。

答案3

安装起床git-up。它为您提供了提取存储库中所有本地分支的命令。

答案4

git 似乎没有内置选项来拉取多个分支。至少在 1.8.0 版本中没有。尽管@Cupcake 的回答已经很接近了。

然而@jjlin 的评论让我意识到至少我不需要拉两次。

因此稍微更有效的序列是:

git pull
git checkout master
git merge origin/master
git checkout -

最终我不可避免地创建了一个别名,但决定将其拉出,并专注于快速转发不同的分支。

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

当然,未经测试,此别名假定我提供了一个有效的 ff'able 分支名称作为第一个参数,否则将具有未定义的行为。对于具有两个以上分支的用例,它也不是最佳选择,但它可以满足我目前的需求。

git pull
git ffwd master

相关内容