主分支和开发分支之间的“git pull”或“git merge”

253
我有一个称为“master”的分支和一个称为“develop”的分支,用于进行一些更改。我需要将来自“master”的更改合并到“develop”中,但最终会将所有内容从“develop”合并到“master”中。我有两种不同的工作流程:
  1. git pull origin master合并到develop分支
  2. git merge master合并到develop分支
哪种方式是最佳的,为什么?

18
推荐阅读:http://nvie.com/posts/a-successful-git-branching-model/ - Alex Brasetvik
3
git pull = git fetch + git merge FETCH_HEAD - Yousha Aleayoub
6个回答

355

这是我最喜欢的工作流程:

git checkout -b develop

......做出一些更改......

......注意主分支已经更新......

......将更改提交到开发分支......

git checkout master
git pull

将这些更改带回到develop分支中...

git checkout develop
git rebase master

进行一些修改...

将它们提交到develop分支中...

将它们合并到master分支中...

git checkout master
git pull
git merge develop

2
这也是我的工作方式,我发现它运行良好。不过有一件事我不做,那就是在最终的git merge develop之前执行git pull。那么这样做的目的是什么? - crdx
1
@a1an 不会,但如果你不提交它们,那么更改将移动到主分支,git 将不允许你拉取,直到它们被提交。 - elemjay19
5
很可能在你将分支合并到本地主分支之前,其他分支已经被合并到了远程主分支。你需要拉取远程主分支的变更到你本地主分支的副本中。这就是我理解的方式。 - Tarun
12
在你的开发分支上运行git pull --rebase origin master会更快一些。 - Nathan Lilienthal
我需要澄清一些事情:这个答案假设develop分支不是被多个用户共享的,对吗?或者,如果我们有一个master和一个develop分支被多个用户拉取,这个解决方案是否可行?例如,如果每个用户通常将他们的特性分支发送到develop中,但某些热修复被应用到了master中,我们该如何将热修复的更改更新到我们的develop分支上?似乎对其他用户来说,变基共享的develop分支是个坏消息,因为它需要强制推送变基后的develop分支。 - modulitos
显示剩余5条评论

111

谨慎使用变基(rebase)操作。如果你与别人共享开发分支,变基可能会搞砸一些东西。变基只适用于你自己的本地分支。

通常情况下,如果你已经将分支推送到远程仓库,请勿使用变基操作,应使用合并(merge)操作。


在私有仓库上重新定位并使用 git push origin rebasedBranch --force 是安全的吗?唯一的用户是我自己。 - k0pernikus
是的,如果你是唯一的用户,当然是安全的。我在成为唯一用户时经常使用 git push --force。 :) - Tyler Rick
3
我重申Eric的警告。虽然可以重新设置你自己的远程分支。尝试使用rebase和merge命令,你将会理解它们各自的优缺点,并学会何时使用它们。 - Ian Lotinsky
使用rebase的好文章,即使解决冲突后也可以合并: https://github.com/everpix/Everpix-Intelligence - Ian Lotinsky
@IanLotinsky,你的链接没有指向有关rebase的文章。可能性很小,但你还有正确的链接吗? :) - Daniel Serodio
我不理解这个答案,问题是关于在pull或merge之间使用哪一个,而不是rebase。 - Albizia

26

在这种情况下,最好的方法可能是使用git rebase。 它允许您将主分支中的更改拉入开发分支,但保留所有开发工作“置于”(提交日志中较晚)主分支的内容之后。 当您的新工作完成时,合并回到主分支就变得非常简单。


10
好的建议,假设“develop”没有与任何其他人分享。 - Karl Bielefeldt
1
@KarlBielefeldt如果develop与其他贡献者共享,那么当一些热修补直接推到主分支时,我们该如何更新develop?我们应该执行合并操作,例如git checkout master && git pull --rebase && git checkout develop && git merge master吗?我在上面得票最高的答案中留下了评论,其中也详细说明了这个问题。 - modulitos

6

如果你不与任何人共享develop分支,那么每当主分支更新时,我会仅对其进行变基操作,这样一来,当你将develop合并回主分支时,你的历史记录中就不会有合并提交了。在这种情况下,工作流程如下:

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

以上步骤将确保您的开发分支始终处于主分支最新更改的顶部。一旦您完成了开发分支并将其合并到主分支上的最新更改,您只需将其合并回来即可:
> git checkout -b master
> git merge develop
> git branch -d develop

1

我的经验法则是:

rebase 用于具有相同名称的分支,否则使用 merge

具有相同名称的示例包括 masterorigin/masterotherRemote/master

如果 develop 仅存在于本地存储库中,并且始终基于最近的 origin/master 提交,您应该将其称为 master,并直接在那里工作。这简化了您的生活,并呈现实际情况:您直接在 master 分支上进行开发。

如果 develop 是共享的,则不应将其重新基于 master,而应使用 --no-ff 合并回去。您正在 develop 上进行开发。 masterdevelop 具有不同的名称,因为我们希望它们成为不同的事物,并保持分离。不要使用 rebase 使它们相同。


1

我更喜欢使用git pull origin <branch_name>而不是合并到我要合并的分支。

事实上,我从来没有使用过git merge <branch_name>。原因是我在开始使用GitLab时遇到了一个错误。

但现在这种方法更加合理...因为git pull执行以下操作: (a) git fetch (b) git merge

两个命令相比于一个命令,使得工作更快捷。

附注:如果你不确定会发生什么,最好使用“拆分”的命令;)


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