如何在不影响其他用户的情况下在分支之间插入 git 分支(并可能重命名)



我有一个与其他用户共享的存储库,所以我想要一个可以最大限度地减少其他人必须做的事情的解决方案,如果有一种方法他们可以拉动更改,我会喜欢的。

这是我目前的 git 分支:

A--B---------F (master)
       /
C--D--E (develop)

理想目标

A (master)

B---------F (stable)
       /
C--D--E (develop)

但是,如果这太难实现,特别是不会对已经拥有克隆的其他人(因为重命名)进行复杂的更改,那么我不介意它看起来像这样或类似:

A--B-------------F (master)
           /
B'--------F' (stable)
       /
C--D--E (develop)

简而言之:理想情况下,我很想创建一个空的新master等待来自stable的发布拉取请求,并将master重命名为stablemaster应该是master的父级。

或者,如果重命名使克隆存储库的其他人的事情复杂化:我希望当前的masterdevelop保持不变,但我希望在它们之间有一个名为stable的新分支,以便将来将稳定的develop提交合并到stable,并且可发布的stable提交合并到master

我想替代方案最终可能会看起来更像这样:

A--B---------F-------------M (master)
|         |           /
|         | `---I-----L (stable)
       /     /     /
C--D--E--G--H--J--K (develop)

其中 G,H,J,K 是新的开发提交,I 和 L 是来自稳定 H 和 K 的合并提交,M 是来自 L 的可发布合并提交。我认为我可以很容易地通过将master分支为stable,然后确保我将来从develop合并到stable,并stable合并到master。还是 git 有分支之间父子关系的概念?

提前感谢您提供任何解决方案!

编辑:根据托雷克给出的答案,我们可以

  1. 结帐develop不会改变
  2. master创建stable
  3. 在提交 A 时从master创建main

它看起来像这样:

,---------------------M (main)
/                     /
/         ,-----I-----L (stable)
/         /     /     /
A---------F     /     / (deprecated master)
       /     /     /
B--C--D--G--H--J--K (develop)

执行以下操作后:

git checkout develop
git branch stable master
git branch main <first commit hash>

Git 中的父/子关系仅与提交相关联。 在 Git 中,每个分支名称实际上只是该分支中最后一个提交的标签(这可能是其他分支中的中间提交:例如,上一个示例中的KL就是这种情况)。

分支名称可以任意移动,因此在第一个示例中,在创建新名称stable指向提交F后,您可以将masterF移回A

git switch develop        # so that we're on one that doesn't move
git branch stable master
git branch -f master <hash-of-A>

这里棘手的部分是,每个拥有此存储库克隆的人都将拥有其克隆的origin/master远程跟踪名称,也指向提交F。 这些克隆将在git fetch origin上更新自己的origin/master名称,以便它们指向A,但如果它们将自己的master名称指向现有的提交F则它们的Git 软件不会仅仅因为origin/master移动而移动master分支名称——并且他们的 Git 软件将不愿意将他们的master"向后"移动, 从F回到A,并且需要一些力量。

如果您倾向于将master重命名为main,这是这样做的好时机:不要管mastermain指向现有提交A创建新名称,并告诉人们运行git fetch。 他们将得到一个新的origin/main指向A. 告诉他们按照通常的方式创建自己的main,如果他们愿意的话——如果他们不使用它,他们就不需要它。 告诉他们名称master现在已经死了,将被删除,一旦他们根据需要对其他一些分支名称进行提交,他们就应该删除自己的master

请记住,每次提交都是 100% 只读的,因此您无法将现有F更改为将F'作为父级。 您始终可以进行新的提交,这些提交可以包含您喜欢的任何快照,以及您喜欢的任何父哈希 ID 列表(以便它们向后指向您进行新提交时存在的任何提交)。 任何分支名称都可以指向任何提交,但是:

  • 每个克隆都有自己的分支名称;
  • Git 愿意随时向分支添加提交(通过将名称"forwards"滑动到新提交,只要它在此过程中不会丢失旧提交,或者通过合并新提交)。 它需要施加力(如git branch -fgit reset)将分支名称"向后"移动(提交链接的实际方式,从子项向后移动到父项)。

因此,让此存储库的其他克隆添加内容非常容易。这是自动发生的:人们无论是否愿意,都会获得新的提交。 但是很难让人们收回树枝:这需要每个人的体力劳动。


关于您的编辑:

。它看起来像这样:

,---------------------M (main)
/                     /
/         ,-----I-----L (stable)
/         /     /     /
A---------F     /     / (deprecated master)
       /     /     /
B--C--D--G--H--J--K (develop)

一旦您进行了更多提交并进行合并M,最终会这样做,是的。 (要从您开始的地方到达那里,您只需运行:

git branch main <hash-of-A>   # or git branch main master~2
git branch stable master

在任何 GitHub 样式的服务器上,使用 Web 界面将"默认分支"设置为现在main,也可以选择完全删除master。 要设置默认分支,GitHub 将运行git symbolic-ref HEAD refs/heads/main,或者在他们使用的任何软件中等效的任何内容。

最新更新