如何在不切换分支的情况下“git pull”(git checkout)?

问题描述 投票:0回答:5

我习惯于在我正在处理的分支中运行

git pull
和其他命令。但我已经建立了一个有几个人工作的开发服务器,所以我不想在这样做时必须切换分支。

如果我想从我们都使用的 github 存储库更新开发服务器上的现有分支,正确的方法是什么?

如果我运行命令

git pull github branchname
,这会简单地将分支拉入当前分支吗?

我能找到的所有 git 示例似乎都表明您首先运行

checkout branchname
,然后进行拉取。我正在努力避免这种情况。正如我所说,这是一个现有的分支,我只想更新到最新版本。

git git-pull git-checkout
5个回答
580
投票

我一直在寻找同样的东西,最后在另一篇 stackoverflow 帖子中找到了对我有用的答案:在不使用签出的情况下合并、更新和拉取 Git 分支

基本上:

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

示例:

git fetch origin branchname:branchname

236
投票

我遇到了同样的问题,需要提交或存储当前的功能更改,签出 master 分支,执行

pull
命令获取从远程到本地
master
工作区的所有内容,然后再次切换到功能分支并执行
rebase
使其与master保持同步。

为了完成这一切,请将工作区保留在功能分支上并避免所有切换,我这样做:

git fetch origin master:master

git rebase master

而且效果很好。


5
投票

我使用以下命令将原始分支更新到本地分支而无需签出。

git fetch origin [BranchName]:[BranchName]

1
投票

如果您希望 local 分支提示在

git fetch
之后重新指向,您需要一些额外的步骤。

更具体地说,假设 github 存储库有分支

D
B
C
master
(这个奇怪的分支名称集的原因很快就会清楚)。您位于主机
devhost
上,并且位于一个存储库中,其中
origin
是 github 存储库。您执行
git fetch
,这会带来所有对象并更新
origin/D
origin/B
origin/C
origin/master
。到目前为止,一切都很好。但现在你说你希望在
devhost
上,在 local 分支
D
B
C
和/或
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) 的答案。


-15
投票

使用

git fetch

相反。它更新存储库中的远程引用和对象,但保留本地分支、HEAD 和工作树。

© www.soinside.com 2019 - 2024. All rights reserved.