git pull 真的是 git fetch + git merge 吗?

Jas*_* Li 4 git version-control github

我正在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO

我在两个单独的会话中运行了两组命令。第一组命令按顺序如下:

git clone
git checkout -b feature
git push
git fakeTeamwork main 1
git fakeTeamwork feature 1
git pull
Run Code Online (Sandbox Code Playgroud)

按顺序排列的第二组命令类似,但我在最后使用git fetch+代替:git merge

git clone
git checkout -b feature
git push
git fakeTeamwork main 1
git fakeTeamwork feature 1
git fetch
git merge o/feature
Run Code Online (Sandbox Code Playgroud)

如果git pull= git fetch+ git merge,为什么两个结果不同?似乎并git pull没有更新所有远程跟踪分支。这只是沙箱的缺陷还是 git 中实际发生的情况?

注意:命令git clonegit fakeTeamwork只是为沙箱构建的命令

谢谢你!

tor*_*rek 6

\n

看来 git pull 并没有更新所有远程跟踪分支。

\n
\n

可能会发生,是的。它确实发生在以下情况:

\n
    \n
  • git pullgit fetch origin master例如,运行,并且
  • \n
  • git fetch origin master因此仅更新origin/master
  • \n
\n

此外,在 1.8.4 之前的 Git 版本中,某些git fetch操作根本不会更新任何远程跟踪名称。这里git fetch origin master没有影响origin/master

\n

除此之外,我们还有其他几种特殊情况:

\n
    \n
  • 如果git pull已配置或被告知运行git rebase,则它使用的第二个命令是git rebase, not git merge。因此,明显的替代品git fetch后面是git rebase。不过,这里的一些细节甚至更多地依赖于 Git 版本:特别是,存在之前存在的 rebasegit pull实现模式(实际选项首先出现在 Git 1.9 中,但自某些 1.6 版本 \xe2\x80\x94 以来做了特殊的工作我查找了精确的版本一次,但目前使用的最旧的 Git 似乎是 CentOS,其中包括某些发行版中的一些 Git 1.7 版本)。--fork-pointgit rebase --fork-point--fork-pointgit pull
  • \n
  • 有一种非常特殊的情况:如果您创建一个空存储库,添加一个远程库,然后运行git pull,则还没有现有分支。(您可以稍后使用孤立分支再次触发此情况。)在这种情况下,不是合并或变基,而是git pull运行专门的git checkout.
  • \n
\n

分支的上游设置在这里很重要,具体取决于您传递给git pullfetch 和第二个命令的参数。一般来说,这些大多数最终都会以相同的方式工作,除了您注意到的一些远程跟踪名称有时没有更新的警告之外。

\n

  • 我自己不使用 C 版本,所以我不确定它是否能做到这一点 - 另外,它更新了 Git 2.0,这意味着它可能不那么重要,因为 1.8.4 修复了机会主义更新问题 - 但目标之一在命令行上传递额外参数的方法是限制 `git fetch` 以使 fetch 运行得更快。因此,“git pull origin master”运行了“git fetch origin master”,它没有(并且仍然没有)费心获取任何*其他*分支。 (3认同)
  • 在 `git pull` 的旧脚本版本中,对 `git fetch` 的调用是(删除特定于 pull 的选项后)`git fetch "$@"`。因此选项完全按照指定的方式传递。在重写的 C 版本中,这可能会有所不同。(C 重写是 Git 2.6.0 中的新功能。) (2认同)
  • 如果我们位于具有上游 R/X 的分支 X 上,那么运行“git fetch RX”以使其运行得更快是有意义的。它有这样的作用吗?我必须进行实验,然后我会得到特定版本的 Git 的答案:也许答案在其他版本中有所不同。如果您自己运行“git fetch”,*您*会提供参数,因此您会得到您指定的任何行为。 (2认同)