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


当前回答

  • git pull获取承诺后尝试自动合并 。上下文敏感,因此所有被拉动的承诺都将合并为您目前活跃的分支。git pull自动合并承诺未经审查,而不先审查。。如果你不仔细管理自己的分支,你可能会遇到频繁的冲突。

  • git fetch收集当前分支中不存在的目标分支的任何承诺,并将其存储在本地仓库中然而,它不会与您当前分支合并。如果您需要不断更新您的仓库,但正在研究一些更新文件时可能中断的文件。要将承诺整合到当前分支中,您必须使用git merge之后。

其他回答

git fetch将检索远程分支,以便您能够git diffgit merge它们与当前分支一起存在。git pull将运行当前分支所跟踪的远程条格获取,然后合并结果。您可以使用git fetch查看是否对远程分支有任何更新,而不必将其与您的本地分支合并。

简单说,如果你打算跳上飞机 没有任何互联网连接... 在离开之前,你可以做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/refs

所有地方分支机构都存放在.git/refs/heads

所有远程分支都存放在.git/refs/remotes

缩略git fetch命令下载 承诺, 文件, 和 refs 从远程仓库下载到您的本地 repo 。 抓取是您想要看到其他人正在做的工作时要做的事情 。

所以当你做git fetch全部文件、 承诺和 refs 都下载在

此目录.git/refs/remotes

您可以切换到这些分支以查看变化 。

另外,如果你愿意,你可以把它们合并起来。

git pull只需下载这些更改, 并将其合并到当前分支 。

示例示例示例示例

如果您想看远程分支的工作dev/jd/feature/auth,你只需要做

git fetch origin dev/jd/feature/auth

看到变化或工作进展做,

git checkout dev/jd/feature/auth

但如果您也想要获取它们并将其合并到当前分支,

git pull origin dev/jd/feature/auth

如果有的话git fetch origin branch_name,它将获取分支,现在您可以切换到您想要的分支,并看到变化。您的本地主子或其他本地分支不会受到影响。但您不会受到影响。git pull origin branch_name将获取分支, 并合并到当前分支 。

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

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

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

初学者的简单图形化代表,

enter image description here

在这里,

git pull  

将会从仓库获取代码 并重新基础与您的本地... 在git拉动中,有 可能性创造新的承诺。

但是在,

git 获取 git 获取

将会从存储库获取代码, 我们需要通过使用git rebase

eg: 我要从服务器主机取回它, 并在本地主机重标 。

1) git pull( 重基将自动完成) :

git pull origin master

在这里来源来源是你的远程回寄师父您的分支

2) git 获取( 需要手动重标) :

git fetch origin master

它会从源代码中获取服务器更改。 它会位于本地, 直到您自己重新定位它。 我们需要通过检查代码手动来修正冲突 。

git rebase origin/master

这将会将代码重设为本地代码。 在确保您在正确的分支之前。