在 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
。
其工作原理如下:
git checkout --quiet HEAD
直接检查你当前的提交,让你进入分离头状态。这样,如果您处于master
或develop
状态,则可以将工作副本与这些分支指针分离,从而允许移动它们(当您的工作副本已签出它们时,Git 不会允许您移动分支引用)。git fetch origin master:master develop:develop
使用 refspecs 来fetch
快速转发本地存储库中的master
和develop
分支。语法基本上告诉 Git“这里是 形式的 refspec<source>:<destination>
,获取<destination>
并快速转发到 相同的点<source>
”。因此,别名中的源是来自 的分支origin
,而目标是这些分支的本地存储库版本。最后,
git checkout --quiet -
检查您最后所在的分支,无论之前的命令是否失败。因此,如果您在master
运行 时处于 状态git sync
,并且一切成功,您将离开分离的头部状态并检查最近更新的master
。
答案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