[英]Git Fetch with Source:Destination vs Git Pull
从有关 fetch 和 pull 之间差异的所有问题中,答案是 fetch 将更新您的远程副本,并且不会将任何内容合并到您的本地分支中。 但是,如果您使用带有 source:destination 的 fetch 命令说“git fetch origin development:development”,它将更新远程副本和本地副本。 那么在这种情况下,pull 和 fetch 有什么区别呢?
但是,如果您使用带有 source:destination 的 fetch 命令说“git fetch origin development:development”,它将更新远程副本和本地副本。
这并不完全正确。
1.8.4 之前的 Git 版本会出现一个例外(我们可能会打折扣),其中git fetch origin development:development
根本无法完全更新refs/remotes/origin/development
。 但是, git fetch origin development
也无法在这里更新refs/remotes/origin/development
。 这就是为什么我建议打折旧版本的 Git:它们在 fetch-and-merge 方面的行为仍然相同,就像它一样。 (嗯,那个,他们真的很老了。)
然而,更重要的例外是当一个快进操作——一个“快进合并”,正如git merge
声称的那样——是不可能的,或者通过merge.ff
和/或pull.ff
配置变量被禁止或命令行选项。 这进入了快进和实际合并之间的区别。
当你有git pull
run fetch-and-merge 时,第二个 Git 命令是,或者等价于,运行一个实际的git merge
命令。 此命令将:
HEAD
和合并目标之间的合并基础提交;在以下情况下可以并允许快进:
HEAD
;HEAD
是该提交的祖先; 和 在这种情况下 - 快进可能和允许的情况,即 - git merge
将进行快进而不是合并,在这种情况下, git fetch origin development:development
也会快进本地分支名称development
.
但是,如果合并是可能的,但禁止或不可能进行快进,则git merge
将进行真正的合并,而git fetch origin development:development
将根本无法快进名称development
。 所以在这里,这两个命令是不同的。 当然,如果您希望 pull 总是快进,并且only
将pull.ff
配置为例如,我们将回到相同的操作。
嗯,差不多。 还有一个区别: git pull
的git merge
将快进当前分支(仅),但git fetch origin development:development
如果development
是当前分支将失败。 所以你必须在其他一些分支上。 有一种方法可以让git fetch
快进当前分支(提供--update-head-ok
标志)但是如果你这样做,你必须非常小心,因为更新的分支名称没有影响索引和工作-树,不像git merge
驱动的快进操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.