【问题标题】:Coming from mercurial to git - merging?从 mercurial 到 git - 合并?
【发布时间】:2013-04-04 12:54:28
【问题描述】:

我使用 mercurial 已经有一段时间了,现在我改用 git,因为我的新团队使用它作为默认的版本控制工具。

让我解释一下 - 在我从 bitbucket 克隆项目的 mercurial 中,我对项目进行了一些更改。然后我再次从 bitbucket 中提取并将我的更改与 bitbucket 上已更改的所有内容合并。然后我推动一切。

它和 git 一样吗?我已经克隆了项目,进行了一些更改,对它们进行了一些提交,现在我提取了项目,并且我想合并。这些前面的步骤工作正常,但合并有点不同,或者至少在我看来不同。如何将我的提交与我刚刚从服务器拉取的新提交合并?

PS:我在服务器上的更改和更改都已在主分支上完成,我不希望合并 2 个分支。

【问题讨论】:

    标签: git mercurial merge


    【解决方案1】:
    git pull --rebase origin master
    

    拉入更改并将您的本地更改堆叠在顶部。

    但是,为几乎所有新功能创建分支是 Git 的预期工作流程,因此您可能还是想了解它们。快速分支和合并是 Git 的杀手级功能。

    【讨论】:

      【解决方案2】:

      我的建议是远离 git rebase/pull --rebase 直到您对 git 分支感到满意为止。现在,最令我惊讶的是还没有人提到的最重要的事情:

      hg pull 只是为您的本地仓库获取新的变更集,不会影响您的工作副本。

      git pull 获取新的提交并尝试自动将刚刚拉取的 HEAD 与本地 HEAD 合并。如果您有未提交的更改,可能会给您带来一些麻烦。

      解决方案:至少现在,总是使用 git fetch。这不会影响您的工作副本,并允许您在自己的时间进行合并,就像 Mercurial 一样。换句话说,git fetch = hg pull。

      【讨论】:

        【解决方案3】:

        作为 Mercurial 用户,我对它的理解是,在 Git 中,所有头部都必须有唯一的名称。因此,除非您给它一个新名称,否则它不会创建新的头部。所以在 Mercurial 中你可以这样做:

        hg pull   / git pull
        hg commit / git commit
        hg commit / git commit
        
        ----B----C1----C2 
        

        B 是您最初提取的基本版本,C1 和 C2 是您的更改。然后,您从服务器拉取更新。

        hg pull
        
        ----B----C1----C2
             \
              ----o----o----o
        

        Git 不会这样做,因为它必须创建另一个头。因此,您必须在服务器之上重新调整/移植您的更改。

        git pull --rebase
        
        ----B----o----o----o----C1----C2
        

        另一种方法是,当您在 Git 中开始工作时,您可以为自己的头脑命名。 Git 称之为分支,Hg 称之为书签。

        hg pull     / git pull
        hg bookmark / git branch
        hg commit   / git commit
        hg commit   / git commit
        
        ----B----C1----C2 
                        ^ New-Feature
        

        现在头部有了一个名字(在本例中为“New-Feature”)。现在 Git 会像 Hg 一样愉快地拉动。

        hg pull / git pull
        
        ----B----C1----C2
             \          ^ New-Feature
              ----o----o----o
        

        然后您也可以以相同的方式合并。

        【讨论】:

          【解决方案4】:

          您可能声称您不打算合并两个分支,但实际上您是。

          考虑初始状态:我们有两个头,masterorigin/master,它们都指向提交 A。然后有人添加提交BC 并推送到origin 远程,你fetch。但是,在获取之前,您将提交 DEF 添加到您的 master 分支,因此在 fetch 之后,DAG 布局如下所示:

          A ->  B -> C [origin/master]
          |
          \--> D -> E -> F [master]
          

          并且您想将更改推送到origin 存储库。但是您的更改显然与origin/master 分支冲突,为此,您必须合并origin/mastermaster

          有很多合并可能很难看,所以在一些重要的条件下,我们可以执行变基。但是,您必须小心 - 您不能将这些更改推送到任何其他外部存储库或类似的东西,否则您将破坏基于这些提交的任何其他内容。根据您当前的master,我也不会有任何其他内容,因为这些提交现在已经过时了。

          因此,您有两种选择:

          • origin/master 合并到master: git merge origin/master && git push origin master
          • master 重新设置为origin/mastergit rebase origin/master && git push origin master

          这两者都可以与git-fetch 组合以创建git-pull,除非您提供选项--rebase,否则它将自动使用合并方法,在这种情况下它会执行rebase

          由于rebase 命令的性质,请记住始终使用--rebase 时要小心。

          使用合并后的最终状态:

          A ->  B -> C -----> G
          |                   |
          \--> D -> E -> F ----
          

          使用变基后的最终状态:

          A -> B -> C -> D -> E -> F
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-08
            • 1970-01-01
            • 2017-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-24
            相关资源
            最近更新 更多