我习惯于在我正在处理的分支中运行
git pull
和其他命令。但我已经建立了一个有几个人工作的开发服务器,所以我不想在这样做时必须切换分支。
如果我想从我们都使用的 github 存储库更新开发服务器上的现有分支,正确的方法是什么?
如果我运行命令
git pull github branchname
,这会简单地将分支拉入当前分支吗?
我能找到的所有 git 示例似乎都表明您首先运行
checkout branchname
,然后进行拉取。我正在努力避免这种情况。正如我所说,这是一个现有的分支,我只想更新到最新版本。
我一直在寻找同样的东西,最后在另一篇 stackoverflow 帖子中找到了对我有用的答案:在不使用签出的情况下合并、更新和拉取 Git 分支
基本上:
git fetch <remote> <srcBranch>:<destBranch>
示例:
git fetch origin branchname:branchname
我遇到了同样的问题,需要提交或存储当前的功能更改,签出 master 分支,执行
pull
命令获取从远程到本地 master
工作区的所有内容,然后再次切换到功能分支并执行rebase
使其与master保持同步。
为了完成这一切,请将工作区保留在功能分支上并避免所有切换,我这样做:
git fetch origin master:master
git rebase master
而且效果很好。
我使用以下命令将原始分支更新到本地分支而无需签出。
git fetch origin [BranchName]:[BranchName]
如果您希望 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
上发生一些事情?
我有这些明显的(无论如何对我来说)问题:
B
)提交了远程(github)存储库缺少的内容怎么办?它们应该合并、重新定位还是......?C
)并且工作目录和/或索引已修改但未提交怎么办?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) 的答案。
使用
git fetch
相反。它更新存储库中的远程引用和对象,但保留本地分支、HEAD 和工作树。