繁体   English   中英

git cherry-pick 或从另一个分支合并特定目录

[英]git cherry-pick or merge specific directory from another branch

我在 StackOverflow 上看到过不同的帖子,这些帖子解释了樱桃采摘,但是他们代码中的注释对于什么是分支和什么是目录并不是很具体。 示例git checkout A -- XY并没有告诉我太多。

基本上我想要这个:

  • 创建新的分支featureA off of master
  • 将目录/tools/my-tool从分支dev合并到featureA

要回答关于如何挑选一些目录(作为提交而不是蛮力结帐)的原始问题,这是可能的。 想象一下, featureA已经与master分离开来,而您想要带来tools/my-tool提交。

假设您从未进行任何包含来自/tools/my-tool和来自其他目录的内容的提交

这将为您提供tools/my-toolmaster的提交列表(尚未在featureA ),按时间倒序排列:

git log --no-merges featureA...master tools/my-tool

换一种说法:

git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...]

要按时间顺序获得您需要的提交,您需要首先反转输入行的顺序(例如使用tail -rtac ),然后隔离提交哈希的列(例如使用cut ):

git log --format=oneline --no-merges featureA...master tools/my-tool \
    | tail -r \
    | cut -d " " -f 1

并立即完成整个操作,请执行以下操作:

git cherry-pick $(git log --format=oneline --no-merges featureA...master tools/my-tool | tail -r | cut -d " " -f 1)

笔记:

  • git cherry-pick是关于将完整提交(或提交)应用到另一个分支。 没有“路径”的概念。
  • git checkout是关于更新工作树(如果没有指定路径,则为HEAD ,有效地切换分支)

     git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...

当给出<paths>--patchgit checkout不会切换分支
它从索引文件或命名的<tree-ish> (通常是提交)更新工作树中的命名路径。 <tree-ish>参数可用于指定特定的树形(即提交、标记或树)以在更新工作树之前更新给定路径的索引。

您的git checkout dev -- tools/my-tool更新了特定路径,但它不是“合并”或“git cherry-pick”。

这是从另一个分支为一个文件夹挑选提交的正确方法:

git format-patch -k --stdout master...featureA -- tools/mytool | git am -3 -k

这将仅按顺序将补丁应用于“tools/mytool”文件。

如果您在任何提交上遇到合并冲突,它将暂停以供您修复。 git am --continue将从停止的地方继续。

Jason Rudolph 在总结这个场景和这篇文章中接受的解决方案方面做得很好:

https://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/

这是一个很好的老问题,上面的答案很好地回答了它,但由于我最近遇到了这个问题,而且他的文章如此简洁地陈述了它,我想我会在这里分享它。

您可以使用git checkout <from_branch> -- <files_to_bring>
我会这样做: git checkout dev -- tools/my-tool

说明:这告诉 git 将文件从dev分支和路径tools/my-tool替换/复制到当前分支。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM