git merge origin / master和git pull之间的区别

时间:2014-02-13 14:12:15

标签: git version-control merge

我正在开发一个本地分支“BDD-local”,并希望得到其他开发人员的更改。 其他开发人员正在使用他们自己的分支,一旦他们对单元测试感到满意,他们就会将更改推送到远程仓库(origin / master)。

我在这里经历了几个帖子并且收到了相互矛盾的信息。 很少有人谈论使用:

git fetch origin
git merge origin/master

其他人认为,'git pull'应该得到改变。

我们的一位开发人员要求在没有'git fetch'的情况下使用'git merge origin / master'

有谁知道哪些选项更好。我在我的本地分支上试过'git pull',但它似乎没有用。但是,如果我对本地主人'git pull'它工作正常(但我希望它适用于本地分支)

3 个答案:

答案 0 :(得分:65)

获取,合并和提取

git fetchgit merge origin/master将获取&集成远程更改。让我解释一个常见的情况。 origin / master在C.有人推D.在E& F.请注意,在运行git fetch之前,您不会在本地存储库中看到D.

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

现在你运行git fetch。现在您可以看到D,并更新origin / master以匹配它正在跟踪的远程存储库。

A-B-C-E-F < master
     \
      D < origin/master, master on remote

现在你运行git merge,给你这个:

A-B-C-E-F
     \   \
      D---G < master
      ^
    origin/master, master on remote

所以现在你已经将你对master(E,F)的更改与origin / master(D)上的新提交进行了集成。

git pull只是上述步骤的快捷方式。

git merge而不提取

在没有git merge origin/master的情况下运行git fetch毫无意义。如果没有git fetch,您的本地存储库就不会意识到远程存储库上的任何潜在更改,并且origin / master也不会移动。所以你处于这种状态,其中D只在遥控器上而不在本地:

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

由于您的本地存储库没有D,git merge origin/master只会产生:

Already up-to-date.

因为嘿,就本地存储库而言,master已经拥有origin / master中的所有内容。

什么是最好的?

以上都不是。 :)

git fetch
git rebase origin/master master

或快捷方式,git pull -r,但我个人更喜欢在变基之前看到这些变化 这将在origin / master(D)之上重放您对master(E,F)的更改,而无需令人讨厌的合并提交。它产生:

A-B-C-D-E'-F' < master
      ^
   origin/master, master on remote

注意一切都在一行,你准备好推,历史看起来不像友谊手镯。

一个警告 - 永远不会修改任何已被推送的提交。请注意E&amp; F成了E'&amp; F'在变基础之后。提交完全被重写,使用新的SHA和一切。如果你重新定义已经公开的提交,开发人员将在他们提取时为他们重新编写历史记录。这太可怕了,每个人都会给你邪恶的眼睛并避开你。

答案 1 :(得分:41)

git pullgit fetch + git merge

相同

命令

git pull <remote> <branch>

完全相同
git fetch <remote>
git merge <remote>/<branch>

所以

之间没有实际区别
git pull origin master

git fetch origin
git merge origin/master

文档

official Linux Kernel git pull documentation中所述:

  

在默认模式下,git pullgit fetch的简写,后跟git merge FETCH_HEAD

     

更确切地说, git pull 使用给定参数运行 git fetch 并调用 git merge 将检索到的分支头合并到当前分支中

推荐阅读

答案 2 :(得分:4)

git pull将运行git fetch,然后运行git merge。如果您希望使用您将运行的远程存储库来加快本地存储库的速度。

git fetch将从远程仓库导入提交而不合并它们,这使您有机会在集成之前查看它们。