将开发分支与母版合并


763

我有两个分支,即masterdevelopment在GitHub的库。如图所示,我正在开发部门进行所有开发工作。

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 

请让我知道我遵循的步骤是否正确。


7
git pull -u为分支(或所有分支,如果推多个)设置上游跟踪。设置后,跟踪将继续。没有理由连续使用它。
David Culp

Answers:


1164

我通常喜欢合并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-ffflag。这通常仅在合并developmentmaster(最后一步)时才有用,因为您可能需要在工作流中多次合并masterdevelopment(第一步)中,并且为它们创建提交节点可能不是很有用。

git merge --no-ff development

71
这种方法有一个明显的缺点:与master的实际合并很可能是快速转发合并,因此不会创建任何提交节点。这与分支上的实际代码没有关系,但是使以后很难找到谁进行了实际合并并掌握了。--no-ff需要对合并进行显式修改才能解决。
2013年

11
是的,这正是--no-ff目的。:)
michas 2014年

19
git merge --no-ff development只是为了纠正@elect的用法。
jewbix.cube

2
@sailesh,如果您同意这些意见,可以更新您的答案以包含git merge标志吗?
网络用户

2
@Mars,如果旧更改是在提交的直接祖先进行的,合并将覆盖文件。例如,让我们A->B->C成为master,并且A->X->Y是您的dev分支。如果您更改了文件中X可能与更改发生冲突的部分A,则不会发生冲突,因为它A是的祖先X。关于丢失的更改,请访问stackoverflow.com/questions/7147680/…以恢复所有更改。
Sailesh

103

就个人而言,我的方法与您的方法相似,当它们重新掌握时,会有更多的分支和一些提交。

我的一位同事不喜欢这么多地切换分支,而是停留在开发分支上,类似于以下所有从开发分支执行的操作。

git fetch origin master

git merge master

git push origin development:master

第一行确保他具有自上次更新其本地存储库以来已进行的任何上游提交。

第二个将那些更改(如果有)从主版本拉入开发阶段

第三个将开发分支(现已与master完全合并)推向原始/ master。

我的基本工作流程可能有些错误,但这是其主要要点。


谢谢!这对我来说更直观。
Jamie Nicholl-Shelley

2
是的-自撰写此书以来已有6年以上的时间,我也采用了它-尽管使用rebaseupdate dev而不是update merge
David Culp

32

对于那些不了解分支机构而来到这里的人,请从底部进行解释。

基本的master分支开发逻辑是:您只能在另一个分支上工作,并且只能使用master来合并另一个分支。

您开始以这种方式创建一个新分支:

1)在本地目录中克隆存储库(或创建一个新的存储库):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2)创建一个新分支。它将包含您的主分支存储库的最新文件

$ git branch new_branch

3)将您当前的git分支更改为new_branch

$ git checkout new_branch

4)像往常一样进行编码,提交…

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5)当该分支上的作业完成时,与“ 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”)

更新:我强烈建议为此使用GitKraken来查看变化的可视树并更好地查看所有逻辑和提交。


我喜欢您不学习大师的方法。但是今天,当我玩gitflow时,我创建了的release分支develop。然后添加发行说明文件并提交。然后完成发布,合并回两者master/develop。但我的master分支只在其中添加了新的发行说明。之前的开发提交过程中没有其他文件被更新。
阿米特·沙阿

如果您在除master之外的其他分支上工作,请确保已提交更改并将其推送到该分支。然后您可以在github.com或bitbucket.com的图形界面上查看文件的外观,然后尝试在网站上单击“合并”。它应该更新从分支到主节点的所有内容。如果master具有较新的文件,则应该存在冲突,您将收到错误消息。不确定我的回答是否足够好,如果没有,请给我消息:)
Gediminas

我正在使用sourcetree作为GUI和github存储库。我尝试了2次发布测试。大师从来没有更新过最新的开发分支。
阿米特·沙

尝试在github.com网站上使用您正在处理的分支的文件。他们被推?如果是,请尝试单击同一分支-合并,您将看到会发生什么。根据我对sourcetree的个人经历,这非常糟糕-我也无法完全理解分支机构中正在发生的事情
Gediminas

感谢@Gediminas提供详细说明。在阅读您的答案之前,我对git关键字感到困惑.. :)
Dinesh Suthar '19

21

如果您可以使用Git Flow工作流程,那就太好了。它可以很容易地将开发分支合并为母版。

您要做的只是按照此处提到的git-flow指令进行操作:

