Git没有结帐?

我习惯于从我正在工作的分支中运行git pull和其他命令。但是我已经建立了一个几个人在上面工作的开发服务器,所以当我这样做的时候,我不想切换分支。如果我想从我们都使用的github存储库更新开发服务器上的现有分支,正确的方法是什么?如果我运行命令'git拉github branchname'将只是将分支拉到当前分支?

我能找到的所有git示例似乎都表明,您首先运行“checkout branchname”,然后执行拉取。我尽量避免那样。正如我所说,这是一个现有的分支,我只是想更新到最新的版本。

112980 次浏览

使用

git fetch

代替。它会在你的repo中更新远程引用和对象,但不影响本地分支、HEAD和工作树。

如果你想让当地的分支提示在git fetch之后被重新指向,你需要一些额外的步骤。

更具体地说,假设github repo有DBCmaster分支(这个奇怪的分支名称集的原因马上就会清楚)。你在主机devhost上,你在一个回购中,其中origin是github回购。你执行git fetch,它会带来所有对象并更新origin/Dorigin/Borigin/CB0。到目前为止一切顺利。但是现在你说你想在devhost上发生一些事情,到B6分支DBC,和/或master?

我有这些显而易见的问题(至少对我来说):

  1. 为什么你想要更新所有分支的提示吗?
  2. 如果一些分支(例如,B)有提交,远程(github)回购缺乏?他们应该被合并,重新建立,还是…?
  3. 如果你在某个分支上(例如,C)并且工作目录和/或索引被修改但没有提交怎么办?
  4. 如果远程回购有新的分支添加(A)和/或分支删除(D)?

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

如果有其他答案,(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)的答案。

我也在寻找同样的事情,最终在另一个stackoverflow帖子中找到了适合我的答案:合并、更新和提取Git分支,而不使用签出

基本上:

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

例子:

git fetch origin branchname:branchname

我遇到了同样的问题,必须提交或保存当前的特性更改,签出分支,执行pull命令将所有内容从远程到本地master工作区,然后再次切换到一个特性分支并执行rebase以使其与master保持最新。

为了完成这一切,保持工作空间在特征分支上,避免所有切换,我这样做:

git fetch origin master:master

git rebase master

而且效果很好。

我使用以下命令将原始分支更新为本地分支而不签出。 git获取来源[BranchName]:[BranchName]

. [/p> .