【发布时间】:2018-08-25 09:32:23
【问题描述】:
我有两个结构相似的存储库,但没有共同提交。我已将它们添加为彼此的遥控器,以便能够在它们之间进行cherry-pick 提交。
最近,我注意到即使存储库中的文件路径不同(并且文件本身也不同),git 也会正确应用提交的更改。 git 如何找到要应用更改的文件?它会查看所有当前快照中的文件吗?
【问题讨论】:
标签: git commit git-cherry-pick
我有两个结构相似的存储库,但没有共同提交。我已将它们添加为彼此的遥控器,以便能够在它们之间进行cherry-pick 提交。
最近,我注意到即使存储库中的文件路径不同(并且文件本身也不同),git 也会正确应用提交的更改。 git 如何找到要应用更改的文件?它会查看所有当前快照中的文件吗?
【问题讨论】:
标签: git commit git-cherry-pick
git cherry-pick eacf32b 将采用描述提交eacf32b 的补丁,并尝试将其应用到您当前的提交之上。
所以是的:如果查看樱桃选择提交所描述的“快照”中的所有文件。
更完整的答案是:git cherry-pick 执行类似合并的操作来应用补丁。
开始于:
--*--*--A--B--C--D
\
\
D--E--F <- HEAD
如果您运行git cherry-pick D,它将应用类似合并的操作,使用C 作为“基本内容”,D 作为“他们的”,F 作为“我们的”,就好像你是合并具有以下历史的东西来构建D':
..*..*..A..B C--D
. \ .
. \ .
D..E F..D'
所以git 也会查看C 和F 之间的差异,并且在C..F 之上应用补丁C..D 时可能会检测到文件重命名或触发冲突
【讨论】:
the "snapshot" described by the cherry picked commit,因为正如我所提到的,相应文件的路径可能不同,cherry-pick 仍然可以工作。
请参阅phd's suggested duplicate, How do cherry-pick and revert work?,因为cherry-pick 确实使用了git merge。
请注意,git merge 运行 git diff --find-renames(好吧,无论如何,它的内部等价物)。这是发现哪些文件从哪些其他文件重命名的步骤。要了解 that 的工作原理,请参阅我对 Trying to understand `git diff` and `git mv` rename detection mechanism 和 Git Diff of same files in two directories always result in "renamed" 的回答。重命名检测器在 both 差异上运行:
git diff <em>parent</em> <em>child</em>,其中 child 是被挑选出来的提交,parent 是它的父提交;和git diff <em>parent</em> HEAD,它会在合并操作的“我们”一侧找到更改。请注意,这里的 parent 是被精心挑选的提交的父提交,而不是 HEAD 本身的父提交。通常,parent-vs-child 几乎没有要查找的重命名(大多数人不会挑选大量重命名操作),但 parent-vs-HEAD 可能有大量要检测的重命名.
【讨论】: