pull和merge的区别 - 少用git pull




'git pull'和'git fetch'有什么区别? (20)

主持人注意:鉴于此问题已经发布了67个答案 (其中一些已删除),请考虑在发布另一个问题之前是否提供任何新内容

git pullgit fetch什么区别?


git pull和之间有什么区别git fetch

要理解这一点,首先需要了解本地git不仅维护本地存储库,还维护远程存储库的本地副本。

git fetch使您的远程存储库的本地副本保持最新。例如,如果您的远程存储库是GitHub - 您可能希望将远程存储库中所做的任何更改提取到远程存储库的本地副本。这将允许您执行比较或合并等操作。

git pull另一方面,将远程存储库中的更改记录到您保留自己的代码的位置。通常,git pullgit fetch首先使远程存储库的本地副本更新,然后将更改合并到您自己的代码存储库以及可能的工作副本中。


奖金:

在谈到上述答案中的提取和提取时,我想分享一个有趣的技巧,

git pull --rebase

上面的命令是我git生活中最有用的命令,节省了大量的时间。

在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用fetch + merge),并将您的提交放在git log的顶部。 无需担心手动拉/合并。

有关详细信息,请访问: http://gitolite.com/git-pull--rebasehttp://gitolite.com/git-pull--rebase


git fetch将代码从远程服务器下拉到本地存储库中的跟踪分支。如果你的遥控器被命名为origin(默认值),那么这些分支会内origin/,例如origin/masterorigin/mybranch-123等等。这些都不是你当前的分支,它们是本地从服务器这些分支的副本。

git pull做了git fetch但随后合并从跟踪分支代码到分支您当前的本地版本。如果你尚未做好应对这一改变的准备,那就git fetch先行。


git fetch将检索远程分支机构,这样就可以git diffgit merge它们与当前分支。git pull将在当前分支跟踪的远程brach上运行fetch,然后合并结果。您可以使用git fetch以查看远程分支是否有任何更新,而无需将它们与本地分支合并。


好的 ,这里有一些关于git pullgit fetch ,所以你可以理解实际的差异...用几句简单的话来说, fetch获取最新的数据,但不是代码更改,也不会弄乱你当前的本地分支代码,但取代码更改并将其合并到您的本地分支,继续阅读以获取有关每个代码的更多详细信息:

git fetch

它会将所有引用对象以及任何新分支下载到本地存储库...

从一个或多个其他存储库中获取分支和/或标记(统称为“refs”),以及完成其历史记录所需的对象。 远程跟踪分支已更新(有关控制此行为的方法,请参阅下面的说明)。

默认情况下,还会获取指向要获取的历史记录的任何标记; 效果是获取指向您感兴趣的分支的标记。可以使用--tags或--no-tags选项或配置remote..tagOpt来更改此默认行为。 通过使用明确提取标记的refspec,您可以获取不指向您感兴趣的分支的标记。

git fetch可以从一个命名的存储库或URL中获取,也可以一次从多个存储库中获取,如果有,则有一个遥控器。 配置文件中的条目。 (参见git-config 1 )。

如果未指定远程,则默认情况下将使用原始远程,除非为当前分支配置了上游分支。

获取的引用名称及其指向的对象名称将写入.git / FETCH_HEAD。 脚本或其他git命令可以使用此信息,例如git-pull。

git pull

它会将远程更改应用到本地的当前分支 ...

将来自远程存储库的更改合并到当前分支中。 在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD。

更准确地说,git pull使用给定的参数运行git fetch并调用git merge将已检索的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge。

应该是传递给git-fetch 1的远程存储库的名称。 可以命名任意远程引用(例如,标记的名称)或甚至具有相应远程跟踪分支的引用集合(例如,refs / heads / :refs / remotes / origin / ),但通常它是名称远程存储库中的分支。

从git-branch --track设置的当前分支的“远程”和“合并”配置中读取和的默认值。

我还创建了下面的视觉效果 ,向您展示git fetchgit pull如何协同工作......

1


简要地

git fetch类似于pull但不合并。 即它获取远程更新( refsobjects ),但您的本地保持不变(即origin/master更新但master保持不变)。

git pull从遥控器拉下并立即合并。

更多

回购克隆克隆

git rebase将当前分支中不在上游分支中的东西保存到临时区域。 您的分支现在与开始更改之前的分支相同。 因此, git pull -rebase将下拉远程更改,回退本地分支,逐个重播您当前分支顶部的更改,直到您获得最新信息。

