git merge origin/master和git pull的区别

127

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

我在这里看了几篇文章,得到了矛盾的信息。有些人谈论使用:

git fetch origin
git merge origin/master

有些人认为应该使用'git pull'来获取更改。

我们的一位开发人员要求使用'git merge origin/master'而不需要'git fetch'

有人知道哪个选项更好吗?我在本地分支上尝试了'git pull',但似乎没有起作用。但如果我在本地主分支上执行'git pull'则可以正常工作(然而我想让它在本地分支上工作)


1
你为 git pull 提供了哪些确切的参数? - dcastro
3个回答

174

fetch, 合并和拉取

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

现在,您已将主分支上的更改(E,F)与 origin/master 上的新提交(D)集成。

git pull 只是以上步骤的一种快捷方式。

没有进行 fetch 的 git 合并

执行 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,但是我个人更喜欢在rebase之前看到变化。
这将在origin/master(D)的基础上重放您在主分支(E、F)上所做的修改,而不需要一个丑陋的合并提交。它产生的结果为:

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

注意一切都在同一行,你准备好提交了,而且历史记录看起来并不像友情手链。

一个警告 - 永远不要对已经提交的提交进行变基。请注意,E&amp;F在变基后变成了E'&amp;F'。提交完全被重写,具有新的SHA和所有内容。如果您变基已经公开的提交,则开发人员在拉取时将其历史记录重新编写。那就很糟糕了,每个人都会用恶意的眼光看着你并回避你。


5
我被多次警告说git rebase很危险。而在使用git pull和git merge时,git log问题也有解决方法。 - Basil Musa
1
我认为,当您的主分支是不应直接编辑的内容,并且您只需要拉取更改以创建一个分支时,rebase方法并不危险。 - JustGage
如果我有一个本地分支,已经被推送了2-3次作为本地分支而没有合并到主分支。现在我还有一些更改要进行,但在此之前,我想像您建议的那样进行变基(rebase)。这会影响任何东西/数据丢失吗?请给予建议。 - Vishal Patoliya ツ
3
如果仅在本地进行,重新设置基础并不危险。我喜欢迈克答案中的最终警告,但希望它更加突出。 - Josiah Yoder
1
@Mike Monkiewicz “历史看起来不像友谊手链。” 哈哈哈,笑死我了 XD - CodeTalker
显示剩余4条评论

168

git pull命令等同于执行git fetchgit merge

该命令

git pull <remote> <branch>

实际上和

git fetch <remote>
git merge <remote>/<branch>

因此,没有任何实际差异。

git pull origin master

and

git fetch origin
git merge origin/master

文档

正如在官方Linux Kernel git pull文档中所述:

默认情况下,git pullgit fetch后跟git merge FETCH_HEAD的简写。

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

推荐阅读


在我看来,这是对OP问题最具体和简洁的回答。我也很喜欢你指向了明确解释它的git文档。谢谢。我确实欣赏Mike的回答中的详细解释,但这个答案正是我所寻找的。 - DryLabRebel

26

git pull 会运行 git fetchgit merge。如果你想要将本地仓库与远程仓库同步,那就运行这个命令。

git fetch 会从远程仓库导入提交记录,但不会合并它们,这样你就有机会在合并之前先审核它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接