git merge origin/master 和 git pull 的区别

Posted

技术标签:

【中文标题】git merge origin/master 和 git pull 的区别【英文标题】:difference between git merge origin/master and git pull 【发布时间】:2014-03-12 11:18:59 【问题描述】:

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

我在这里浏览了几篇帖子并获得了相互矛盾的信息。 很少有人谈论使用:

git fetch origin
git merge origin/master

其他一些人认为,'git pull' 应该进行更改。

我们的一位开发人员要求在不使用“git fetch”的情况下使用“git merge origin/master”

有谁知道这些选项中哪个更好。我在本地分支上尝试了“git pull”,但似乎没有用。但是,如果我在本地主服务器上执行“git pull”,它工作正常(但我希望它适用于本地分支)

【问题讨论】:

您为git pull 提供的确切参数是什么? 【参考方案1】:

获取、合并和拉取

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 合并而不获取

在没有git fetch 的情况下运行git merge origin/master 毫无意义。如果没有git fetch,您的本地存储库将不知道远程存储库上的任何潜在更改,并且源/主控将不会移动。所以你处于这种状态,其中 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,但我个人更喜欢在我变基之前查看更改。 这将在源/主 (D) 之上重放您在主 (E, F) 上的更改,而无需令人讨厌的合并提交。它产生:

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

请注意,一切都在一条线上,您已准备好推动,而且历史看起来不像友谊手镯。

一个警告 - 永远不要对已经推送的任何提交进行变基。请注意,E & F 在变基后变成了 E' & F'。提交被完全重写,带有新的 SHA 和所有内容。如果您对已经公开的提交进行变基,开发人员将在拉取时为他们重写历史记录。这太可怕了,每个人都会给你邪恶的眼光并避开你。

【讨论】:

我多次被警告说 git rebase 很危险。使用 git pull 和 git merge 时,git log 问题有它的解决方法。 我认为当你的主分支是不应该直接编辑的东西并且你只需要拉下更改来创建一个分支时,rebase 方法是危险的它。 如果我的本地分支已被推送 2-3 次,因为本地分支未合并到 master 中怎么办?现在我还有一些更改要做,但在我想做 rebase 之前,就像你建议的那样。它会影响任何数据/任何数据丢失吗?请提出建议。 @BasilMusa 仅在本地进行变基并不危险。我喜欢迈克回答中的最后一个警告,尽管我希望它更加突出。 @JosiahYoder @MikeMonkiewicz 有没有办法阻止对已经推送的提交执行变基?如果我理解得很好,你的意思是如果我在自己的feature/ 分支上工作,但我已经推送了任何提交,我不应该执行变基?这是正确的吗?有什么办法可以避免误操作吗?谢谢!【参考方案2】:

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 将检索到的分支头合并到当前分支中.

推荐阅读

Pro Git § 2.5 Git Basics - Working with Remotes - Fetching and Pulling from Your Remotes。

【讨论】:

【参考方案3】:

git pull 将运行 git fetch,然后运行 ​​git merge。如果您想使用您将运行的远程存储库使您的本地存储库加速。

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

【讨论】:

以上是关于git merge origin/master 和 git pull 的区别的主要内容,如果未能解决你的问题,请参考以下文章

git里这个是merge remote-tracking branch origin/master'啥

git merge 和 git merge --no-ff的区别

git fetch和pull的区别

git fetch 和git pull 的差别

Git 代码更新:git fetch 和 git pull 的区别

git pull后为啥分支没有更新