此外, git branch -a将向您显示所有分支机构的确切内容 - 本地和远程分支。

这篇博文很有用:

git pull,git fetch和git clone(以及git rebase)之间的区别 - Mike Pearce

并涵盖git pullgit fetchgit clonegit rebase

====

UPDATE

我想我会更新这个以显示你在实践中如何实际使用它。

  1. 从远程更新本地仓库(但不要合并):

    git fetch

  2. 下载更新后,让我们看看差异:

    git diff master origin / master

  3. 如果您对这些更新感到满意,请合并:

    git pull

笔记:

在第2步:有关本地和远程分支之间的差异的更多信息,请参阅: 比较本地git分支与远程分支?

在第3步:在这里做一个git rebase origin可能更准确(例如在快速变化的回购中)。 请参阅另一个答案中的@Justin Ohms评论。

另见: longair.net/blog/2009/04/16/git-fetch-and-mergelongair.net/blog/2009/04/16/git-fetch-and-merge


git pull ==(git fetch + git merge)

git fetch不会更改为本地分支。

如果您已经有一个本地存储库,其中包含为所需项目设置的远程数据库,则可以使用git fetch获取现有远程数据库的所有分支和标记。... Fetch不会对本地分支进行任何更改,因此您需要将远程分支与配对的本地分支合并以合并新的提取更改。来自github


一个简单的初学者图形表示,

这里,

git pull  

将使用您的本地从存储库和rebase获取代码...在git pull中可能会创建新的提交。

但在 ,

git fetch

将从存储库中获取代码,我们需要使用手动重新绑定它 git rebase

例如:我将从服务器主服务器获取并在我的本地主服务器中重新绑定它。

1)git pull(rebase将自动完成):

git pull origin master

这里的原点是你的远程仓库主人是你的分支

2)git fetch(需要手动rebase):

git fetch origin master

它将从源获取服务器更改。它将在你的本地,直到你自己改变它。我们需要通过检查代码手动修复冲突。

git rebase origin/master

这会将代码重新绑定到本地。在那之前确保你在正确的分支。


实际上Git维护着您自己的代码和远程存储库的副本。

该命令git fetch通过从远程存储库获取数据使您的本地副本保持最新。我们需要这个的原因是因为其他人可能对代码进行了一些更改,并且您希望自己更新。

该命令git pull将远程存储库中的更改带到您保留自己的代码的位置。通常,git pull这是通过首先执行'git fetch'来使远程存储库的本地副本更新,然后将更改合并到您自己的代码存储库以及可能的工作副本中。


将git的设计理念与更传统的源控制工具(如SVN)的理念进行对比非常重要。

Subversion是使用客户端/服务器模型设计和构建的。 有一个存储库是服务器,几个客户端可以从服务器获取代码,对其进行处理,然后将其提交回服务器。 假设客户端可以在需要执行操作时始终联系服务器。

Git旨在支持更加分散的模型而不需要中央存储库(尽管如果您愿意,您当然可以使用它)。 此外,git的设计使客户端和“服务器”不需要同时在线。 Git的设计使得不可靠链接的人们甚至可以通过电子邮件交换代码。 可以完全断开连接并刻录CD以通过git交换代码。

为了支持这个模型,git使用您的代码维护一个本地存储库,还有一个镜像远程存储库状态的附加本地存储库。 通过在本地保留远程存储库的副本,即使无法访问远程存储库,git也可以找出所需的更改。 稍后当您需要将更改发送给其他人时,git可以将它们作为一组更改从远程存储库已知的时间点进行传输。

  • git fetch是一个命令,它说“使我的远程存储库的本地副本更新。”

  • git pull说“将远程存储库中的更改带到我保存自己代码的位置。”

通常git pull通过执行git fetch来使远程存储库的本地副本更新,然后将更改合并到您自己的代码存储库以及可能的工作副本中。

需要注意的是,工作站上通常至少有三个项目副本 。 一个副本是您自己的存储库,具有您自己的提交历史记 第二个副本是您正在编辑和构建的工作副本。 第三个副本是远程存储库的本地“缓存”副本。


我们简单地说:

git pull == git fetch + git merge

如果运行git pull,则无需将数据合并到本地。如果您运行git fetch,则表示您必须运行git merge以获取本地计算机的最新代码。否则,如果没有合并,则不会更改本地机器代码。

