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

时间:2015-07-09 06:50:14

标签: git git-pull pull

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

这是一个服务器副本。永远不会发生本地变化。开发人员在develop分支中更新他们的工作,然后在钩子的帮助下在服务器上执行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

1 个答案:

答案 0 :(得分:4)

你有一个旧版本的git(1.8.4之前版本)。

首先请记住,git pull仅为git fetch,后跟git merge 1 ,但git pull会将其他参数传递给这两个步骤。

当您使用其他参数运行git pull时,git pull会运行git fetch origin 2 如果添加{{1}但是,origin develop运行git pull。最后一个额外的参数是 refspec 。使用git fetch origin develop时,缺少冒号git fetch字符的refspec会告诉提取进程告诉另一端(服务器上的另一个git进程)将其所拥有的所有内容发送给该名称,但随后-in旧版本的git only-to 跳过更新该引用的:版本。 (新收到的项目(如果有)存放在您origin/name运行FETCH_HEAD的输出中的特殊参考git fetch中。)

这意味着此特定形式的提取此特定形式,跳过更新您的git pull

一旦获取结束,两种形式的origin/develop都像往常一样进行合并(或rebase);在这种情况下,两次都无所事事。

当您git pull运行git pull以使git fetch未更新时,您的git会立即忘记origin/develop可能已更新。你运行origin/develop并且你认为自己是"提前两次提交"。

运行git status以使git pull 更新git fetch时 - 请注意origin/develop出现在输出中,而不是{{ 1}} - 您的git现在会记住从origin/develop获得的新FETCH_HEAD。这一次,develop会显示您和origin同步。这是因为这次你允许你的git更新它对服务器引用的知识(任何提取的git status分支)。

这种特殊的奇怪行为最终被丢弃(在git版本1.8.4中),如果你更新自己的git,origin将更新其origin/*的想法,这种陌生感将会停止。但它现在发生了,因为四参数git fetch origin develop形式使用了非冒号refspec。

1 如果已配置,则后跟origin/develop。对于这种情况并不重要。

2 在这种情况下,无论如何;附加参数可以命名除git fetch以外的某些存储库。