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

dal*_*jem 16 git

我已经在StackOverflow上看到了不同的帖子,它们解释了樱桃的选择,但是他们的代码中的注释对于什么是分支以及什么是目录并不是非常具体.示例git checkout A -- X Y并没有告诉我太多.

基本上我想要这个:

  • 创建新的分支featureAmaster
  • /tools/my-tool分支从目录合并devfeatureA

Ian*_*Ian 18

要回答关于如何挑选一些目录(作为提交而不是强力结账)的原始问题,这是可能的.想象一下,featureA已经分道扬masterand,你想要tools/my-tool提交提交.

假设你从未做过任何包含/tools/my-tool来自其他目录和来自其他目录的东西的提交

这将以反向时间顺序为您提供master进入tools/my-tool(尚未进入featureA)的提交列表:

git log --no-merges featureA...master tools/my-tool
Run Code Online (Sandbox Code Playgroud)

换句话说:

git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...]
Run Code Online (Sandbox Code Playgroud)

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

git log --format=oneline --no-merges featureA...master tools/my-tool \
    | tail -r \
    | cut -d " " -f 1
Run Code Online (Sandbox Code Playgroud)

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

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

  • tail -r在linux上不可用,"tac"是tail -r的替代品 (8认同)
  • 除了使用 `tac` 或 `tail -r` 和 `cut`,还可以使用 `git rev-list --no-merges --reverse` 直接以相反的顺序获取修订 ID/哈希列表。 (3认同)

fun*_*err 14

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

说明:这告诉 git 替换/复制分支中的文件以及当前分支的dev路径。tools/my-tool


Von*_*onC 12

注意:

何时<paths>--patch给出,git checkout不切换分支.
它从索引文件或命名<tree-ish>(最常见的提交)更新工作树中的命名路径.该<tree-ish>参数可用于指定特定的树(即提交,标记或树),以在更新工作树之前更新给定路径的索引.

您的git checkout dev -- tools/my-tool更新是一个特定的路径,但它不是"合并"或"git cherry-pick".


小智 8

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

git format-patch -k --stdout master...featureA -- tools/mytool | git am -3 -k
Run Code Online (Sandbox Code Playgroud)

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

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

  • @daleyjem 这确实值得被接受 ✅ 作为正确的答案。它完全符合您的要求。如果在您的 X 版本和 A 版本之间仅创建新文件且未删除任何文件,则“Checkout checkout A -- X”有效。 (3认同)