Git pull 和 Git fick 之间有什么区别?


当前回答

GIT Fetch 和 GIT Pull 之间的差异可以用以下情景来解释:(铭记图片比文字更响亮!

让我们举一个例子来说明您正在与团队成员一起开展一个项目。 因此,该项目将有一个主要分支, 所有贡献者都必须将该项目推到他们自己的本地仓库, 然后在这个本地分支上修改/ 添加模块, 然后推回主分支 。

因此,当您在本地存储库中将主要项目提前启动时, 两个分支的初始状态将像这样( A、 B和 C 是项目已经完成的模块) 。

现在,您已经开始开发新模块( 假设 D) , 当您完成 D 模块后, 您想要将其推进到主分支, 但与此同时, 您的队友之一开发了新的模块 E, F 和修改过的 C 。 因此, 现在发生的情况是, 您的本地仓库缺少项目初始进展的背后, 因此将您的更改推到主分支可能导致冲突, 并可能导致模块 D 出现故障 。

为了避免此类问题,并与项目的最初进展平行工作,有两种方式:

1. Git F抓取 - 这将下载对本地分支中不存在的源/ 主分支工程所做的全部更改。 并且将等待 Git 合并命令应用您仓库或分支的更改 。

现在您可以仔细监视文件, 然后将其合并到仓库。 如果需要修改 C, 您也可以修改 D 。

2. Git Pull - 这将更新您的本地分支, 使用源/ 主分支, 即它所做的是将 Git Fetch 和 Git 合并成一个组合, 但可能会引发冲突, 因此建议使用 Git Pull 并使用干净的复制件 。

其他回答

我想用视觉来描述这些事情。也许其他开发商也想看,所以我还要补充一下。我不完全确定这一切是否都正确,所以如果你发现任何错误,请评论。

                                         LOCAL SYSTEM
                  . =====================================================    
================= . =================  ===================  =============
REMOTE REPOSITORY . REMOTE REPOSITORY  LOCAL REPOSITORY     WORKING COPY
(ORIGIN)          . (CACHED)           
for example,      . mirror of the      
a github repo.    . remote repo
Can also be       .
multiple repo's   .
                  .
                  .
FETCH  *------------------>*
Your local cache of the remote is updated with the origin (or multiple
external sources, that is git's distributed nature)
                  .
PULL   *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur, 
you are asked for decisions.
                  .
COMMIT            .                             *<---------------*
When coming from, for example, subversion, you might think that a commit
will update the origin. In git, a commit is only done to your local repo.
                  .
PUSH   *<---------------------------------------*
Synchronizes your changes back into the origin.

拥有远程镜像的一些主要优点是:

性能(通过所有承诺和信息,而不试图通过网络挤压它) 有关您本地回购状态的反馈(例如,我使用阿特拉斯西安的源树树枝,这给了我一个灯泡,显示我是否比来源提前或落后。这个信息可以用GIT FETCH来更新 ) 。

简单简便的答案是,Git拉动只是git抓取,然后是git合并。

必须指出, git pull 将自动合并, 不管你喜不喜欢。 当然, 这可能导致合并冲突 。 假设您的远程是源头, 您的分支是主人 。 如果您在拉动前跳过 diff 源/ master , 您应该知道潜在的合并冲突, 并据此为您所在的分支做好准备 。

除了拉拉之外,一些工作流程还涉及重设基准,例如这一项,我从相关条款中转述如下:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

如果你发现自己处于这种情况,你可能会被诱惑去拉拉 - rebase。除非你真的知道自己在做什么,否则我建议你不要这样做。这个警告是从git-pull的网页上发出的,版本2.3.5:

这是一个潜在危险的操作模式。 它重写历史, 当您已经发布历史时, 历史并不是好兆头。 除非您仔细阅读了 git- rebase(1) , 否则不要使用此选项 。

我也为此挣扎过。事实上,我来到这里时,用谷歌搜索了完全相同的问题。阅读了所有这些答案,终于在我脑海中画出了一张图片,我决定试着从下面看2个储存库和1个沙箱的状况,以及一段时间以来在看它们的版本时所采取的行动。这就是我所想出来的。如果我在任何地方搞砸了,请纠正我。

三个邮箱有一个接听器:

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - fetch               -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     -                     -
- @ R01             -     - @ R01+              -     - @R01+               -
---------------------     -----------------------     -----------------------

三号邮局拉一拉一拉

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - pull                -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     - merged with R02     -
- @ R01             -     - @ R01+              -     - @R02+               -
---------------------     -----------------------     -----------------------

这帮助我理解了为什么买东西很重要。

OK,这里有一些关于 Git pull 和 Git fick 的信息, 以便您能够理解实际差异... 几个简单的字, 获取最新数据, 但代码不会修改, 并且不会与您当前的本地分支代码发生混乱, 但是拉动代码修改, 并合并您的本地分支, 阅读以获得更多关于每个代码的细节 :

git 获取 git 获取

它会下载所有参考文献和对象 以及任何新的分支 到您的本地仓库...

从一个或多个其他仓库获取分支和(或)标记( 统称“ refs” ) , 以及完成历史所需的对象 。 远程跟踪分支会更新( 见下文关于控制此行为的方法的描述 ) 。 默认情况下, 任何指向所获取历史的标记也会被获取; 效果是从您感兴趣的分支获取标记。 这种默认行为可以通过使用 -- tags 或 -- no- tags 选项或配置远程来改变 。 tagOpt 。 通过使用直截取标记的重新检查, 您可以获取不指向您感兴趣的分支的标记 。 git 抓取标记可以一次从一个命名的仓库或 URL 中获取, 或从多个仓库中获取标记, 如果给定了, 并且有远程 。 配置文件中的条目。 (见 git- configg ) 。 当没有指定远程的遥控时, 除非为当前分支配置了上游分支。 正在获取的 ref 名称, 连同对象名称一起被您感兴趣的分支, 或脚本指令 可能被写入。


git 拉

它将应用本地从远程到当前分支的更改...

包含从远程仓库到当前分支的更改。 在默认模式下, git pull 是 Git 抓取的短手, 之后是 git 合并 FETCH_HEAD 。 更准确地说, git pull 以给定参数抓取 git 和调用 git 合并将回收的分支头合并到当前分支。 有了 -- rebase, 它会运行 git 重新基准而不是 git 合并 。 应该是被传送到 git- fetch1 的远程仓库的名称 。 它可以指定任意的远程 ref( 例如标签名称) , 或甚至收藏含有相应远程跟踪分支的refs/: heads/: refs/ remotes/genter/) , 但它通常是远程仓库中分支的名称 。 默认值, 由 git- branch 设定的当前分支的“ remote” 和“ merge” 配置, 从中读取 。


我还创建了下面的视觉图 来展示你们如何拼凑和拼凑在一起...

Git pull 和 Git fick 之间有什么区别?

要理解这一点,你首先需要明白,你所在的本地数据库不仅维护着您的本地存储库,而且还维护着远程存储库的本地副本。

git 抓取时将您本地的远程仓库副本带来最新 。 例如, 如果您的远程仓库是 GitHub - 您可能想要将远程仓库中所做的任何更改 转到您的本地副本 远程仓库 。 这将允许您执行比较或合并等操作 。

Git pull 另一方面会将远程存储库的更改降低到您保存自己的代码的位置。 通常, git pull 将首先进行 Git pull 获取, 以更新远程存储库的本地副本, 然后将修改合并到您自己的代码存储库中, 并可能合并到您的工作副本中 。