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

vij*_*jar 47 git version-control merge

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

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

git fetch origin
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mik*_*icz 74

获取,合并和拉取

git fetch并且git merge origin/master将获取与整合远程变化.让我解释一个常见的情况.产地/主是C.有人推D.你对E&F.请注意,你不会看到d在你的本地库,直到你运行工作git fetch.

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote
Run Code Online (Sandbox Code Playgroud)

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

A-B-C-E-F < master
     \
      D < origin/master, master on remote
Run Code Online (Sandbox Code Playgroud)

现在你跑git merge,给你这个:

A-B-C-E-F
     \   \
      D---G < master
      ^
    origin/master, master on remote
Run Code Online (Sandbox Code Playgroud)

所以现在你已经将master(E,F)上的更改与origin/master(D)上的新提交集成在一起.

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

没有抓取的git合并

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

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote
Run Code Online (Sandbox Code Playgroud)

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

Already up-to-date.

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

什么是最好的?

以上都不是.:)

git fetch
git rebase origin/master master
Run Code Online (Sandbox Code Playgroud)

或者是一种捷径,git pull -r但我个人更喜欢在改变之前看到这些变化.
这将在origin/master(D)之上重放您对master(E,F)的更改,而不会进行令人讨厌的合并提交.它产生:

A-B-C-D-E'-F' < master
      ^
   origin/master, master on remote
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我多次被警告 git rebase 是危险的。使用 git pull 和 git merge 时,git 日志问题有其解决方法。 (5认同)
  • @BasilMusa 如果仅在本地进行,则变基并不危险。我喜欢迈克回答中的最后警告,尽管我希望它更加突出。 (3认同)

小智 52

git pullgit fetch+ 相同git merge

命令

git pull <remote> <branch>
Run Code Online (Sandbox Code Playgroud)

真的就是一样的

git fetch <remote>
git merge <remote>/<branch>
Run Code Online (Sandbox Code Playgroud)

所以两者之间没有实际区别

git pull origin master
Run Code Online (Sandbox Code Playgroud)

git fetch origin
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

文档

正如官方Linux内核git pull文档中所述:

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

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

推荐阅读


Pet*_*oti 6

一个git pull是要运行git fetch,然后一个git merge。如果您想通过运行本地存储库来加快本地存储库的运行速度。

A git fetch将要从远程存储库导入提交而不合并它们,这使您有机会在集成之前对其进行检查。