256

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

我能找到的所有 git 示例似乎都表明您首先运行“结帐分支名称”,然后执行拉取操作。我试图避免这种情况。正如我所说,这是一个现有的分支,我只想更新到最新版本。

4

4 回答 4

373

我一直在寻找同样的东西,最后在另一个 stackoverflow 帖子中找到了对我有用的答案:Merge, update, and pull Git branches without using checkouts

基本上:

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

于 2014-09-10T22:58:44.300 回答
160

我遇到了同样的问题,需要提交或存储当前功能更改、签出master分支、执行pull命令确实将所有内容从远程工作区获取到本地master工作区,然后再次切换到功能分支并执行 arebase以使其与掌握。

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

git fetch origin master:master

git rebase master

它做得很好。

于 2018-12-07T10:37:51.607 回答
1

如果您希望在之后重新指出本地git fetch分支提示,则需要一些额外的步骤。

更具体地说,假设 github repo 有分支D, B, C, 和master(这个奇怪的分支名称集的原因稍后会很清楚)。您在主机上,并且在 github 存储库devhost所在的存储库中。origin您这样做git fetch了,这会带来所有对象和更新origin/D、、、origin/B和。到目前为止,一切都很好。但是现在您说您希望在本地分支机构, , ,和/或上发生一些事情?origin/Corigin/masterdevhostDBCmaster

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

  1. 为什么要更新所有分支的提示?
  2. 如果某个分支(例如,B)具有远程(github)repo 缺少的提交怎么办?它们应该被合并、重新定位还是……?
  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) 的回答。

于 2013-09-17T21:14:19.127 回答
-14

利用

git fetch

反而。它会更新你的 repo 中的远程引用和对象,但只保留本地分支、HEAD 和工作树。

于 2013-09-17T18:53:09.117 回答