更改Git主分支路径?

时间:2018-08-06 10:22:54

标签: git

我想更改master分支的路径。我不知道如何描述它,所以这是一张图像,显示了我的意思。在左侧,您可以看到当前状态,在右侧,您可以看到所需的状态:

因此,尽管有两条路径,但主分支中的一条提交应该在侧分支中,反之亦然。有办法吗?

2 个答案:

答案 0 :(得分:1)

尝试重命名分支:

git branch -m master new-name
git branch -m old-name master

如果要交换名称:

git branch -m master temp-name
git branch -m old-name master
git branch -m temp-name old-name

答案 1 :(得分:1)

evolutionxbox commented一样,您不能总是信任graph- 查看者提供的颜色(信任的程度取决于特定的查看者)。但是,Git本身确实对通过图表的某些路径具有一定意义。

与任何图形一样,提交图可以定义为 G =(V,E),其中 G 是图形,而 V E 分别是顶点(或节点)集和边集。在这种特殊的数学形式中,所有边都是相等的:从节点ID为c123456的合并提交向后通过其第一父边向a000000还是通过其第二父边都没关系提交b000000。但是对于Git,--first-parent的{​​{1}}标志会修剪掉所有不是第一次提交的合并提交边。

也就是说,图的数学属性不依赖于路径顺序,Git的大多数部分同时沿两条路径下降,但是出于某些目的,尤其是包括git log,您可能真的想要< / em>来控制哪个父母是第一个父母,哪个是第二个。

不幸的是,一旦进行了合并提交,就 无法更改。任何提交都无法更改;地球上没有任何力量可以做到这一点。

您可以 以另一顺序进行 new 合并,以使新合并的第一个父节点是该节点的第二个父节点。当前合并,并且新合并的第二个父级是当前合并的第一个父级。为此,请在Git中签出第二个父级(最好同时附加一个新的分支名称),然后运行git log --first-parent(请注意,您可以直接使用两个哈希ID,也可以使用{{ 3}}找到了它们):

git merge ID-of-first-parent

由于合并后 至少有三个提交,因此您还需要复制那些提交:

$ git checkout -b rework <ID of second parent>
$ git merge <ID of first parent>

如果您确实有未提交的更改-上面的图像看起来像$ git cherry-pick <ID>..<ID> 的输出,并且gitk发明了一个伪造的提交图节点以进行未提交的更改-您可以在单独的工作中完成所有这些操作-树,或者只先提交更改,这样您就可以在其中使用干净的树。

一旦在名为gitk的新分支上建立了这个新图段,就可以强行重新指向标签rework来指向最终的此类提交。与原始链不同,该 提交链具有合并提交,其第一父级是您希望作为其第一父级的提交。也就是说,两个父母是相反的。这是因为 any 合并提交的第一个父级始终是运行master HEAD的提交。假设您已经建立了新链并对此感到满意,并且仍然在git merge分支上:

rework

或:

git branch -f master rework

请注意,这种类型的提交重做假定您尚未将合并提交和后续提交交付给任何其他Git存储库,或者,如果有的话,使用的其他所有人都是可以以一种特殊的方式更改git checkout master && git reset --hard rework

也请注意,master进行了这种“反向”合并(从一种特定的角度来看是反向的;从另一种自恋的角度来看,它们是完全正确的!)。有人将此称为the gitrevisions documentation。如果您可以控制服务器上的预接收或更新挂钩,则可以禁止它们。作为用户,您可以避免使用git pull。 (我建议一般避免使用git pull:这是一个方便的命令,很不方便。)