【发布时间】:2014-04-13 09:30:08
【问题描述】:
我有大量的提交,带有各种版本标签,即:
root->x->x->1->x->x->x->2->x->x->3->x->4->x->x->x->5->master
我想在此开头附近插入一个新提交。问题是,我需要检查并重新标记所有内容,因为我的树最终看起来像这样:
root->x->x->y->x->x->x->x->x->x->x->x->x->x->x->x->x->x->master
\->1->x->x->x->2->x->x->3->x->4->x->x->x->5
有没有一种方法可以标记特定的提交,而不是特定的哈希?这样当我进行变基时,标签会应用于新树中的相同特定提交,而不是原始提交?
注意:我对说教不感兴趣 - 请不要发布任何回答,例如“你做错了”或“版本控制不应该这样工作”,除非你也可以提供建设性的替代方案。我需要一种方法来标记在 rebase 后将持续存在的提交,即使唯一可能的解决方案是“Git 不这样做,而是使用 X”。
【问题讨论】:
-
我将其作为评论发布只是因为您不想要这样的答案。 Git 不是那样工作的。 Git 中的提交具有加密完整性。您不能在不影响哈希的情况下更改它们的父级、作者、消息或补丁。根据补丁识别一个提交与另一个提交相同将是外部工具/命令的工作。
-
你的问题标题本身揭示了对 git 工作原理的深刻误解。出于所有意图和目的,哈希 is 提交。最终,您无法以任何其他方式明确识别提交。所有其他指定提交的方法都在后台解析为哈希。
-
@HaralanDobrev 但是当我做一个变基时,git 会重新计算所有的哈希值。那么它不能检测到哈希已经改变,并移动相关的标签指向新的提交吗?
-
@Benubird,插入一个提交只是你可以用 rebase 做的许多事情中的 一个。您可以改写提交消息,直接编辑提交的更改,将多个提交压缩为一个(如果您愿意,还可以改写消息),重新排序提交,完全省略某些提交,添加全新的提交......在大多数情况下没有任何自动方式来判断哪些“新”提交对应于“旧”提交。
-
重点是,哈希不只是“重新计算”——相反,对于您正在创建的 new 提交,哈希是新计算的,这(内部)与您基于它们的旧提交没有任何关系。我确实得到了您的问题,但是标签的全部目的是成为指向特定修订版的可靠 static 指针。但是,请参阅我的回答,了解一种“伪标记”提交的方式,该方式将继续通过变基。
标签: git version-control versioning rebase git-tag