我想在获取的遥控器上挑选一个提交,同时保留其原始 SHA 提交代码(我当前的分支基于我重置为先前状态的这个远程)。
git SHA 哈希是从不同的信息片段计算出来的:
- 它所指的树;基本上,是出现提交的分支中存储库的当前内容。
- 父提交的 SHA。
- 提交消息。
- 作者信息:姓名、电子邮件和时间戳。
- 提交者信息:名称、电子邮件和时间戳。
即使您编辑精心挑选的提交,使树、提交消息、作者和提交者信息完全相同,父提交的 SHA (或提交,如果处理合并提交)也将始终不同。因此,您将无法在挑选樱桃后生成相同的 SHA 哈希(除非您发现 SHA 冲突;))。
SHA 提交哈希由存储库的状态组成,使用整个历史记录直到提交点(不包括分支)。这意味着除非整个历史相同,否则您无法在樱桃采摘时保留原始哈希值,在这种情况下,采摘樱桃将毫无意义。
根据您对其他答案的评论,我认为您只想重置为一些远程提交。您可以使用git reset --hard <SHA>
来执行此操作。警告:这将丢弃工作目录中的所有(未提交的)更改,并且您在此分支中所做的所有提交将不再可访问。
如果这不是你想要的(或者你不确定),请更清楚地描述你做了什么,你想做什么,或者你想完成什么。
进入交互式变基("git rebase -i")并在末尾粘贴一个新条目,其中包含您要附加到 HEAD 的确切修订版。
例:
打开交互式变基会话:
$ git rebase -i HEAD~4
屏幕现在显示[类似]以下内容:
pick efdd0ece Linked how to make a pull requests in README
pick 790a3be8 adjust pytest pins to fix testing infra
pick 5bb90d8f drop 3.4 support
pick 839dc8ba v2.22.0
pick b97fb61a Print the type of the password instead of the password itself
您当前的 HEAD 是最后一个条目。在底部添加一个新条目(只需"选择"和您的修订版;无需描述),其中包含您要在前面加上的确切修订版:
pick efdd0ece Linked how to make a pull requests in README
pick 790a3be8 adjust pytest pins to fix testing infra
pick 5bb90d8f drop 3.4 support
pick 839dc8ba v2.22.0
pick b97fb61a Print the type of the password instead of the password itself
pick 2a173c2a6491aae0772640ba7946a08315d18eb8
保存并关闭。确切的修订现在将是您的头部:
$ git log --oneline | head -n 6
2a173c2a Some commit
b97fb61a Print the type of the password instead of the password itself
839dc8ba v2.22.0
5bb90d8f drop 3.4 support
790a3be8 adjust pytest pins to fix testing infra
efdd0ece Linked how to make a pull requests in README
正如其他答案中提到的,您仍然必须遵守规则。这仅适用于非常狭窄的情况,即您具有完全相同的分支、父级和提交者(例如,在以代码审查为中心的过程中,您将一堆提交排队在某处,开发人员可以将它们向上推送并关闭,而不必先将它们提交到存储库中);真的只有当时间戳是唯一可能改变的东西时。在这种情况下,您可以强制相同的修订,以强制时间戳保持不变。
在大多数其他情况下,父母通常会有所不同,仅此一项就意味着您强制进行某种修订的梦想将破灭。如果任何非时间戳因素不同,Git 将始终将修订修正为正确。
我在之前的答案中找不到它,所以请注意,如果你在提交的父级之上挑选,实际上可以通过添加--ff
标志来保留原始 SHA。