问题描述
我了解git cherry-pick的工作原理:它将一次提交中引入的更改应用于另一提交。
但是,我试图更好地了解git到底是如何实现的。
假设您运行以下命令:
$ git checkout main
$ git cherry-pick source-commit
我的理解是,由于提交是快照,而不是一组更改,因此Cherry-pick必须首先计算某种差异,然后将该补丁/差异应用于当前分支(main
)。这个补丁仅仅是source-commit
与父补丁的区别吗? source-commit
和main
的合并基础是否全部涉及?
解决方法
实际上,一次提交git cherry-pick HASH
或多或少等于:
-
git show --patch HASH > temp.diff
-
git apply temp.diff
依次,上面的步骤1计算给定提交与其单亲之间的差异。
(您可以选择合并,但必须使用选项-m parent-number
指定要与之进行比较的父对象。)
关于合并基础,AFAIK完全不涉及HASH和main
的合并基础。请注意,在发生冲突的情况下,如果您配置了diff3
冲突样式,则中间的块(用于合并的是合并基础)只是Cherry的父级。