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


当前回答

git 拉

它使用单一命令执行两个函数。

它会获取对远程分支的所有修改, 然后将这些修改合并到您的本地分支中。 您也可以通过 -- rebase 来修改拉动行为。 合并和重基准的区别可以在这里读取

git 获取 git 获取

Git 抓取仅能完成 Git pull 的一半工作。 它只是将远程更改带入您的本地回购, 但没有将其应用到分支中 。 您必须明确应用这些更改 。 这可以做如下操作 :

git fetch
git rebase origin/master

其他回答

我花了一点点时间才明白有什么区别,但这只是一个简单的解释。你的当地主人是个分支。

当您克隆一个仓库时, 您会把整个仓库带回本地主机 。 这意味着在那个时候您有一个源代码/ 源代码/ 源代码指针到 HEAD , 主人指向同一个主目录 。

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

因此,区别在于:

如果您做一个 Git 抓取它, 它只会获取远程仓库( GitHub) 的所有更改, 并将来源/ 指针移到 HEAD 。 与此同时, 您的本地分支管理员会一直指向它的位置 。 如果您做一个 Git 拉动, 它基本上会( 如前文所解释的) 抓取并合并您主分支的任何新更改, 并将指针移到 HEAD 。

git 将代码从远程服务器拖动到您本地仓库的跟踪分支。 如果您的远程代码被命名为源代码( 默认) , 这些分支将位于源代码/ 内, 例如源代码/ 源代码/ 主管、 源代码/ mybranch-123 等 。 这些不是您当前的分支, 它们是服务器上这些分支的本地副本 。

git pull 进行 git 抓取, 但也同时将代码从跟踪分支合并到您当前本地版本的分支中。 如果您还没有准备好修改, 请先拨入 。

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

                                         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 拉

它使用单一命令执行两个函数。

它会获取对远程分支的所有修改, 然后将这些修改合并到您的本地分支中。 您也可以通过 -- rebase 来修改拉动行为。 合并和重基准的区别可以在这里读取

git 获取 git 获取

Git 抓取仅能完成 Git pull 的一半工作。 它只是将远程更改带入您的本地回购, 但没有将其应用到分支中 。 您必须明确应用这些更改 。 这可以做如下操作 :

git fetch
git rebase origin/master

简单来说, 如果您要跳上没有互联网连接的飞机... 在您离开之前, 您可以只做 Git 获取来源 < branch> 。 它会将所有更改带入您的计算机, 但它会与您的本地开发/ 工作空间分开 。

在飞机上,您可以对本地工作空间进行修改,然后将其与您先前获取的内容合并,然后解决潜在的合并冲突,而无需与互联网连接。除非有人对远程存储库做了新的修改,否则一旦你到达目的地,您就会使用 Git 推车源头<branch> 并去喝咖啡。


从这个很棒的阿特拉斯家的教程:

git 抓取命令下载承诺、 文件和 ref 命令, 从远程仓库获取内容, 绝对不会影响您的本地开发工作 。 获取内容必须使用 Git 检查命令来明确检查 。 这样, 在将内容与本地仓库整合之前, 可以获取一个安全的审查方式。 它与 SVN 更新相似, 因为它让您看到中央历史是如何进展的, 但并不迫使您实际将更改合并到您的仓库 。 Git 将远程内容从现有本地内容中分离出来, 它绝对不会影响您的本地开发工作 。 获取的内容必须使用 Git 检查退出命令来明确检查 。 这样可以让您在将内容与本地仓库整合之前获取一个安全的方式来审查 。 在从远程仓库下载内容时, 您可以使用 Git pull 和 git 抓取命令来完成任务 。 您可以考虑 git 获取两个命令的“ 安全” 版本 。 它会下载远程内容, 但不会更新您的本地仓库的工作状态, 使您当前的工作保持完整 。 git pull is the more in the more ketional option, option option option, 它会为活跃本地分支下载远程内容, 并会立即执行合并为新的远程冲突。


Git pull :

您没有被孤立。 它不需要被明确检查 。 因为它暗含地会合并 。 合并步骤会影响您的本地发展, 并可能导致冲突 。 它基本上不安全 。 它具有攻击性 。 不像 git 获取只影响您的. git/ refs/ remotes, git 拉动会影响您的. git/ refs/ remotes/ remotes/ 和. git/ refs/ heads/ 。


嗯... 所以,如果我不更新工作副本 使用 git 抓取, 那么我在哪里做改变? Git 在哪里去存储新的承诺 ?

问得好。 首先, 头或遥控器不会存储新承诺 。 它们只是有要承诺的指针 。 因此, 通过 git 将您下载最新的 git 对象( blob, 树, 承诺 ) ( blob, 树, 承诺 ) 。 要完全理解对象, 请在 Git 内部 观看此视频, 只需更新您的遥控器, 指向该分支的最新承诺 。 它仍然与您的工作副本隔开, 因为您的分支在头目录中的指针没有更新 。 它只会在合并/ 挂载时更新 。 但是再次在哪里? 我们来看看在哪里 。

在您的工程目录( 即您如何执行 git 命令) 中 :

将显示文件与目录。 不酷, 我知道。 现在是 - a 。 这将显示点文件, 即以文件开头的文件 。 这样您就可以看到一个名为 . git. do. cd. git 的目录 。 这显然会改变您的目录 。 现在将出现有趣的部分 ; do is 。 您将会看到一个目录列表 。 我们查找的是 refs 。 做 cd refs 。 查看所有目录中的内容很有趣, 但是让我们关注其中的两个。 头和远程 。 也使用 cd 来检查它们内部 。 任何 git 抓取将会更新 /. git/ refs/remotes 目录中的点 。 它不会更新 /. git/ refs/head 目录中的任何内容 。 任何 git pull 将首先对 /. git/ refs/ remotes 目录中的项目进行抓取和更新 。 然后它还将与您的本地目录合并, 并修改 /. git/ grefhead/head/head/head/ heheads/ halls/ heads/ atots/.


也可以在“ 提供” 地点本身的什么地方找到非常良好的相关答案 ?

另外, 寻找 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)

如果你没有去取,只是做了git退房硕士... ...那么你的地方git就不会知道有2个承诺了。 它只会说:

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

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


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

有些 IDE (例如 Xcode) 超级智能, 使用 git 抓取的结果, 并可以说明您当前工作分支的远程分支已经更改的代码行。 如果该行被本地更改和远程分支所更改, 那么该行会用红色附加注释。 这不是合并冲突。 这是一个潜在的合并冲突 。 您可以在从远程分支切换前先提前解决未来的合并冲突 。


托盘提示 :

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

git fetch origin feature/123

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

git checkout feature/123

无需再做下列工作:

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

将“更多”改为“此处”