git cherry-pick如何计算补丁?

问题描述

我了解git cherry-pick的工作原理:它将一次提交中引入的更改应用于另一提交。

但是,我试图更好地了解git到底是如何实现的。

假设您运行以下命令:

$ git checkout main
$ git cherry-pick source-commit

我的理解是,由于提交是快照,而不是一组更改,因此Cherry-pick必须首先计算某种差异,然后将该补丁/差异应用于当前分支(main )。这个补丁仅仅是source-commit与父补丁的区别吗? source-commitmain的合并基础是否全部涉及?

解决方法

实际上,一次提交git cherry-pick HASH或多或少等于:

  1. git show --patch HASH > temp.diff
  2. git apply temp.diff

依次,上面的步骤1计算给定提交与其单亲之间的差异。

(您可以选择合并,但必须使用选项-m parent-number指定要与之进行比较的父对象。)

关于合并基础,AFAIK完全不涉及HASH和main的合并基础。请注意,在发生冲突的情况下,如果您配置了diff3冲突样式,则中间的块(用于合并的是合并基础)只是Cherry的父级。