从另一个分支复制单个提交,没有新的提交

时间:2016-10-07 09:23:32

标签: git

最相似的方法是:

git cherry-pick COMMIT_HASH

但这会创建一个新的提交。因此,当我合并时,我会得到两个具有不同哈希值的相同提交。

2 个答案:

答案 0 :(得分:2)

尝试使用 no-commit

git cherry-pick --no-commit COMMIT_HASH

这应该从该提交中获得更改,但在从暂存区域提交之前就会停止。

答案 1 :(得分:2)

这是不可能的。

提交的ID是提交内容的唯一加密校验和 - 应立即让您问:“ 提交的内容是什么?”

要回答这个问题,请查看示例提交:

$ git cat-file -p HEAD
例如

。你会看到这些内容:

tree 80e2d6ce407585c136ab90a6aba1fcb807e7e042
parent 31305025f20182017855793ebce8b122b1396246
author A U Thor <thor@example.com> 1475588570 -0700
committer A U Thor <thor@example.com> 1475588740 -0700

commit message

字面意思(虽然在这种情况下是一些编辑),是提交的完整内容:tree行,一些parent行(通常只有一行),{{1行,author行,空白行和提交消息。

假设您复制了一些其他提交,甚至是使用相同的committertree是一个唯一的Git对象的ID,表示Git对您的工作树 1的快照功能)。假设你以某种方式欺骗Git使用相同的时间戳,即使它可能是几天,几小时,甚至现在只是几秒钟,而不是你进行其他提交时。假设您还准确地复制了提交消息。但是,如果您使用不同的当前提交在不同的分支上,则新副本的tree行将会有所不同。

parent行告诉Git在任何给定提交之前立即提交哪些提交。因此,每个 new 提交使分支名称指向新提交,而新提交指向上一次提交。提交的唯一ID不仅取决于源快照,作者和提交者名称/电子邮件/时间戳以及提交消息。它依赖于之前的提交ID,而后者又取决于它自己以前的提交ID,以及历史上的所有方式。

换句话说,唯一提交ID不仅仅标识一个特定提交,指定整个历史记录每个的ID >提交导致该特定提交。

1 更准确地说,parent是由index / staging-area的内容构成的。这就是您需要对暂存区域进行tree更改的原因:如果不这样做,修改后的文件将不会出现在下一次提交中。