繁体   English   中英

Git Fetch with Source:Destination vs Git Pull

[英]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 总是快进,并且onlypull.ff配置为例如,我们将回到相同的操作。

嗯,差不多 还有一个区别: git pullgit merge将快进当前分支(仅),但git fetch origin development:development如果development当前分支将失败。 所以你必须在其他一些分支上。 有一种方法可以让git fetch快进当前分支(提供--update-head-ok标志)但是如果你这样做,你必须非常小心,因为更新的分支名称没有影响索引和工作-树,不像git merge驱动的快进操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM