当前回答
两者有什么区别?
git pull
和git fetch
?
要理解这一点,你首先需要明白,你所在的本地数据库不仅维护着您的本地存储库,而且还维护着远程存储库的本地副本。
git fetch
将远程仓库的本地副本更新到最新 。 例如, 如果您的远程仓库是 GitHub , 您可能想要将远程仓库中所做的任何更改移到您的本地副本 远程仓库。 这将允许您执行比较或合并等操作 。
git pull
另一方面,会将远程仓库的更改降低到您保存自己的代码的位置。 通常,git pull
会做一个git fetch
首先将远程存储库的本地副本更新, 然后它将把修改合并到您自己的代码存储库中, 并可能合并到您的工作副本中 。
其他回答
git pull
获取承诺后尝试自动合并 。上下文敏感,因此所有被拉动的承诺都将合并为您目前活跃的分支。git pull
自动合并承诺未经审查,而不先审查。。如果你不仔细管理自己的分支,你可能会遇到频繁的冲突。git fetch
收集当前分支中不存在的目标分支的任何承诺,并将其存储在本地仓库中然而,它不会与您当前分支合并。如果您需要不断更新您的仓库,但正在研究一些更新文件时可能中断的文件。要将承诺整合到当前分支中,您必须使用git merge
之后。
重要的是,将设计理论与SVN这种较传统的源控制工具的理论加以对比。
Subversion 是用客户端/ 服务器模型设计和构建的。 服务器是一个单一的仓库, 有几个客户可以从服务器上获取代码, 工作, 然后将其发送到服务器 。 假设客户总是可以在服务器需要操作时与服务器联系 。
Git 的设计是为了支持一个更分散的模型,而不需要一个中央存储库(尽管如果您愿意,您肯定可以使用一个)。 Git 的设计也是为了让客户和“服务器”不必同时上网。 Git的设计是为了让不可靠的链接上的人可以通过电子邮件交换代码,甚至可以。可以完全断开工作,烧掉CD,通过 git 交换代码。
为了支持此模型 git , 维持一个包含您的代码的本地仓库, 以及一个反映远程仓库状态的附加本地仓库。 通过保存远程仓库的副本, git 可以在本地找到所需的更改, 即使远程仓库无法到达 。 稍后当您需要将更改发送到其他人时, git 也可以从远程仓库已知的时间点将其转换为一组更改 。
git fetch
是命令 上面写着"把我的远程仓库的本地副本更新到最新"git pull
将远程存储库的更改 带到我保存自己代码的地方
通常为git pull
这样做的方式是:git fetch
以更新远程存储库的本地副本,然后将修改合并到自己的代码存储库中,并可能合并到工作副本中。
需要铭记的是,至少有至少三份三份工作站上的一个工程。 一个副本是您自己的存储库, 并有您自己的承诺历史。 第二个副本是您正在编辑和构建的工作副本。 第三个副本是您的远程存储库的本地“ cashed” 副本 。
简单说,如果你打算跳上飞机 没有任何互联网连接... 在离开之前,你可以做git fetch origin <branch>
。它会将所有更改带入您的计算机,但会将其与您的本地开发/工作空间区分开来。
在飞机上,您可以对本地工作空间进行修改,然后将其与您先前所获取的合并,然后解决潜在的合并冲突,而无需与互联网连接。除非有人做了新建新远程仓库的更改 :git push origin <branch>
去拿你的咖啡来
从这美妙的阿特拉斯教程:
缩略
git fetch
命令从远程仓库下载文件,从远程仓库下载到本地仓库。获取是您想看到每个人 所做的事其它它与 SVN 的更新相似, 它让您看到中央历史的进展, 但并不迫使您将修改合并到仓库。 Git从现有本地内容中获取的内容,它有绝对当地发展工作不受到任何影响。获取的内容必须使用
git checkout
命令。这使得获取安全的审查方式在将其与您本地的仓库整合之前能够兑现承诺。从远程仓库下载内容时,
git pull
和git fetch
用于完成任务的命令。您可以考虑git fetch
两个命令的“ 安全” 版本。 它会下载远程内容, 但不更新本地仓库的工作状态, 使您目前的工作保持完整 。git pull
是一个更积极的选项, 它会下载远程内容, 并立即执行 。git merge
以创建新远程内容的合并承诺。如果您在进展中出现变化,这将引发冲突和启动合并冲突解决流程。
与git pull
:
- 你没有得到任何孤立。
- 不需要明确检查 因为它暗含
git merge
. - 合并步骤将影响您的本地发展,中 中 中 中 中 中导致冲突起因的冲突
- 基本上不安全 这是侵略性的
- 相 异
git fetch
它只影响你.git/refs/remotes
Git拉力会影响你.git/refs/remotes
和.git/refs/heads/
嗯... 所以如果我不更新工作副本git fetch
,然后我在哪里做改变? Git在哪里获得新承诺的商店?
最首要的重要问题,heads
或remotes
不存储新的承诺,他们只是指针承诺承诺。git fetch
下载最新数据git 对象(blob, 树, 承诺。 要完全理解对象观察这个视频在 Git 内部),但只能更新您的remotes
指指该分支的最新任务。 它仍然与您的工作副本隔开, 因为您的分支的指针在heads
目录尚未更新。 它只会在merge
/pull
但还是在哪里?
在您的工程目录( 即您在哪里做git
执行命令( do) :
ls
。此选项将显示文件目录( T) 。 没有什么很酷的, 我知道 。现在做做
ls -a
。这将显示点点文件,即从.
这样您就可以看到一个名为 :.git
.do do do Do
cd .git
。这显然会改变你的目录。现在来有趣的部分; 做
ls
。您将会看到目录列表。我们正在寻找refs
。 do 做cd refs
.有趣的是,看看所有目录里面有什么, 但是让我们集中关注其中两个。
heads
和remotes
. 使用cd
检查他们内部。任何
git fetch
它将更新该页面中的指针。/.git/refs/remotes
目录。不会更新/.git/refs/heads
目录。任何
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
来自远程分支。
托盘提示 :
如果您已获取远程分支, 例如 :
git fetch origin feature/123
这将进入您的远程目录。 您的本地目录仍然无法访问它。 但是, 它简化了您在 DWIM 远程分支的校验( 做我的意思 ) :
git checkout feature/123
无需再做下列工作:
git checkout -b feature/123 origin/feature/123
将 " 更多 " 改为 " 更多 " 改为 " 更多 "在这里
git pull = git fetch + git merge
推荐文章
- Windows git“警告:LF将被CRLF取代”,这是警告尾巴向后吗?
- git中的哈希冲突
- git可以自动在空格和制表符之间切换吗?
- Git暂存文件列表
- 如何将git配置存储为存储库的一部分?
- 如何修改GitHub拉请求?
- 如何在Github和本地删除最后n次提交?
- 我如何调试git/git-shell相关的问题?
- 错误:无法使用rebase进行拉取:您有未分阶段的更改
- Git隐藏未缓存:如何把所有未分期的变化?
- 真实的恶魔
- 如何从另一个分支获得更改
- Git:权限被拒绝(publickey)致命-无法从远程存储库读取。克隆Git存储库时
- git reflog和log有什么区别?
- git推挂在Total line之后