如何“ git pull”到不是当前分支的分支?


126

在分支git pull上运行时master,通常从中拉出origin/master。我在另一个名为的分支中newbranch,但是我需要运行一个git pull从from origin/master到in的命令,master但是git checkout在拉取完成之前,我无法运行来更改选定的分支。有没有办法做到这一点?

为了提供一些背景信息,存储库存储了一个网站。我进行了一些更改,newbranch并通过将网站切换到进行了部署newbranch。现在,这些更改已在上游合并到master分支中,我正尝试将网站也切换回master分支。在这一点上,newbranchorigin/master是相同的,但master相对滞后origin/master和更新的需求。问题是,如果我以传统方式这样做:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

我需要实现与上述(git checkout master && git pull)相同的功能,但在此过程中无需将工作目录更改为早期版本。


@phi:我认为这不会起作用,因为我在newbranch里面,没有东西可以藏起来!
Malvineous 2013年

我将克隆到一个新目录中,将newbranch合并到master中,将master合并回到newbranch中,然后从您所在的位置进行git pull。Master和newbranch将相同。
2013年

@aet他现在可以通过git fetch; git merge origin/master从内部执行在当前目录中执行此操作newbranch。克隆存储库的整个第二个副本有零收益。
meagar


Answers:


5

您有一个不想触摸的工作树,因此请使用另一个。克隆很便宜,它是为此而构建的。

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

这里所有其他答案的问题是,它们实际上并没有进行牵引。如果您需要为合并设置或变基设置,则需要另一个工作树和上述过程。否则就git fetch; git checkout -B master origin/master可以了。


2
运行时,git checkout master您将检出旧master分支,因为您尚未git pullmain文件夹中完成将其与原件/母版同步的操作。这就是我要避免的事情。
Malvineous

克隆完成的检出是旧主机的检出,但是该检入到Web服务器未查看的目录中。最后的主结帐是从wip推回的完全合并的主结帐。
jthill 2013年

在第6行,您将合并的(更新的)推masterorigin,但是我不认为您的最终结帐就是这个update master。没有git pull更新目录中的master分支的步骤main,因此,除非我丢失了某些内容,否则您的命令与单独运行git checkout master并获取旧master树没有什么不同。如果你仔细观察,你是不是运行在任何命令main目录进行通信的上行(从1号线,你做上游回购任何更改之前运行距离。)
Malvineous

好吧,您可以在测试存储库上尝试使用它,或者检查推送文档。
jthill 2013年

1
@jwg比什么好吗?确保满足所有OP规定的需求。
jthill 2014年

163

简便:从远程分支升级到当前未签出的分支主服务器

git fetch origin master:master

其中,原产地为你的遥控器和你在一些分支如当前已签出开发

如果要一次性更新指定分支之外的当前分支:

git pull origin master:master

4
嗯,看来似乎并不总是有效;我只是被提示与我的WIP分支合并。
underscore_d

@underscore_d对我来说也是一样。
格雷格

1
为我工作...如果提示合并,那么我想您正在更新的分支中有未提交给原点的更改
略读了

2
这应该如何工作?它对我不起作用,它只是尝试将原点/母版合并到我当前已签出的分支中。
mhogerheijde

3
这会将master拉入当前分支。这绝对不是所要的。如果将pull更改为fetch,则这正是要求的内容。
杰夫·沃尔斯基

90

在这里得到答案: 合并,更新和拉取Git分支,而无需使用签出

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
这是最好的,因为它可以与未提交的本地更改一起使用。
Tomasz Gandor

2
如果您只想赶上最新的变化,那就去做吧git fetch origin master:mastergit fetch它本身会假设您要更新当前分支,而不是其他一些分支。
约翰·莱德格伦

2
这是最简单,最直接的答案。这应该是IMO接受的答案。
Keego

@JohnLeidegren-除非它并非总是按预期运行。请参阅对stackoverflow.com/a/42902058/274579答案的评论。
ysap

22

事实证明,答案看似简单:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

这使您可以更新master而无需切换到它,直到分支它已被更新。


11
这不会执行您要求的操作。
jthill 2013年

正如上面的评论所说,您所提出的问题实际上并不是您所回答的问题。您应该更新您的问题,以便它不是专门针对合并到分支而不签出的问题,而在于直接转移到远程可用的分支的最新版本而无需先签出旧版本的问题。
meagar

1
这绝对是我到这里寻找的答案:)
Sophistifunk 2015年

1
老实说,这不是OP想要的,但对我有所帮助。
Marcel Bro 2015年

1
@anoniim,不是OP想要的吗?您是说刚刚回答这个问题的OP?
smac89

12

您担心某些无法解决的问题,因为Git操作不是原子的。你将永远有一个洞,你的工作目录是中途分支之间,即使你不先切换到它更新的主人。这就是为什么Git不是部署工具

由于您实际上并不是在生产环境中提交代码(我希望如此),因此您实际上不需要签出分支。您只需执行a git fetch即可更新您的远程引用,然后git checkout origin/master将工作目录直接移动到当前指向的提交origin/master。这将使您处于独立的头脑状态,但是同样,由于您不提交代码,所以这无关紧要。

这是您将要获得的最小孔,但是正如我所说的,孔仍然存在。checkout不是原子的。


我了解使用git进行部署的局限性,问题在于这种情况下的漏洞将只有几分钟的时间,而不是不到一秒钟。关于签出的好主意origin/master,也许可以解决问题。
Malvineous

是什么让洞“分钟”变长?通过网络提取数据?git fetch在执行任何其他操作之前,请先做一个,然后进行实际的数据传输。
meagar

这是几分钟的时间,因为(现在)未跟踪的文件将被更早的提交覆盖。所以我必须复制文件,执行git的工作,然后放回去。“几分钟长”来自我的打字速度。(是的,我可以编写脚本,但这只是为了说明让git自己做所有事情都更快。)
Malvineous

3

您可以为此使用update-ref:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

请注意,这将丢弃master分支中的所有本地提交。在您的情况下,不会有任何问题,所以可以。对于尝试在有本地提交的地方执行此操作的其他人,我认为这是不可能的,因为合并只能在当前分支上运行。


这等于git branch --force master origin/master吗?这迫使当地人的头master指向origins 的头master
Keego '17

2

恶意解决方案对我有用

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

只是在给错误


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

所以我用-D选项运行

谢谢


0

git fetch origin master:master

  • “拉”(实际上是获取)master
  • 如果您有master尚未推送的更改,origin/master则会合并到您的主数据库中。
  • 如果存在合并冲突,则必须先解决它们。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.