Git 在命令中提供分支名称时 pull not 不起作用(git 版本 1.7.1)

Git pull not does not work when providing branch name in the command (git version 1.7.1)

我无法理解这个案例。为什么 git pull origin develop 不执行 fast-forward。为什么我需要 运行 git pull 来更新文件。

这是一个服务器副本。永远不会进行本地更改。开发人员在 develop 分支中更新他们的工作,然后在服务器上借助 hooks 执行 pull

这是终端命令和输出。

[dev1st@ds3 rosplay]$ git branch -vv
* develop d555ff7 [origin/develop: ahead 2] add comment
[dev1st@ds3 rosplay]$ git pull origin develop
From http://115.112.117.254/php/rosplay
 * branch            develop    -> FETCH_HEAD
Already up-to-date.
[dev1st@ds3 rosplay]$ git status
# On branch develop
# Your branch is ahead of 'origin/develop' by 2 commits.
#
nothing to commit (working directory clean)
[dev1st@ds3 rosplay]$ git pull
From http://115.112.117.254/php/rosplay
   2d3bb3a..d555ff7  develop    -> origin/develop
Already up-to-date.
[dev1st@ds3 rosplay]$ git status
# On branch develop
nothing to commit (working directory clean)

我已经正确设置了跟踪信息。但仍然仅针对此项目,git pull origin develop 不会执行 fast-forward.

请帮忙。

更新(.git/config内容)

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = http://username:password@...php/rosplay.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "develop"]
        remote = origin
        merge = refs/heads/develop

您使用的是旧版本 git(1.8.4 之前的版本)。

首先请记住 git pull 只是 git fetch 后跟 git merge1git pull 将附加参数传递给这些两步。

当你 运行 git pull 没有 附加参数时,git pull 运行s git fetch origin.2 如果加上origin develop,然而,git pull 运行s git fetch origin develop。最后一个附加参数是 refspec。对于 git fetch,缺少冒号 : 字符的 refspec 告诉获取进程告诉另一端(服务器上的另一个 git 进程)传送它为名称,但随后——仅在 git 的旧版本中——skip 更新 origin/<em>name</em> 该参考的版本。 (新带来的项目,如果有的话,存放在特殊参考 FETCH_HEAD 中,您在 git fetch 的输出中看到 git pull 运行s。)

这意味着这种特殊形式的获取,并且这种特殊形式,跳过 正在更新您的 origin/develop.

获取完成后,git pull 的两种形式都会像往常一样进行合并(或变基);在这种情况下,两次都无事可做。

当您 git pull 运行 git fetch 使得您的 origin/develop 更新时,您的 git 立即忘记 origin/develop 可能已经更新。你 运行 git status 并且你认为自己是 "two commits ahead".

当您 运行 git pull 这样 git fetch 确实 更新您的 origin/develop — 请注意 origin/develop出现在输出中,而不是 FETCH_HEAD——您的 git 现在会记住它从 origin 获得的新 develop。这一次,git status 显示您和 origin 同步。这是因为这一次,您允许 git 更新其对服务器引用的了解(任何获取的 origin/* 分支)。

这种特殊的怪异行为最终被丢弃(在 git 版本 1.8.4 中),如果您更新自己的 git,git fetch origin develop 将更新其对 [=25 的想法=] 并且这种奇怪现象将停止。但它现在发生了,因为四参数 git fetch 形式使用了无冒号 refspec。


1或者如果这样配置的话后面跟着git rebase。对于这种情况,没关系。

2这样的话,反正;附加参数可以命名一些存储库而不是 origin.