两者之间有什么区别?git pullgit fetch?


当前回答

enter image description here

这种互动图形表达方式非常有助于降低基点:http://ndpsoftware.com/git-cheatsheet.html

git fetch仅“ 下载” 从远程到本地仓库的更改 。git pull下载修改并将其合并到当前分支中。“在默认模式中,git pull简称为git fetch和继 继 继 继 继 继git merge FETCH_HEAD."

其他回答

您可以从远程仓库获取, 查看差异, 然后拉动或合并 。

这是被称作远程仓库的示例origin和支派,和支派,master跟踪远程分支origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

实际上 Git 保有一份您自己的代码副本和远程仓库 。

命令git fetch通过从远程仓库获取数据来更新您的本地副本。 我们需要这个数据的原因是, 其他人可能对代码做了一些修改, 您想要不断更新自己 。

命令git pull将远程仓库的更改引入到您保存自己的代码的位置。通常,git pull这样做的方式是先做一个“ 直接获取” , 将远程仓库的本地副本更新, 然后将修改合并到您自己的代码存储处, 并有可能将您的工作副本合并到您自己的代码存储处 。

这张图能帮上忙git pull基本上等于git fetch时当时git merge

This graphic could be of help. git pull is essentially equivalent to git fetch then git merge

简单说,如果你打算跳上飞机 没有任何互联网连接... 在离开之前,你可以做git fetch origin <branch>。它会将所有更改带入您的计算机,但会将其与您的本地开发/工作空间区分开来。

在飞机上,您可以对本地工作空间进行修改,然后将其与您先前所获取的合并,然后解决潜在的合并冲突,而无需与互联网连接。除非有人做了新建新远程仓库的更改 :git push origin <branch>去拿你的咖啡来


从这美妙的阿特拉斯教程:

缩略git fetch命令从远程仓库下载文件,从远程仓库下载到本地仓库。

获取是您想看到每个人 所做的事其它它与 SVN 的更新相似, 它让您看到中央历史的进展, 但并不迫使您将修改合并到仓库。 Git从现有本地内容中获取的内容,它有绝对当地发展工作不受到任何影响。获取的内容必须使用git checkout命令。这使得获取安全的审查方式在将其与您本地的仓库整合之前能够兑现承诺。

从远程仓库下载内容时,git pullgit fetch用于完成任务的命令。您可以考虑git fetch两个命令的“ 安全” 版本。 它会下载远程内容, 但不更新本地仓库的工作状态, 使您目前的工作保持完整 。git pull是一个更积极的选项, 它会下载远程内容, 并立即执行 。git merge以创建新远程内容的合并承诺。如果您在进展中出现变化,这将引发冲突和启动合并冲突解决流程。


git pull:

  • 你没有得到任何孤立。
  • 不需要明确检查 因为它暗含git merge.
  • 合并步骤将影响您的本地发展,中 中 中 中 中 中导致冲突起因的冲突
  • 基本上不安全 这是侵略性的
  • 相 异git fetch它只影响你.git/refs/remotesGit拉力会影响你.git/refs/remotes .git/refs/heads/

嗯... 所以如果我不更新工作副本git fetch,然后我在哪里做改变? Git在哪里获得新承诺的商店?

最首要的重要问题,headsremotes不存储新的承诺,他们只是指针承诺承诺。git fetch下载最新数据git 对象(blob, 树, 承诺。 要完全理解对象观察这个视频在 Git 内部),但只能更新您的remotes指指该分支的最新任务。 它仍然与您的工作副本隔开, 因为您的分支的指针在heads目录尚未更新。 它只会在merge/pull但还是在哪里?

在您的工程目录( 即您在哪里做git执行命令( do) :

  1. ls。此选项将显示文件目录( T) 。 没有什么很酷的, 我知道 。

  2. 现在做做ls -a。这将显示点点文件,即从.这样您就可以看到一个名为 :.git.

  3. do do do Docd .git。这显然会改变你的目录。

  4. 现在来有趣的部分; 做ls。您将会看到目录列表。我们正在寻找refs。 do 做cd refs.

  5. 有趣的是,看看所有目录里面有什么, 但是让我们集中关注其中两个。headsremotes. 使用cd检查他们内部。

  6. 任何 git fetch它将更新该页面中的指针。/.git/refs/remotes目录。不会更新/.git/refs/heads目录。

  7. 任何 git pull将首先完成git fetch更新项目并更新/.git/refs/remotes目录。然后它将会并且,还有与本地的本地合并,然后在/.git/refs/heads目录。


还可以找到一个非常良好的相关答案:"Gitt gets" 的地方本身在哪里?.

另外,搜索“斜缩缩写”Git 分支命名惯例它有助于您更好地了解 Git 如何将事物放在不同的目录中。


查看实际差异

仅仅做:

git fetch origin master
git checkout master

如果远程主机更新了, 你会收到这样的讯息:

Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

如果你没有fetch并且刚刚git checkout master然后,你的地方小人物不会知道有2项承诺被添加。 它只会说:

Already on 'master'
Your branch is up to date with 'origin/master'.

但是,这是过时的,不正确的。因为Git会仅仅根据它所知道的,给你反馈。 新的承诺,它还没有撤销...


当地分行工作时,有没有办法看到在远距离进行的新变化?

有些国际开发实体(例如Xcode)超级聪明,使用git fetch并且可以说明您当前工作分支的远程分支中已经更改的代码行行。 如果该行被本地更改和远程分支修改, 那么该行会用红色附加注释。 这不是合并冲突。 这是 a潜在潜力合并冲突 。 这是一个提示, 您可以在进行合并冲突前先用它解决未来合并冲突 。git pull来自远程分支。

enter image description here


托盘提示 :

如果您已获取远程分支, 例如 :

git fetch origin feature/123

这将进入您的远程目录。 您的本地目录仍然无法访问它。 但是, 它简化了您在 DWIM 远程分支的校验( 做我的意思 ) :

git checkout feature/123

无需再做下列工作:

git checkout -b feature/123 origin/feature/123

将 " 更多 " 改为 " 更多 " 改为 " 更多 "在这里

Git允许在较新的承诺之后适用按时间顺序排列的旧承诺。 因此,存放库之间转移承诺的行为分为两步:

  1. 正在从远程分支复制新承诺, 复制本地副本中的此远程分支 。

    (收回业务)master@remote >> remote/origin/master@local

  2. 整合对地方分支机构的新承诺

    (内购外业务)remote/origin/master@local >> master@local

第二步有两种方法,你可以:

  1. 在上一个共同祖先之后,将本地分支叉到叉口,并添加与本地仓库独特的承诺平行的新承诺,通过合并承诺最终完成,关闭叉口。
  2. 在上一个共同祖先后插入新承诺,并重新应用本地仓库独有的承诺。

git术语术语,第1步是git fetch,第2步是git mergegit rebase

git pullgit fetchgit merge