我了解gitcherry-pick是如何在高层工作的:它接受一次提交中引入的更改,并将其应用于另一次提交。
然而,我正试图更好地理解git是如何在幕后实现这一点的。
假设您运行以下程序:
$ git checkout main
$ git cherry-pick source-commit
我的理解是,由于提交是一个快照,而不是一组更改,所以樱桃选择必须首先计算某种diff,然后将该补丁/diff应用于当前分支(main
(。这个补丁只是source-commit
与其父代的差异吗?是否涉及source-commit
和main
的合并基础?
实际上,用一次提交执行git cherry-pick HASH
或多或少相当于:
git show --patch HASH > temp.diff
git apply temp.diff
反过来,上面的步骤1计算给定提交与其单亲之间的差异。
(您可以选择合并,但必须使用选项-m parent-number
指定要与哪个父级进行比较。(
关于合并库,HASH和main
的合并库AFAIK完全不涉及。请注意,在发生冲突的情况下,如果您配置了diff3
冲突样式,则中间的hunk(用于合并的是合并基(只是cherry的父对象。