'git pull origin mybranch'离开本地mybranch N承诺原产地.为什么?

Mat*_*ias 91 git version-control git-pull

我刚看到一些奇怪的事情git pull,我不明白.

星期五,我在一家当地分公司工作.我们称之为mybranch.在离开办公室之前,我把它推到原点(这是我的GitHub库)git push origin mybranch.

昨天在家里,我把pullmybranch写到我的笔记本电脑上,做了一些编码,然后将我的更改推回到github(原点).

现在我再次上班,并试图将改变从昨天拉到我的工作机器上(周末我的工作地点的本地回购没有改变):

git pull origin mybranch
Run Code Online (Sandbox Code Playgroud)

这导致了快速合并,这很好.然后我做了一个git status,它说:

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

咦?如果我周末没有触摸它,只是从原点拉出来,它怎么能提前6次?所以我跑了一个git diff origin/mybranch,差异就是我刚刚从远程拉出来的6个变化.

我只能通过运行来"修复"这个git fetch origin:

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch
Run Code Online (Sandbox Code Playgroud)

显然,我的本地仓库缺少一些参考对象,但这怎么可能呢?我的意思是,一个pull已经进行了一次获取,除了那个分支之外我没有处理任何事情,所以a git fetch origingit fetch origin mybranch应该有相同的结果吗?

我应该总是用git pull origin而不是git pull origin branchname吗?

我糊涂了.

CB *_*ley 113

git pullgit fetch在将显式提取的头部(或者如果没有配置用于合并的远程分支)合并到当前分支之前,使用适当的参数调用.

语法:git fetch <repository> <ref>where <ref>只是一个没有冒号的分支名称是"一次性"获取,它不对指定远程的所有被跟踪分支进行标准提取,而是仅将命名分支提取到FETCH_HEAD.

更新:对于自1.8.4以来的Git版本,如果有一个远程跟踪分支跟踪您要求获取的引用,则跟踪分支现在将更新fetch.此更改专门用于避免先前行为导致的混淆.

执行时git pull <repository> <ref>,FETCH_HEAD如上所述进行更新,然后合并到签出中,HEAD但不会更新远程存储库的任何标准跟踪分支(Git <1.8.4).这意味着在本地它看起来像你在远程分支之前,而实际上你是最新的.

我个人总是这样做git fetch,git merge <remote>/<branch>因为在合并之前我会看到有关强制更新的任何警告,我可以预览我正在合并的内容.如果我使用git pull的比我更多,我会做一个git pull没有参数的平原当时,依靠branch.<branch>.remotebranch.<branch>.merge'做正确的事'.

  • +1这真是一个很好的解释!我知道解释是隐藏在'git help fetch'中的某个地方但是无法解决它... (4认同)