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


当前回答

我花了一点点时间来理解有什么区别, 但这只是一个简单的解释。master在您的本地主机是分支 。

当您克隆一个仓库时, 将整个仓库获取到本地主机主机。 这意味着当您克隆一个仓库时, 您将会有一个源/ 主指示器HEAD指向同一方向HEAD.

当您开始工作并投入工作时,您将主指针推进到HEAD+ 你的承诺。但来源/总指针仍然指向你克隆时是什么。

因此,区别在于:

  • 如果你做了git fetch它只会获取远程仓库中的所有更改( A) 。吉特胡布)并移动源/主指针到HEAD同时,你的当地分行长会继续指出它的位置。
  • 如果你做了git pull,它基本上可以(如先前解释的)提取(如前所解释的)并合并对主分支的任何新修改,然后将指针移到HEAD.

其他回答

Git 获取

您从源头通过获取下载到本地分支的更改 。 获取请求远程回购, 询问其他人所做的全部承诺, 但您没有在本地回购上。 获取这些承诺的下载, 并将其添加到本地仓库 。

基特合并

您可以通过合并命令获取下载的更改。 合并后将获取从获取中提取的承诺, 并尝试将其添加到您的本地分支。 合并后将保留您本地变化的承付历史, 这样当您以推力共享分支时, Git 将知道其他人如何将您的变化合并 。

吉特拉拉

抓取并合并一起运行的频率足够大, 足以创建一个将两者合并、 拉动、 合并的命令。 拉动时会抓取并合并, 以添加下载的字符串 。 @ info: whatsthis

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

如果你逃跑git pull中,您不需要将数据合并到本地数据。如果运行git fetch这意味着你必须跑git merge获取本地机器的最新代码。 否则, 本地机器代码不会在不合并的情况下被更改 。

所以在 Git Gui 中, 当您获取时, 您必须合并数据 。 获取本身不会在本地修改代码 。 您可以检查当您通过一次获取并查看来更新代码时, 是否更新了代码; 代码不会改变 。 然后您将合并... 您将会看到修改后的代码 。

缩略git 拉命令实际上是一个shortcut用于git 获取 git 获取排 排 排 排 排 排 排 排 紧 排 排git 合并git 重新基数取决于您的配置配置命令。 您可以配置您的 Git 仓库, 这样git 拉是一个接驳物,然后是一个重置物。

git pull = = (获取 Git + git 合并)

git refick 不改变本地分支 。

如果您已经拥有一个本地仓库, 并且为所要的工程设置了远程设置, 您可以使用 git 抓取, 来抓取所有现有的远程的分支和标记 。... Fetch 不改变本地分支 。 因此您需要将远程分支与本地分支合并, 以纳入新抓取的更改 。发自 Github