如何将代码拉取到非当前分支?

68

假设当前所在分支为myfeature,我想要将master更新到最新状态。根据我的理解,git mergegit pull指令都只会合并到当前所在的分支。

那么有没有一种方式可以将远程分支(例如origin/master)的更改合并到另一个分支(master)中呢? 我能想到一种方法:

git stash
git checkout master
git pull origin/master
git checkout myfeature
git stash apply

有更好的方法吗?

(也许我的整个问题都错了:如果启用远程跟踪,git fetch会自动更新主分支以匹配origin/master吗?)


4
我在另一个stackoverflow帖子中找到了适合我的答案:https://dev59.com/u3A75IYBdhLWcg3wlqET基本上是这样的:git fetch <remote> <srcBranch>:<destBranch> - koral
3个回答

85
git fetch -u origin master:master

不使用checkout合并、更新和拉取Git分支

git fetch -u <remote> <remoteBranch>:<localBranch>

-u--update-head-ok 可以确保该命令在你已经检出给定分支的情况下 仍然有效,否则会产生以下错误:

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository


1
非常好!在将我的东西重新定位到当前的主干之前,省去了“切换到主干、拉取、切换到分支”的麻烦。 - Frank N

5

您说得对,拉取/合并只会合并到当前分支。

然而,您仍可以使用获取(fetch)。例如(下面的名称已更改以保护无辜者,但哈希值是真实的):

$ git branch | grep '^*'
* SOMEBRANCH
$ git rev-parse OTHER_BRANCH origin/OTHER_BRANCH
7b9b8e57cf19964b60ebda0f03a1d5da3de9e2fe
7b9b8e57cf19964b60ebda0f03a1d5da3de9e2fe
$ git fetch
7b9b8e5..1efca56  OTHER_BRANCH -> origin/OTHER_BRANCH
$ git rev-parse OTHER_BRANCH origin/OTHER_BRANCH
7b9b8e57cf19964b60ebda0f03a1d5da3de9e2fe
1efca56c08b7a0f511a3951195656a798c56aa62

在此情况下,fetch 更新了一堆 origin/ 分支。本地分支没有更新 (git rev-parse 的输出仍然相同),但是新的提交现在已经在仓库中,可以查看 (git log origin/OTHER_BRANCH, gitk --all, 等等)。
根据您的需求,这可能已经足够了。特别是您可以看到需要从 origin/master 应用到 master 上的内容,而无需离开当前分支。

好的,我明白你的意思了 - 我可以开始使用像“git branch --merged origin/master”这样的命令,而不是“git branch --merged master”。但除此之外,这只是 Git 的一个小烦人限制。 - Steve Bennett
您还可以自动化整个“stash,checkout其他分支,pull,返回到以前的分支,stash apply”序列。要查找当前所在的分支:$ if name=$(git symbolic-ref -q HEAD); then ... 然后检查 $name 是否具有 refs/heads/* 的形式(并去掉 refs/heads/ 部分)。另请参见 http://stackoverflow.com/questions/9752619/get-pretty-git-rev-name。但要注意合并失败! - torek

2
我已经开始使用GitHub的hub sync助手自动化此过程,而不是依靠获取在您正在工作的各个存储库之间更改的单个分支:

hub是一个扩展到命令行git的工具,可以帮助您在不离开终端的情况下完成日常GitHub任务。 https://hub.github.com/

$ hub sync
  • 如果本地分支已经过时了,就快进它;
  • 如果本地分支包含未推送的工作,请进行警告;
  • 如果分支看起来已经合并,并且它的上游分支已被删除,请将其删除。

hub sync 命令可以安全地更新所有本地分支到远程版本。


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