Git 合并起源/主机和 git 拉之间的区别

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

我在这里浏览了几篇文章,得到了相互矛盾的信息。 很少有人谈论使用:

git fetch origin
git merge origin/master

其他一些人认为,“ git pull”应该得到改变。

我们的一个开发人员要求使用“ git 合并起源/主”而不使用“ git 获取”

有人知道这些选项中哪个更好吗。我在当地的分支机构试过“ git pull”,但似乎没有用。但是如果我在本地 master 上使用“ git pull”,它会工作得很好(不管我希望它在本地分支上如何工作)

148187 次浏览

一个 git pull将运行一个 git fetch,然后一个 git merge。如果您希望使用远程存储库来提高本地存储库的速度,那么可以运行这个远程存储库。

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

接球,合并,拉球

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

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

现在运行 git fetch。现在您可以看到 D,并且已经更新了 source/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)上的更改与 source/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 已经拥有了所有的 source/master。

What's best?

都不是。 :)

git fetch
git rebase origin/master master

或者一个快捷方式,git pull -r,但是我个人更喜欢在重新定基之前看到更改。
这将在 master (E,F)的原点/master (D)之上重播您的更改,而不会出现令人讨厌的合并提交。结果是:

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

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

一个警告——永远不要对已经推送的任何提交进行重新定基。请注意,E & F 在重新定基后成为 E’& F’。提交被完全重写,包括一个新的 SHA 和所有内容。如果您对已经公开的提交进行重新建基,那么开发人员在提交时将重新编写它们的历史记录。这太可怕了,每个人都会用邪恶的眼神看着你,躲着你。

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

文件

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

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

更准确地说,饭桶拉使用给定的参数运行 去捡回来,并调用 Git 合并将检索到的分支头合并到当前分支中。

推荐阅读