我有一个与其他用户共享的存储库,所以我想要一个可以最大限度地减少其他人必须做的事情的解决方案,如果有一种方法他们可以拉动更改,我会喜欢的。
这是我目前的 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
重命名为stable
。新master
应该是旧master
的父级。
或者,如果重命名使克隆存储库的其他人的事情复杂化:我希望当前的master
和develop
保持不变,但我希望在它们之间有一个名为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 有分支之间父子关系的概念?
提前感谢您提供任何解决方案!
编辑:根据托雷克给出的答案,我们可以
- 结帐
develop
不会改变 - 从
master
创建stable
- 在提交 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 中,每个分支名称实际上只是该分支中最后一个提交的标签(这可能是其他分支中的中间提交:例如,上一个示例中的K
和L
就是这种情况)。
分支名称可以任意移动,因此在第一个示例中,在创建新名称stable
指向提交F
后,您可以将master
从F
移回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
,这是这样做的好时机:不要管master
,main
指向现有提交A
创建新名称,并告诉人们运行git fetch
。 他们将得到一个新的origin/main
指向A
. 告诉他们按照通常的方式创建自己的main
,如果他们愿意的话——如果他们不使用它,他们就不需要它。 告诉他们名称master
现在已经死了,将被删除,一旦他们根据需要对其他一些分支名称进行提交,他们就应该删除自己的master
。
请记住,每次提交都是 100% 只读的,因此您无法将现有F
更改为将F'
作为父级。 您始终可以进行新的提交,这些提交可以包含您喜欢的任何快照,以及您喜欢的任何父哈希 ID 列表(以便它们向后指向您进行新提交时存在的任何提交)。 任何分支名称都可以指向任何提交,但是:
- 每个克隆都有自己的分支名称;
- Git 愿意随时向分支添加提交(通过将名称"forwards"滑动到新提交,只要它在此过程中不会丢失旧提交,或者通过合并新提交)。 它需要施加力(如
git branch -f
或git 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
,或者在他们使用的任何软件中等效的任何内容。