【问题标题】:Change root of a branch in git在git中更改分支的根
【发布时间】:2024-01-24 02:53:01
【问题描述】:

我正在使用 git 并想更改现有分支的基础。这是由部署系统引起的,该系统将此显式分支拉入我的生产环境。在计划我的发布时,我每次想要上线时都会创建一个标签。但是我的分支也有特殊的变化,所以git reset --hard v1.0 不起作用。

这里是一个小例子。我想要这个

      C---D---E deploy
     /
A---B---F---G master
     \
      v1.0

变成这样

                          C---D---E deploy
                         /
A---B---F---G---H---I---J---K master
     \                   \
      v1.0                v1.1

也许git rebase 是我正在寻找的,但手册页对我没有帮助。感谢您的回复!

【问题讨论】:

    标签: git tags branch reset rebase


    【解决方案1】:

    git rebase 应该如您所说,允许您更改部署的基础:

    git checkout deploy
    git rebase v1.1 # using the tag
    (or:
     git rebase J # SHA1 of J
     or
     git rebase master~1
    )
    

    但你最终会得到

    C'---D'---E' deploy
    

    也就是说,deploy 分支的提交部分的 SHA1 被重写,如果没有人克隆说 deploy 分支并正在处理它,这还不错。
    由于它是用于部署的分支,因此很可能是这种情况(即没有人在处理所述分支的克隆)。

    【讨论】:

    • 但是不能使用标签名?!
    • @micha149:是的,我把它误认为是一个分支名称!
    【解决方案2】:

    我不明白你为什么要失去原来的分支。在这种情况下我会怎么做:

     # create a new branch from your 1.1 tag
     git checkout -b deploy1.1 v1.1 
     # merge your existing branch into this one
     git merge deploy
    

    编辑:添加架构

    你最终会得到类似的东西

           C---D---E deploy
           /        \_______ 
          /                  F deploy1.1
         /                  /
    A---B---F---G--H--I--J--K--L
         \                   \
        v1.0                 V1.1
    

    【讨论】:

    • 我不想松开它,因为有一些重要的变化。就像一个完全添加的 Zend 框架库,数据库连接的配置和其他设置,我只需要在生产系统上。
    • 与我的提议一样,您保留原来的分支,并从 J 中合并了一个新分支,这意味着您仍然可以修改旧的 1.0 补丁分支并处理新分支(在您的绘图中,你删除了 C - D - E,因此我的问题)
    • 如果您需要跟踪每个部署所需的每个开发工作,我实际上更喜欢这个解决方案。 (所以+1)但如果所说的开发工作总是一样的,一个简单的变基就足够了。
    • 生产系统中的分支名称是固定的。如果我重新创建分支,生产系统似乎失去了跟踪。所以,我更喜欢变基变体。谢谢
    【解决方案3】:

    是的,你可以使用 rebase 来达到想要的效果。以下命令将检出deploy 分支并在v1.1 之上重放其所有无法通过v1.1 访问的提交:

    git rebase v1.1 deploy
    

    (详细的方式是:git rebase --onto v1.1 v1.0 deploy

    但为什么要重新设定和改变历史?您可以简单地将开发主线更改为您的部署分支:

    git checkout deploy
    git merge v1.1
    

    这将使您的所有提交哈希保持不变,您的历史记录将如下所示(M 是合并提交):

          C---D---E-----------M deploy
         /                   /
    A---B---F---G---H---I---J---K master
         \                   \
          v1.0                v1.1
    

    由于在变基期间和合并期间都可能出现冲突,因此在使用基于合并的方法时,您将有合并冲突的历史。使用变基,您没有变基操作期间发生的冲突历史。使用基于合并的工作流程,您稍后可以在合并提交的(组合)差异中看到您的冲突。

    【讨论】:

      【解决方案4】:

      git rebase 应该适合你:

      git checkout deploy
      git rebase master~1
      

      git rebase v1.1
      

      看看http://progit.org/book/ch3-6.html - 我认为应该可以帮助你更好地理解变基

      【讨论】: