Git再基并发症

Git再基并发症,git,Git,在我们准备发布之前,我们的离岸开发人员意外地将一个发布分支合并到master中。这使得我们没有主分支,也无法发布修补程序。我试图用一个重基来修复这个问题,但我不太明白发生了什么,我希望有人能解释一下。(如果有更好的方法) 发布分支是从主节点(在点A)创建的, 多个要素分支合并到其中(创建点B)。-到目前为止还不错。 释放分支合并到主机(坏!)快进主机到B点。 在master上完成的工作(修复程序,正确),将master从B带到C点。 发布时完成的工作(错误修复,更正),将发布带到D点(从B点)

在我们准备发布之前,我们的离岸开发人员意外地将一个发布分支合并到master中。这使得我们没有主分支,也无法发布修补程序。我试图用一个重基来修复这个问题,但我不太明白发生了什么,我希望有人能解释一下。(如果有更好的方法)

发布分支是从主节点(在点A)创建的,
多个要素分支合并到其中(创建点B)。-到目前为止还不错。
释放分支合并到主机(坏!)快进主机到B点。
在master上完成的工作(修复程序,正确),将master从B带到C点。
发布时完成的工作(错误修复,更正),将发布带到D点(从B点)

我想要实现的是将从B到C的更改带到A点,这样从A到B的更改就不再包含在C点中(但D点保持不变)

我从a点(新的主节点)创建了一个新的分支,并这样做:
git rebase——新的_主版本主版本

这就是我想要的,即在新的主控点a之后创建了一些新的变更集(将其带到E点),但它将新的主控点分支留在了a点,我不知道如何将标签向上移动到新的头部。它还将主分支保留在旧的点C,但我希望它至少回滚到点B,因为这些更改根本不应该存在。因此,我得到了两个表示相同更改的签入,一个设置为a的子项,另一个设置为B的子项

问题: 1) 如何将新的主标签移动到E点。
2) 我如何提交并推动这些更改,以便将其提交给团队的其他成员?
3) 师父为什么还坐在C点?(为什么C点仍然存在?
4) 如何使主标签移动到E点(如果可能)-该点现在位于不同的分支上?
5) 这显然不是应该怎么做的——那么,通过将发布合并到主版本来修复错误的正确方法是什么呢

原始图形
CD(主C,释放D)
3 |
|2
B/
1
A

最终图形
E
3
|CD(主C,释放D)
|3 |
|| 2
|B/
|1
|/
A(新硕士)

我想去的地方:

E(大师,理想情况下,我会很高兴有新的大师指点这里))
3
|D(释放)
|2
|B
|1
A/


老实说,听起来你想做一个简单的登记。重定基址将重写提交的历史,使其“从未发生”——但在清理提交时会让您有点头疼

git revert
允许您撤消由合并(或任何其他提交)引入的更改。如果您以后决定要进行这些更改,则必须还原还原(基本上是在还原SHA上进行还原)。

1)如何将新的主标签移动到E点。

git checkout new_Master
git reset --hard <sha1 of E>
3)为什么大师仍然坐在C点?(为什么C点仍然存在?

master只是一个指针,就像new_master一样。你可以将指针移动到任何你喜欢的地方,甚至可以回到过去。当您重新设置基础时,它不会自动完成;这只是移动了你重定基准的点。要更改分支点的位置,请签出分支,然后使用
git reset

4)如何使主标签移动到E点(如果可能)-该点现在位于不同的分支上?

git push <remote>
假设您也希望移动新的_Master,最简单的选项是

git checkout new_Master
git branch -d master
git reset --hard <sha1 of E>
git branch master
git签出新的\u主机
git分支-d主
git重置——硬
git分支主机
这将删除主节点,将新的主节点移动到需要的位置,然后从新的主节点创建新的主节点分支

5)这显然不是应该这样做的-那么,通过将发行版合并到主版本中来纠正错误的正确方法是什么呢?

git push <remote>
很多方法。我可能不会像别人建议的那样回头;不是因为它错了(它没有错),只是因为我对“大师”这个名字没有任何强烈的依恋。我认为你的方法对我来说已经足够好了,我会用我认为更“seft文档化”的方式来做

  • 结帐师傅
  • 创建一个新分支,可能是
    错误合并
  • 将主机重置为A
  • git-rebase——进入主版本错误合并
  • 附注sha-1
  • git签出主机
  • 将主机重置为新的sha-1
  • 如果这种情况发生在我身上,这将使树保持我想要的方式。

    1)
    git checkout new\u Master
    然后是
    git reset--hard

    2) 取决于您希望与团队分享的内容。如果你只是想分享新的分支
    new\u Master
    ,那么你显然可以做一些类似于
    git push origin new\u Master
    ,尽管我猜你更感兴趣的是让
    Master
    回到主回购上的状态?如果是这样,您可以执行以下操作(使用所有关于重新设置公共可见分支的常规警告)

    用新的、正确的
    new\u master
    强制覆盖主回购协议中损坏的
    master
    (同样,要加倍确保您知道这里发生了什么)

    然后,让每个使用回购协议的人在家里做以下事情:

    git checkout master
    git reset --hard <sha1 of A>
    git pull origin master
    
    C
    创建一个分支,这样我们就不会在下一步中丢失对它的引用

    git branch master_backup 
    
    master
    移回A。我们不会因为最后一步而丢失
    C

    git reset --hard <sha1 for A>
    

    master
    现在包含
    A
    之前的所有内容,以及
    B
    C
    之间引入的提交<代码>发布,据我所知,应该仍然是您想要的位置,不需要任何更改

    哇,这里的图表可能会有帮助。重设基础?这听起来不可取(在l
    git reset --hard <sha1 for A>
    
    git rebase --onto master release master_backup
    git checkout master
    get merge master_backup