将开发分支与主分支合并

934

我在GitHub存储库中有两个分支,分别是masterdevelopment。如下所示,我在development分支中进行所有开发工作。

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

现在我想将development分支上的所有更改合并到master分支上。我的当前方法是:

git checkout master 
git merge development
git push -u origin master 
请告诉我我正在遵循的步骤是否正确。

10
git pull -u 用于为分支设置上游追踪(如果推送多个分支,则为所有分支设置)。一旦设置了追踪,它将持久存在。没有必要反复使用它。 - David Culp
15个回答

1404

通常我会先将master合并到development中,这样如果有任何冲突,我可以直接在development分支中解决,从而保持我的master干净。

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

两种方法并没有太大的区别,但有时我会注意到在合并分支到主分支master之后,我不想立即将它们合并,或者还有更多工作需要完成才能进行合并,因此我倾向于保持master不变,直到最终完成。如果您想跟踪谁何时执行了合并操作,则可以在合并时使用--no-ff标志来实现。这通常仅在将development合并到master(最后一步)时非常有用,因为您可能需要多次将master合并到development(第一步),为这些操作创建提交节点可能并不是非常有用。
git merge --no-ff development

88
这种方法存在一个小瑕疵:合并到主分支的实际操作可能是快进合并,因此不会创建任何提交节点。这对于分支上的实际代码没有问题,但后来很难找出谁在什么时候进行了主分支的实际合并。需要显式使用 --no-ff 将合并到主分支来解决这个问题。 - michas
15
是的,正是这就是 --no-ff 的作用。 :) - michas
22
这是 git merge --no-ff development 命令,只是为了更正 @elect 的使用方式。 - jewbix.cube
2
@sailesh 你能否更新你的答案,包括 git merge 标记,如果你同意这些评论的话? - Web User
2
@Mars,如果旧更改是直接祖先的提交,则合并将覆盖文件。例如,让A->B->C为主分支,A->X->Y为您的开发分支。如果您在X中更改了文件的一部分,可能与A中的更改冲突,那么这不会是一个冲突,因为AX的祖先。关于丢失的更改,请查看https://dev59.com/3Ww05IYBdhLWcg3wmC0o#7147749以恢复任何更改。 - Sailesh
显示剩余4条评论

128

就我个人而言,我的方法与你的类似,只是有一些更多的分支和当它们返回主分支时压缩提交记录。

我的一个同事不喜欢频繁切换分支,他会一直停留在开发分支上,并执行以下类似的操作(所有操作都从开发分支上执行)。

git fetch origin master    
git merge master    
git push origin development:master

第一行确保他已经获取了自上次更新本地仓库以来在主分支中进行的任何向上游提交。

第二行将这些更改(如果有)从主分支合并到开发分支中。

第三行将开发分支(现在已完全合并到主分支)推送到 origin/master。

我的基本工作流程可能有点不对,但这是主要内容。


谢谢!这对我来说更具直观意义。 - Jamie Nicholl-Shelley
2
是的 - 在我写这篇文章的6年多以来,我也采用了它 - 不过使用rebase更新dev分支而不是合并。 - David Culp

49

以下是对于没有分支相关知识的人们的解释。

基本的主分支/主干开发逻辑是:你只在其他分支上工作,所以你只使用主分支/主干来与准备合并的另一个分支进行合并。

您可以按照以下步骤创建一个新分支:

  1. 在本地目录中克隆存储库(或创建一个新存储库):
$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git
  1. 创建一个新分支。它将包含您的主分支存储库的最新文件。
(Note: 保留了原文中的 HTML 标签)
$ git branch new_branch
  1. 将当前的git分支切换到新分支new_branch
$ git checkout new_branch

做编码、提交代码等工作,和平常一样...
$ git add .
$ git commit -m “Initial commit”
$ git push # pushes commits only to “new_branch”

当这个分支上的任务完成时,与“master”分支合并:
$ git merge master
$ git checkout master # goes to master branch
$ git merge development # merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!
$ git push # pushes all “new_branch” commits to both branches - “master” and “new_branch”

我建议使用Sourcetree应用程序,以查看更直观的更改和分支树。

