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


243

我有我的master分支机构,还有一个develop要进行一些更改的分支机构。我需要合并从master到的更改develop,但最终将合并所有从develop到的更改master。我想到了两个不同的工作流程:

  1. git pull origin master进入develop分支
  2. git merge master进入develop分支

最好的方法是哪种,为什么?



2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

Answers:


104

变基要小心。如果您要与任何人共享您的开发分支,那么变基可能会使事情变得一团糟。Rebase仅对您自己的本地分支机构有用。

凭经验,如果您已将分支推至原点,请不要使用rebase。而是使用合并。


然而,重新建立基础git push origin rebasedBranch --force并进行私人回购是否安全?唯一的用户是我自己。
k0pernikus 2012年

是的,如果您是唯一的用户,那当然是安全的。当我是唯一的用户时,我一直使用git push --force。:)
泰勒·里克

3
我赞同埃里克的警告。虽然,也可以重新建立自己的远程分支基础。进行基础调整和合并,您将了解它们的优缺点,并了解何时使用它们。
伊恩·洛汀斯基

关于使用rebase甚至解决冲突后合并的好文章:github.com/everpix/Everpix-Intelligence
Ian Lotinsky 2014年

@IanLotinsky您的链接没有指向有关变基的文章。长镜头,但是您仍然有正确的链接吗?:)
Daniel Serodio

347

此工作流程最适合我:

git checkout -b develop

...进行一些更改...

...通知主文件已更新...

致力于发展

git checkout master
git pull

...将这些变化带回发展...

git checkout develop
git rebase master

...进行更多更改...

...让他们发展...

...将它们合并为主人...

git checkout master
git pull
git merge develop

2
这也是我的工作方式,我发现它运作良好。我没有做一件事,那git pull是决赛之前的事情git merge develop。目的是什么?
crdx 2012年

在...通知母版已更新...部分之后,如果您不提交它们,结帐母版是否不会擦除您要开发的本地更改?
2012年

1
@ a1an不,但是如果您不提交它们,那么更改将移至master分支,而git在您提交它们之前不允许您拉取。
elemjay19 2012年

5
@crdx在将分支合并到本地主机之前,其他分支可能会合并到远程主机。您将远程母版更改拉入本地副本。这就是我的理解。
塔伦

12
git pull --rebase origin master在您的开发分支上要快一些。
内森·利连塔尔

24

这类事情的最佳方法可能是git rebase。它允许您将更改从master拖入您的开发分支,但将所有开发工作都保留在master的内容之上(在提交日志中)。新工作完成后,合并回母版非常简单。


10
好的建议,假设develop不会与其他任何人共享。
Karl Bielefeldt

1
@KarlBielefeldt如果与其他贡献者develop 共享,将develop某些修补程序直接推送到时,我们将如何更新master?我们应该合并git checkout master && git pull --rebase && git checkout develop && git merge master吗?我对上面投票最高的答案发表了评论,这也详细说明了这一担忧。
modulitos

5

如果您不与任何人共享开发分支,那么我将在每次主服务器更新时对其重新设置基础,这样,一旦您将开发合并到主服务器中,您就不会在整个历史中拥有合并提交。在这种情况下的工作流程如下:

> 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

以上步骤将确保您的开发分支始终位于master分支的最新更改之上。一旦完成了develop分支并将其基于master的最新更改,您可以将其合并回去:

> 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。你正在发展developmasterdevelop使用不同的名称,因为我们希望它们是不同的东西,并且保持分开。不要使它们与相同rebase

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.