我的理解一直git pull是基本上是git fetch和的组合,git merge ...但我已经多次遇到拉动,然后比较显示的变化不是我的,直到我也进行了取物:
(在分支blob上):
git pull origin blob
git diff origin/blob <- shows a bunch of changes that aren't from my but were just pulled from others
git fetch
git diff origin/blob <- shows just my changes
Run Code Online (Sandbox Code Playgroud)
我对拉的理解不正确吗?
Tox*_*rog 17
这是一个常见的混淆源,因此#gitIRC频道有一个固定的帮助文本,称为!pull4:
我们建议不要使用'git fetch/pull <remote> <refspec>'(即带分支参数),因为它不会更新<remote>/<branch> ref.获取正确东西的简单方法是获取所有内容:如果你有一个遥控器,'git fetch'或'git pull'就足够了; 否则我们建议'git fetch <remote>'(加上'git merge <remote>/<branch>'如果你想拉/合并).
这里发生的事情是,"默认远程"(通常)上git pull没有参数,然后是与当前本地分支对应的远程分支.使用显式指定的远程执行相同的操作.但是,"四字拉"会将该分支提取到临时位置,而不更新跟踪分支,然后合并到当前分支中.git fetchorigingit mergegit pull <remote>git pull <remote> <branch>FETCH_HEADFETCH_HEAD
因此,通过使用git pull origin blob,您说"我想将blob远程分支的最新版本合并origin到我当前的分支中,而不更新任何跟踪分支或获取任何其他数据".
如果您的分支合并配置是正确的(并且它们可能是,git clone并且git checkout尝试自动设置它们),您可以只是git pull或者git pull origin它将获取所有内容然后合并与您当前签出的分支对应的分支.如果您想要更明确的控制,请使用git fetch然后git merge.git pull <remote> <branch>很少你想要的.
(git fetch修复你的例子中的事情的原因是,在拉动之后,你的本地分支已经用最新的远程提交进行了更新,但跟踪分支还没有.git fetch用这些提交更新跟踪分支,此时差异再次开始有意义.)