我喜欢你不在主分支上工作的方法。但今天当我在使用Gitflow时,我从develop创建了一个release分支。然后添加了一个发布说明文件并提交了。然后完成了发布,将其合并回master/develop。但我的主分支只有新添加的发布说明文件。之前在开发分支提交的其他文件没有更新到主分支中。 - Amit Shah
如果您正在使用主分支以外的其他分支,请确保您已经提交并且推送了更改到该分支。然后,您可以在github.com或bitbucket.com的图形界面上查看文件,并尝试在网站上单击Merge按钮。它应该会将您的所有更改从分支更新到主分支。 如果主分支有更新的文件,则会产生冲突并出现错误消息。 如果我的回答还不够好,请随时给我留言 :) - Gediminas Šukys
我正在使用Sourcetree作为GUI和Github存储库。我尝试了两次发布测试,但主分支从未更新到最新的开发分支。 - Amit Shah
请尝试在正在工作的分支中使用github.com网站上的文件。它们已经被推送了吗? 如果是,则尝试单击相同的分支 - 合并,然后您将看到发生了什么。 就我的个人经验来说,使用Sourcetree的情况非常糟糕 - 我无法完全理解我的分支中正在发生的事情。 - Gediminas Šukys
感谢@Gediminas的详细解释。在阅读您的答案之前,我对git关键字感到困惑.. :) - Dinesh Suthar
@DineshSuthar 没问题。我建议你下载GitKraken并以可视化方式完成此操作!我发现这非常有价值 :) - Gediminas Šukys

44
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

26

如果您能使用Git Flow工作流程,那将是非常好的。它可以轻松地将开发分支合并到主分支。

您想要做的就是按照此处提到的git-flow说明进行操作:

步骤:

  • 设置git-flow项目
  • 创建分支并将所有内容合并到develop
  • 运行命令git flow release start <version_number>
  • 然后为版本发布提供一个有意义的消息
  • 运行命令git flow release finish <version_number>
  • 它会将所有内容合并到master并更改分支为master
  • 运行命令git push将更改发布到远程的master分支。

欲了解更多信息,请访问页面- http://danielkummer.github.io/git-flow-cheatsheet/


1
如果有人使用 Git Flow,解决方案是! - Csaba Toth

11

是的,这是正确的,但它看起来像一个非常基本的工作流,你只是在将更改缓冲起来,等待它们准备好进行集成。你应该研究一下 git 支持的更高级工作流。你可能会喜欢主题分支方法,它使你能够并行地处理多个功能,或者毕业方法,它稍微扩展了你当前的工作流程。


7

第一步

创建并切换到一个新的"dev"分支,该分支能够使您的本地git文件与远程保持同步,但"dev"分支尚不存在。

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

步骤二

在“dev”分支上进行你的更改(如果你遵循步骤一,那么“dev”分支就是当前的分支),并将它们提交并推送到远程的“dev”分支中。

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

步骤三

将你的“dev”分支合并到“master”分支。

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

7
如果你使用的是Mac或Ubuntu系统,前往分支的工作文件夹。在终端中,假设harisdev是分支名称。
git checkout master

如果存在未跟踪或未提交的文件,则会出现错误,您需要提交或删除所有未跟踪或未提交的文件。
git merge harisdev 

git push origin master

最后一个命令是删除该分支。

$ git branch -d harisdev

这里有哪些是特定于Mac或Ubuntu的? - talonx
抱歉,其他答案都没有提到命令应该在终端中输入,也没有提到删除分支的命令。实际上,我只是想添加删除分支的命令,以便开发人员将来不会与同一分支搞混。我正在使用Mac,所以我提到了它。你的问题是有效的,这些命令都不特定于Mac或Ubuntu。 - Haris Np
感谢澄清。 - talonx

5
这是我通常的做法。首先确保你已经准备好将你的更改合并到主分支中。
1. 使用 `git fetch` 检查开发分支是否与远程服务器上的最新更改同步。 2. 一旦 fetch 完成,使用 `git checkout master` 切换到主分支。 3. 执行 `git pull` 确保主分支拥有最新的更新。 4. 准备工作完成后,使用 `git merge development` 开始合并。 5. 使用 `git push -u origin master` 推送更改,完成操作。
你可以在这篇文章中了解更多关于 Git 合并 的内容。

3

根据@Sailesh和@DavidCulp的说法:


(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

第一条命令将确保您获得远程主分支上的所有上游提交,Sailesh回复说这不会发生。
第二个命令将执行合并并创建冲突,然后您可以解决这些冲突。
这样做之后,您最终可以切换到主分支,以切换到主分支。
然后,您将开发分支合并到本地主分支。no-ff标志将在主分支中创建一个提交节点,以便整个合并可跟踪。
之后,您可以提交和推送您的合并。
这个过程将确保从开发到主分支有一个合并提交,人们可以看到,在开发期间,他们如果去查看开发分支,就可以看到您对该分支进行的单个提交。
可选地,您可以在推送之前修改您的合并提交,如果要添加有关开发分支中所做内容的摘要。
编辑:我的原始答案建议使用git merge master,但这没什么用,最好在获取origin/master后执行git merge FETCH_HEAD

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