git cherry-pick和git show | patch -p1有什么区别?

13

我遇到了这样的情况:使用git cherry-pick X 命令时,有一些代码会有冲突,但也会创建额外的插入(通过git diff 验证)。

然后我重新运行了命令git show X > my.patch, 然后在我的代码库上使用命令patch -p1 < my.patch。这次我得到了更好的结果,虽然还是有一些冲突,但是结果更加清晰简洁。

为什么使用git cherry-pick会产生这种特殊的情况呢?我使用的是git 1.7.0.4版本。

编辑:当我说“更加清晰简洁”的时候,我指的是由git show X生成的代码与最终结果更加匹配,而git cherry-pick 生成的代码则包含了更多的内容。


2
创建一个简化的测试用例将会非常有用。 - Josh Lee
我在这里支持jleedev的看法:您对差异的描述仍然非常难以理解。git show会向您展示差异,而您的树是完整的内容。比较git show Xgit show X'更有意义,其中X'是挑选的版本。X'在其差异中包含更多的代码吗? - Cascabel
2个回答

9
当您挑选一个提交时,它会使用提交的所有元数据来提交结果,而不仅仅是表示差异的补丁 - 您将获得原始提交消息和作者。您的补丁流水线将为您提供所需的工作树内容,但然后您需要自行提交它,希望使用git commit -c <original-commit>将元数据复制像 cherry-pick 那样。Cherry-pick 还有一些额外的选项可能会有所帮助,并且可以接受多个提交(可能指定为 rev-list 范围)。显然, patch 不支持其中任何一项。
我不确定您所说的结果更 "cleaner" 是否正确。您是在暗示 git 是否应用了不同于 patch 的补丁吗?

1
是的。我使用git-cherry-pick和patch得到的树内结果非常不同。我正在尝试理解其中的原因。 - 0x6adb015
@0x6adb015:我不能说太多,因为Git在内部使用自己的diff/patch机制,显然它与GNU diff和patch不完全相同。我看到过一些差异,但大多数情况下是Git在补丁没有太多信息可用时表现更好,而不是补丁执行得更好。如果您认为Git的结果是“错误”的,您可能需要将其报告为错误。 - Cascabel

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接