我正在开发一个本地分支“BDD-local”,并希望得到其他开发人员的更改。 其他开发人员正在使用他们自己的分支,一旦他们对单元测试感到满意,他们就会将更改推送到远程仓库(origin / master)。
我在这里经历了几个帖子并且收到了相互矛盾的信息。 很少有人谈论使用:
git fetch origin
git merge origin/master
其他人认为,'git pull'应该得到改变。
我们的一位开发人员要求在没有'git fetch'的情况下使用'git merge origin / master'
有谁知道哪些选项更好。我在我的本地分支上试过'git pull',但它似乎没有用。但是,如果我对本地主人'git pull'它工作正常(但我希望它适用于本地分支)
答案 0 :(得分:65)
获取,合并和提取
git fetch
和git 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 pull
与git 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 pull
是git fetch
的简写,后跟git merge
FETCH_HEAD
。更确切地说, git pull 使用给定参数运行 git fetch 并调用 git merge 将检索到的分支头合并到当前分支中
答案 2 :(得分:4)
git pull
将运行git fetch
,然后运行git merge
。如果您希望使用您将运行的远程存储库来加快本地存储库的速度。
git fetch
将从远程仓库导入提交而不合并它们,这使您有机会在集成之前查看它们。