脚步:

  • 设置git-flow项目
  • 创建分支并合并一切以进行开发
  • 运行命令 git flow release start <version_number>
  • 然后为发布提供有意义的信息
  • 运行命令 git flow release finish <version_number>
  • 它将所有内容合并到master并将分支更改为master
  • 运行命令git push以将更改发布到远程主服务器

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


1
如果有人使用git flow的解决方案!
Csaba Toth

21
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


6

如果您使用Mac或Ubuntu,请转到分支的工作文件夹。在终端

假设harisdev是分支名称。

git checkout master

如果存在未跟踪或未提交的文件,则会出现错误,并且必须提交或删除所有未跟踪或未提交的文件。

git merge harisdev 

git push origin master

最后一个删除分支的命令。

$ git branch -d harisdev

这是Mac或Ubuntu特有的?
talonx

抱歉。没有其他答案提到应在终端中给出命令以及删除分支的命令。实际上,我只是想添加删除分支的命令,以使开发人员将来不会再使用同一分支。我使用的是Mac,因此我提到了它。您的问题是有效的,并且这些命令都不是特定于Mac或Ubuntu的。
哈里斯·NP

感谢您的澄清。
talonx

5

步骤1

创建并切换到新的“ 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.

第2步

对“ dev”分支进行更改(如果遵循步骤1,则为当前更改),提交并推送到远程“ 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.

4

这就是我通常这样做的方式。首先,请确保已准备好将更改合并到主数据库中。

  1. 使用以下命令检查远程服务器上的最新更改是否是最新的开发 git fetch
  2. 提取完成后git checkout master
  3. 通过执行来确保master分支具有最新更新 git pull
  4. 准备工作完成后,您可以开始合并 git merge development
  5. 使用推动更改,git push -u origin master您就完成了。

您可以在本文中找到有关git合并的更多信息。


3

1)在开发分支上,使用以下命令检查git status:

git status

不应有未提交的代码。如果是这样,则将代码推送到Development分支:

git add *

git commit -m "My initial commit message"

git push origin Development

2)在开发分支上,运行以下两个命令:

git branch -f master HEAD

git push -f origin master

它将把您的Development分支代码推送到master分支。


这是否会将所有开发提交也推送到master,或者只是将新的单个提交添加到master?
滚动

1
这实际上如何工作?特别是当您在开发中时,“ git branch master”看起来很疯狂。如果已经有一个名为master的分支,如何创建一个新的分支master?文档说-f这样做:将<branchname>重置为<startpoint>。这是什么意思?
约翰·利特尔

这不是将本地主机推到远程主机上的力量吗?如果您在团队中工作,这似乎是个坏主意。
尼克,

-f不推荐。
DawnSong

2

基于@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响应不会发生。

第二个将执行合并并创建您可以解决的冲突。

这样做之后,您最终可以签出master切换到master。

然后,将开发分支合并到本地主机上。no-ff标志将在master中创建一个提交节点,以使整个合并成为可跟踪的。

之后,您可以提交并推动合并。

此过程将确保人们可以看到从开发到母版的合并提交,然后如果他们查看开发分支,就可以看到您在该分支的开发过程中对该分支所做的单个提交。

(可选)如果要添加开发分支中所做的摘要,则可以在合并提交之前对其进行修改。

编辑:我的原始答案建议git merge master不要执行任何操作,最好git merge FETCH_HEAD在获取来源/主文件后再执行


2

一旦“签出”开发分支,您就可以...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

1

如果使用的是gerrit,则以下命令可以正常使用。

git checkout master
git merge --no-ff development

您可以使用默认提交消息进行保存。确保已生成更改ID。您可以使用以下命令进行确认。

git commit --amend

然后使用以下命令进行推送。

git push origin HEAD:refs/for/refs/heads/master

您可能会遇到类似以下的错误消息。

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

为了解决这个问题,gerrit项目管理员必须在gerrit中创建另一个引用,名为“ refs / for / refs / heads / master”或“ refs / for / refs / heads / *”(以后将涵盖所有分支)。然后,向此引用授予“推送合并提交”权限,并在需要提交GCR时授予“提交”权限。

现在,再次尝试上述push命令,它应该可以工作。

学分:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


1

我认为最简单的解决方案是

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

这也保留了所有使用中的分支的历史记录


-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

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

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

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

1
当您看到错误几乎从来都不是正确的事时,请强制执行操作,除非您非常确定您知道本地分支为什么会丢失远程分支的提交。通常,最好再回到步骤3 pull。同样,还不清楚该答案与现有答案相比增加了什么价值。
凯尔·斯特兰德
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.