cherry-pick一个提交并保留原始的SHA代码

时间:2013-02-03 20:04:43

标签: git commit sha cherry-pick

我想在保留原始SHA提交代码的同时对提取的遥控器进行提交(我当前的分支基于此远程,我将其重置为之前的状态)。

5 个答案:

答案 0 :(得分:55)

git SHA哈希是根据不同的信息计算的:

  1. 它所指的;基本上,提交出现的分支中存储库的当前内容。
  2. 父提交的SHA
  3. 提交消息
  4. 作者信息:姓名,电子邮件和时间戳。
  5. 提交者信息:姓名,电子邮件和时间戳。
  6. 即使您编辑了一个挑选的提交,以便树,提交消息,作者和提交者信息完全相同,父提交的SHA(或提交,如果处理合并提交)将始终不同。因此,您无法在挑选之后生成相同的SHA哈希(除非您发现SHA冲突;))。

答案 1 :(得分:13)

SHA提交哈希值来自存储库的状态,使用整个历史记录直到提交点(不包括分支)。这意味着你不能保留原始哈希值,除非整个历史记录是相同的,在这种情况下,采摘樱桃是没有意义的。

答案 2 :(得分:3)

根据您对其他答案的评论,我认为您只想重置为某些远程提交。您可以使用git reset --hard <SHA>执行此操作。 警告:这将丢弃工作目录中的所有(未提交的)更改,并且您无法再访问在此分支中执行的所有提交。

如果这不是你想要的(或者你不确定),请更清楚地描述你做了什么,你想做什么或你想要完成什么。

答案 3 :(得分:0)

进入交互式rebase(“ 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”和您的修订;无需描述),并添加您要添加​​的确切修订:

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

保存并关闭。现在,该确切的版本将成为您的HEAD:

$ 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将始终修正修订以使其正确。

答案 4 :(得分:0)

我找不到以前的答案中提到的它,因此请注意,如果您在提交的父级上进行樱桃采摘,实际上可以通过添加--ff标志来保留原始SHA。