代码之家  ›  专栏  ›  技术社区  ›  maček

如何在同一个Git存储库中同步两个分支?

  •  27
  • maček  · 技术社区  · 15 年前

    下面是我经常遇到的一个常见的工作流障碍:

    师父是我们的“稳定”分支

    $ git status
    # On branch master
    nothing to commit (working directory clean)
    

    在分支上创建模块

    $ git checkout -b foo
    $ echo "hello" > world
    $ git add .
    $ git commit -m "init commit for foo module"
    $ git checkout master
    $ git merge foo
    

    在主分支或其他分支上工作

    在接下来的几周里,更多的代码将被直接提交给master和其他分支机构。 foo 在这段时间内,分支机构将保持原样

    继续工作/更新foo分公司

    $ git checkout foo
    

    哦不! 完全过时了!我理解 为什么 但是我 需要 恢复同步。

    问题

    如何从 master 分支?

    3 回复  |  直到 7 年前
        1
  •  31
  •   Adam Vandenberg    15 年前

    如果您不需要分支:

    如果你把foo合并回master,“git branch-d foo”来杀死主题分支,然后在将来需要再次入侵时“checkout-b foo”。

    如果您确实需要分支机构:

    您可以根据主分支重新设置主题分支:

    git checkout foo
    git rebase master
    

    或:

    git rebase master foo
    
        2
  •  5
  •   Mauricio Gracia Gutierrez    8 年前

    重新平衡是将一系列提交移动或组合到新的基本提交的过程。在功能分支工作流的上下文中,重新定位是最有用和最容易可视化的。一般过程可以可视化如下:

    Git Rebase visual explanation

    下面的示例将git rebase与git merge结合起来,以维护线性项目历史记录。这是一种快速简单的方法,可以确保合并被快速转发。

    # Start a new feature
    git checkout -b new-feature master
    # Edit files
    git commit -a -m "Start developing a feature"
    

    在我们的特性中间,我们意识到我们的项目中有一个安全漏洞

    # Create a hotfix branch based off of master
    git checkout -b hotfix master
    # Edit files
    git commit -a -m "Fix security hole"
    # Merge back into master
    git checkout master
    git merge hotfix
    git branch -d hotfix
    

    在将修补程序合并到master之后,我们有一个分叉的项目历史记录。不是简单的Git合并,而是将功能分支与一个Rebase集成,以保持线性历史:

    git checkout new-feature
    git rebase master
    

    这将新功能移动到主控形状的尖端,这使我们可以从主控形状执行标准的快进合并:

    git checkout master
    git merge new-feature
    

    取自 Atlassian Git Rebase Tutorial

        3
  •  1
  •   user74279    7 年前

    我使用下面的代码组合来自两个分支(我的和您的)的更改,并同步两个分支以继续工作。这似乎起作用了。有人看到它有问题吗?

    git checkout mine # make sure I'm on my branch
    git commit -a     # commit changes
    git push origin mine  
    git checkout yours # switch to your branch
    git pull origin yours # get changes you've committed & pushed
    git checkout mine 
    git merge yours # merge your changes into mine
    git push origin mine 
    git checkout yours 
    git rebase mine # set your branch to the merged result
    git push origin yours # push the merged result up to your branch on origin
    git checkout mine # get back to my branch