【问题标题】:Merge development branch with master将开发分支与 master 合并
【发布时间】:2013-01-05 04:45:48
【问题描述】:

我在 GitHub 存储库中有两个分支,即 masterdevelopment。如图所示,我正在开发分支中进行所有开发。

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 

如果我遵循的程序正确,请告诉我。

【问题讨论】:

  • git pull -u 设置分支的上游跟踪(如果推送多个分支,则设置所有分支)。设置后,跟踪将持续存在。没有理由继续使用它。

标签: git git-merge


【解决方案1】:

我通常喜欢先将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 保持不变,直到最后的东西。

编辑:来自 cmets

如果您想跟踪合并的人员和时间,可以在合并时使用--no-ff 标志来执行此操作。这通常仅在将development 合并到master(最后一步)时有用,因为您可能需要在工作流程中多次将master 合并到development(第一步),并为这些创建提交节点可能不是很有用。

git merge --no-ff development

【讨论】:

  • 这种方法有一个小缺点:实际合并到 master 很可能是快进合并,因此不会创建任何提交节点。这对于分支上的实际代码没有问题,但是以后很难找出谁将实际合并到 master 以及在什么时间进行的。需要一个明确的 --no-ff 来合并到 master 来解决这个问题。
  • 是的,这正是--no-ff 的用途。 :)
  • 那是git merge --no-ff development 只是为了纠正@elect 的用法。
  • @sailesh 如果您同意 cmets,您能否更新您的答案以包含 git merge 标志?
  • @Mars,如果旧更改是提交的直接祖先,则合并将覆盖文件。例如,让 A->B->C 成为 master,A->X->Y 是你的 dev 分支。如果您更改了X 中可能与A 中的更改发生冲突的部分文件,则不会发生冲突,因为AX 的祖先。关于丢失的更改,请查看stackoverflow.com/questions/7147680/… 以恢复任何更改。
【解决方案2】:

就个人而言,我的方法与您的方法相似,只是多了几个分支,并且当它们返回 master 时会压缩一些提交。

我的一位同事不太喜欢切换分支,而是留在开发分支上,并在开发分支中执行了类似于以下所有内容的操作。

git fetch origin master

git merge master

git push origin development:master

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

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

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

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

【讨论】:

  • 谢谢!这对我来说更直观。
  • 是的——自从我写这篇文章以来的 6 年多时间里,我也采用了它——尽管用rebase 更新dev 分支而不是merge
【解决方案3】:

对不了解分行的来这里的人的解释。

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

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

  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. 像往常一样进行编码、提交……
$ 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 应用程序来查看更改和分支的可视化树。

【讨论】:

  • 我喜欢您不使用 master 的方法。但是今天当我玩 gitflow 时,我创建了 release 分支我们的 develop。然后添加了一个发行说明文件并提交。然后完成了合并回master/develop的版本。但我的主分支只有新添加的发行说明。之前的开发提交期间没有其他文件在其中更新。
  • 如果您在 master 以外的另一个分支上工作,请确保您已提交并将更改推送到该分支。您可以在 github.com 或 bitbucket.com 的图形界面上查看文件的外观,然后尝试在网站上单击“合并”。它应该更新从您的分支到主控的所有内容。如果 master 有较新的文件,则应该是冲突,您将收到错误消息。不确定我的回答是否足够好,如果没有,请给我留言:)
  • 我使用 sourcetree 作为 GUI 和 github 存储库。我尝试了 2 次发布测试。 master 从未更新过最新的开发分支。
  • 尝试在实时 github.com 网站上使用您正在处理的分支的文件。他们被推了吗?如果是,请尝试单击同一分支 - 合并,您将看到会发生什么。就我个人对 sourcetree 的体验而言,这非常糟糕 - 我也无法完全理解我的分支中发生的事情
  • 感谢@Gediminas 的详细解释。在阅读您的答案之前,我对 git 关键字感到困惑.. :)
【解决方案4】:
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

【讨论】:

    【解决方案5】:

    如果您可以使用 Git Flow 工作流程,那就太好了。它可以很容易地将develop分支合并到master中。

    你要做的就是按照这里提到的 git-flow 指令:

    步骤:

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

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

    【讨论】:

    • 有人用git flow的解决办法!
    【解决方案6】:

    是的,这是正确的,但它看起来是一个非常基本的工作流程,您只是在更改准备好进行集成之前对其进行缓冲。您应该查看 git 支持的 more advanced workflows。您可能会喜欢topic branch 方法,它可以让您并行处理多个功能,或者graduation approach 可以稍微扩展您当前的工作流程。

    【讨论】:

      【解决方案7】:

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

      假设 harisdev 是分支名称。

      git checkout master
      

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

      git merge harisdev 
      
      git push origin master
      

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

      $ git branch -d harisdev
      

      【讨论】:

      • Mac 或 Ubuntu 有什么特别之处?
      • 对不起。其他答案都没有提到应该在终端中给出命令和删除分支的命令。其实我只是想添加删除分支的命令,这样开发者以后就不会弄乱同一个分支了。我正在使用Mac,所以我提到了它。您的问题是有效的,这些命令都不是特定于 Mac 或 Ubuntu。
      • 感谢您的澄清。
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

          【解决方案10】:

          基于@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了。

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

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

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

          如果您想添加开发分支中所做工作的摘要,您可以在推送之前修改合并提交。

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

          【讨论】:

            【解决方案11】:

            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
            

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

            【讨论】:

            • 这会将所有开发提交也推送到 master 中,还是简单地将新的单个提交添加到 master 中?
            • 这实际上是如何工作的?特别是当你在开发时的“git branch master”看起来很疯狂。如果已经有一个名为 master 的分支,如何创建一个名为 master 的新分支?文档说 -f 这样做:将 重置为 。这是什么意思?
            • 这不是将本地master推到远程master上吗?如果您在团队中工作,这似乎是个坏主意。
            • -f 不推荐。
            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

              如果您使用的是 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

              【讨论】:

                【解决方案14】:

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

                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
                

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

                【讨论】:

                  【解决方案15】:
                  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
                  

                  【讨论】:

                  • 当你看到错误时强制推送几乎不是正确的做法,除非你非常确定你知道为什么你的本地分支缺少来自远程分支的提交。一般来说,最好回到第 3 步并再次pull。此外,与现有答案相比,这个答案增加了什么价值也不清楚。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-04-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-09-20
                  相关资源
                  最近更新 更多