873

我有两个分支master,即development在 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 

请让我知道我遵循的程序是否正确。

4

15 回答 15

1324

我通常喜欢合并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
于 2013-01-05T05:08:43.593 回答
119

就个人而言,我的方法与您的方法相似,当它们返回 master 时,会有更多的分支和一些压缩的提交。

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

git fetch origin master

git merge master

git push origin development:master

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

第二个将这些更改(如果有)从 master 拉到开发中

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

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

于 2013-01-05T06:18:49.540 回答
46

对于没有任何分支知识的人来说,从底部进行解释。

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

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

  1. 在本地目录中克隆存储库(或创建新存储库):
$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git
  1. 创建一个新分支。它将包含您的主分支存储库的最新文件
$ git branch new_branch
  1. 将当前的 git 分支更改为 new_branch
$ git checkout new_branch
  1. 像往常一样进行编码、提交……</li>
$ git add .
$ git commit -m “Initial commit”
$ git push # pushes commits only to “new_branch”
  1. 当这个分支上的工作完成后,与“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 应用程序来查看更改和分支的可视化树。

于 2017-08-19T12:38:23.437 回答
34
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
于 2017-10-10T09:17:04.850 回答
24

如果您可以使用Git Flow 工作流程,那就太好了。它可以轻松地将开发分支合并到主分支。

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

脚步:

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

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

于 2014-11-10T05:50:27.337 回答
11

是的,这是正确的,但它看起来像是一个非常基本的工作流程,您只是在准备好集成之前缓冲更改。您应该研究git 支持的更高级的工作流程。您可能喜欢主题分支方法,它可以让您并行处理多个功能,或者毕业方法,它可以扩展您当前的工作流程。

于 2013-01-05T05:08:53.010 回答
7

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

假设 harisdev 是分支名称。

git checkout master

如果有未跟踪或未提交的文件,您将收到错误,您必须提交或删除所有未跟踪或未提交的文件。

git merge harisdev 

git push origin master

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

$ git branch -d harisdev
于 2018-02-19T07:45:39.510 回答
6

第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.

第 3 步

将你的“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.
于 2017-11-23T11:02:13.480 回答
5

这就是我通常的做法。首先,确保您已准备好将更改合并到 master 中。

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

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

于 2018-05-22T12:02:47.180 回答
3

1)在分支开发中,使用以下命令检查 git 状态:

git status

不应该有未提交的代码。如果是,请将您的代码推送到开发分支:

git add *

git commit -m "My initial commit message"

git push origin Development

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

git branch -f master HEAD

git push -f origin master

它会将您的开发分支代码推送到主分支。

于 2017-08-28T12:20:23.087 回答
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)

第一个命令将确保您已向远程 master 提交了所有上游提交,并且不会发生 Sailesh 响应。

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

这样做之后,终于可以checkout master切换到master了。

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

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

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

或者,如果您想添加在开发分支中完成的操作的摘要,您可以在推送之前修改合并提交。

编辑:我的原始答案建议一个git merge master没有做任何事情的,最好git merge FETCH_HEAD在获取原点/主人之后做

于 2018-04-13T16:06:50.910 回答
1

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

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

 git checkout master 
 git merge dev
 git push origin master 
于 2019-02-01T09:53:32.600 回答
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

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

于 2019-03-06T09:17:04.923 回答
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/*' 的引用(这将涵盖未来的所有分支)。然后授予此引用的“Push Merge Commit”权限,如果需要提交 GCR,则授予“提交”权限。

现在,再次尝试上面的推送命令,它应该可以工作。

学分:

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

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

于 2019-04-05T12:27:26.323 回答
-6
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
于 2019-10-04T21:51:52.197 回答