据我所知,当master在本地机器上时,origin / master和origin / HEAD位于远程存储库中。更改被推送到存储库(由我从另一台计算机)创建提交0e17adc。我现在想把这个更改带到我的本地存储库中。我认为正确的做法是:
git checkout master
git pull
但是这会返回:
Already up-to-date.
为什么会这样? master在我看来与origin / master不同步,我认为git pull
做了git fetch
然后git merge
所以应该将origin / master与master合并?
答案 0 :(得分:1)
据我所知,当master在本地机器上时,origin / master和origin / HEAD位于远程存储库中。
这不是很正确(并且细节很重要)但它有正确的想法支持:origin/master
在你的本地机器中,但它是你Git的记住的方式你的Git从他们的(起源)Git得到了什么。当您运行git fetch
(或git pull
运行git fetch
)时,您的Git会根据您的Git存储的URL以及名称origin
来调用他们的Git。他们的Git列出了他们的master
及其提交哈希ID,你的Git确保你有所需的提交,然后设置你自己的origin/master
来记住他们的master
。 / p>
我现在想把这个更改带到我的本地存储库中。我认为正确的做法是:
git checkout master git pull
这是人们通常采用的一种方式。 (我更喜欢自己避免使用git pull
并打破各个命令。)
但是这会返回:
Already up-to-date.
如果你运行git branch -vv
(详细两次:非常详细)你应该看到类似的东西,但不同(这是在Git的Git存储库中):
* master 5be1f00a9 [origin/master] First batch after 2.16
此处方括号中的内容origin/master
是master
的当前上游设置。每个分支可以有一个(并且只有一个)上游,您可以使用git branch --set-upstream-to
设置。
当您运行git pull
(或像我一样将其分解为其组件)时,Git:
git fetch
:另一个Git从默认值获取到当前分支的上游远程,在这种情况下是origin
的{{1}}部分;然后origin/master
:此命令的参数取决于你的Git从其他Git获得的内容,以及上游设置的其余部分。如果某些设置被严重破坏,还有一堆重要细节可能很重要,但简而言之,如果git merge
显示git branch -vv
为上游,则:
origin/master
应该执行与运行git fetch origin
git merge origin/master
时相同的操作...而不会导致您在图片中显示的git pull
输出结果。所以在这一点上我最好的猜测是git log
的上游没有正确设置。
您可以运行master
进行查看,或使用:
git branch -vv
在我的案例中打印:
$ git rev-parse --symbolic-full-name "master@{upstream}"
(我把引号放在refs/remotes/origin/master
左右,因为有些命令行解释器有时会使用不带引号的括号做有趣的事情,但大多数情况下你不需要这样做。)
如果上游错误,并且您在master@{upstream}
并且想要修复它,请运行:
master
这假设您添加git branch --set-upstream-to=origin/master
时Git版本至少为1.8.0。在较旧的Git中,您可以使用:
--set-upstream-to
(git config branch.master.remote origin
git config branch.master.merge master
命令 - 注意到此处缺少git branch --set-upstream
- 太难以正确使用;避免使用它。)