所以在Git Gui中,当你进行提取时,你必须合并数据。获取本身不会使您的本地代码更改。您可以通过提取一次来查看更新代码并查看; 它不会改变的代码。然后你合并......你会看到更改后的代码。


我喜欢用一些视觉表现来掌握这些东西。 也许其他开发者也希望看到它,所以这是我的补充。 我不完全确定这一切都是正确的,所以如果你发现任何错误请发表评论。

                                         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.

获取遥控器镜像的一些主要优点是:

  • 性能 (滚动所有提交和消息,而不试图通过网络挤压它)
  • 关于本地仓库状态的反馈 (例如,我使用Atlassian的SourceTree,它会给我一个灯泡,指示我是否提交了与原点相比提前或落后。这些信息可以使用GIT FETCH更新)。

有时,视觉表示有帮助。


用最简单的术语来说, git pull执行git fetch然后执行git merge

您可以随时进行git fetch来更新refs/remotes/<remote>/下的远程跟踪分支。

此操作永远不会更改refs/heads下的任何本地分支,并且可以安全地执行而无需更改工作副本。 我甚至听说有人在后台的cron作业中定期运行git fetch (虽然我不建议这样做)。

使用git pull可以使本地分支与其远程版本保持同步,同时还可以更新其他远程跟踪分支。

Git文档: git pull


试图清晰简单。

混帐拉命令实际上是一个shortcutgit的取指随后混帐合并混帐底垫取决于您的配置命令。您可以配置Git存储库,以便git pull是一个fetch,后跟一个rebase。



GIT FetchGIT Pull之间的区别可以通过以下场景来解释:( 记住图片比单词更响亮!,我提供了图形表示)

让我们举一个例子,说明您正在与团队成员一起开展项目。所以他们将成为项目的一个主要分支,所有贡献者必须将它分叉到他们自己的本地存储库,然后在这个本地分支上工作以修改/添加模块然后推回到主分支。

因此,初始状态的两个分支的,当你在分叉本地仓库主体工程会像这- ( ABC在模块已经完成的项目)

现在,你已经开始了新的模块(假设上工作D),当你完成D你想要它推到主分支模块,但与此同时发生的事情是你的一个队友已经制定了新的模块EF并修改C
所以现在发生的事情是您的本地存储库缺乏项目的原始进度,因此将更改推送到主分支可能会导致冲突并可能导致模块D出现故障。

为避免此类问题并与项目的原始进度并行工作,他们有两种方式:

1. Git Fetch-这将下载对原始/主分支项目所做的所有更改,这些更改在本地分支中不存在。并将等待Git Merge命令将已提取的更改应用于您的存储库或分支。

所以现在您可以在将文件合并到存储库之前仔细监视这些文件。D如果需要,你也可以修改因为修改C

2. Git Pull-这将使用origin / main分支更新您的本地分支,即实际上它的作用是Git Fetch和Git的组合一个接一个地合并。但这可能会导致冲突发生,因此建议使用Git Pull和干净的副本。


Git允许在较新的提交后应用按时间顺序排列的旧提交。因此,在存储库之间传输提交的操作分为两个步骤:

  1. 将新提交从远程分支复制到本地存储库中的此远程分支的副本。

    (回购回购业务) [email protected] >> remote/origin/[email protected]

  2. 将新提交集成到本地分支

    (内部回购操作) remote/origin/[email protected] >> [email protected]

有两种方法可以执行第2步。您可以:

  1. fork最后一个共同祖先之后的本地分支,并添加与本地存储库唯一的提交并行的新提交,通过合并提交,关闭fork来最终确定。
  2. 在最后一个共同祖先之后插入新提交并重新应用对本地存储库唯一的提交。

git术语中,步骤1是git fetch,步骤2是git mergegit rebase

git pullgit fetchgit merge


git-pull - Fetch from and merge with another repository or a local branch
SYNOPSIS

git pull   …
DESCRIPTION

Runs git-fetch with the given parameters, and calls git-merge to merge the 
retrieved head(s) into the current branch. With --rebase, calls git-rebase 
instead of git-merge.

Note that you can use . (current directory) as the <repository> to pull 
from the local repository — this is useful when merging local branches 
into the current branch.

Also note that options meant for git-pull itself and underlying git-merge 
must be given before the options meant for git-fetch.

如果您想要合并历史记录,您可以选择,如果您只是想要“codez”,则可以获取,因为某些人已在此处标记了一些文章。


git pull = git fetch + git merge 






git-fetch