【问题标题】:How does 'git cherry-pick' find the file(s) to apply the changes to?'git cherry-pick' 如何找到要应用更改的文件?
【发布时间】:2018-08-25 09:32:23
【问题描述】:

我有两个结构相似的存储库,但没有共同提交。我已将它们添加为彼此的遥控器,以便能够在它们之间进行cherry-pick 提交。

最近,我注意到即使存储库中的文件路径不同(并且文件本身也不同),git 也会正确应用提交的更改。 git 如何找到要应用更改的文件?它会查看所有当前快照中的文件吗?

【问题讨论】:

标签: git commit git-cherry-pick


【解决方案1】:

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 也会查看CF 之间的差异,并且在C..F 之上应用补丁C..D 时可能会检测到文件重命名或触发冲突

【讨论】:

  • 它不能是the "snapshot" described by the cherry picked commit,因为正如我所提到的,相应文件的路径可能不同,cherry-pick 仍然可以工作。
【解决方案2】:

请参阅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 mechanismGit 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 可能有大量要检测的重命名.

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2019-04-06
    • 2012-09-06
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多