不用拉就结帐吗?


133

我习惯从我正在处理的分支中运行git pull和其他命令。但是我已经设置了一个开发服务器,可以由几个人工作,所以我不想在执行此操作时不必切换分支。如果我想从我们都使用的github存储库中更新开发服务器上的现有分支,那么正确的方法是什么?如果我运行命令“ git pull github branchname”,是否会将分支拉入当前分支?

我可以找到的所有git示例似乎都表明您先运行“ checkout branchname”,然后再执行pull。我正在努力避免这种情况。正如我所说的,这是一个现有分支,我只想更新到最新版本。


6
git fetch应该做你想做的。
Brad 2013年

11
git fetch会更新远程分支的本地副本,但不会更新任何本地分支,即使设置为跟踪该特定远程分支也是如此。它可能是或可能不是想要的。(编辑:默认情况下,无论如何。可以用参数调用它以使其表现不同,但在这种情况下,应该指出参数。)

2
我不太明白...每个人都在开发服务器上使用相同的本地存储库吗?这就是为什么您不想切换分支吗?为什么不让每个人都制作自己可以工作的私有克隆?另请参见git:更新本地分支而不将其检出?

Answers:


221

我一直在寻找相同的东西,最后在另一个stackoverflow帖子中找到了对我有用的答案:合并,更新和拉取Git分支,而无需使用签出

基本上:

git fetch <remote> <srcBranch>:<destBranch>


有没有一种方法可以使用上游分支而不是指定源分支?
宏伟的

遗憾的是,但是的pull参数fetch没有:-s <strategy>-Xsubtree=...这对我来说至关重要,因此这不是等效的替代。我遇到的问题在这里描述:congruityservice.com/blog/…但在我的情况下,我根本不需要结帐。
安德里(Andry)

2
考虑到有关拉的问题,似乎答案应该是git pull <remote> <srcBranch>:<destBranch>
J Woodchuck

如果提交已在本地存储库中:git fetch . origin/master:master
Evan

74

我有相同的问题,必须提交或隐藏当前功能更改,签出master分支,do pull命令确实将所有内容从远程master工作区转移到本地工作区,然后再次切换到Feature分支并执行rebase以使其与最新状态保持一致。主。

为此,请将工作区保持在功能分支上,并避免所有切换,我这样做:

git fetch origin master:master

git rebase master

它很好地解决了问题。


19
这是一个很好的建议,但掩盖了传统:按照以下答案,如果您正在使用,feature并且要做的就是将您的本地更新master为与原点一致,而无需触摸featuregit fetch origin master:master那就做...就好像您做了stash-checkoutMaster-pull-checkout功能-stashPop!
btown

7
要将原始母版合并到您的本地分支中,无需拉本地母版。您可以使用 git merge origin/master

-1

如果要在之后重新指向本地分支提示git fetch,则需要一些其他步骤。

更具体地说,假设GitHub库设有分支机构DBC,和master(对于这个奇怪的分支名集之所以会在某一时刻清楚)。您在主机上devhost,并且在origingithub仓库中的仓库中。你这样做git fetch,这带来了超过所有对象和更新origin/Dorigin/Borigin/C,和origin/master。到目前为止,一切都很好。但是现在你说你想要的东西的事情发生,就devhost当地的分支机构DBC,和/或master

我有这些显而易见的问题(无论如何对我来说):

  1. 为什么要更新所有分支的提示?
  2. 如果某个分支(例如B)具有远程(github)存储库所缺少的提交怎么办?应该合并,重新设置基础还是...?
  3. 如果您在某个分支(例如C)上并且工作目录和/或索引已修改但未提交怎么办?
  4. 如果远程仓库增加了新分支(A)和/或删除了分支(D),该怎么办?

如果对(1)的回答是“因为devhost实际上不是为了开发,而是一个本地镜像,它只是保留了github存储库的本地可用副本,以便我们所有的实际开发人员都可以从中快速读取而不是从中缓慢读取github”,那么您需要一个“镜像”而不是一个“常规”存储库。它不应该有工作目录,也许也不应该接受推送,在这种情况下,剩下的问题就消失了。

如果还有其他答案,(2-4)会出现问题。

无论如何,这是一种基于远程引用(git fetch -p例如在运行之后)解决更新本地引用的方法:

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

... code here ...节中的内容取决于问题的答案(2-4)。


-5

git fetch

代替。它会更新您存储库中的远程引用和对象,但仅保留本地分支,HEAD和工作树。


17
但这并不会更新其开发服务器的本地分支……它只会刷新该git文件夹中的“ origin”分支,该分支与asker的github存储库相对应。
11

1
或者,如果您想要我的问题版本:我想将我的工作分支与“ master”合并,而不与“ ssh:// bla bla bla的origin / master”合并。执行访存将更新源/主服务器,而不是主服务器。
阿涅夫斯17-10-3

-6

编辑:使用'git pull'它将从存储库中提取所有分支,并且如果分支仅在当前系统上在本地系统上退出,还将更新为最新。注意:git pull等效于fetch + merge,它获取所有分支,但仅合并当前分支。


6
更好的说法是:pull执行获取(是的,从远程获取所有内容),然后仅合并当前分支。
torek 2013年

我的反对票无意冒犯我,我知道您的意思是正确和事实,并且OP确实确实要求确认拉力的作用(并且您已经给了他解释),但没有解决他追求的目标:没有一种方法可以将您的本地分支之一更新为其关联的远程分支中的最新提交,而不必先检出该分支。
Gurce
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.