我已经在StackOverflow上看到了不同的帖子,它们解释了樱桃的选择,但是他们的代码中的注释对于什么是分支以及什么是目录并不是非常具体.示例git checkout A -- X Y并没有告诉我太多.
基本上我想要这个:
featureA断master /tools/my-tool分支从目录合并dev到featureAIan*_*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 -r或tac),然后隔离提交哈希的列(例如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)
fun*_*err 14
您可以使用git checkout <from_branch> -- <files_to_bring>。
我会这样做:git checkout dev -- tools/my-tool
说明:这告诉 git 替换/复制分支中的文件以及当前分支的dev路径。tools/my-tool
Von*_*onC 12
注意:
git cherry-pick是关于将完整提交(或提交)应用于另一个分支.没有"路径"的概念.git checkout是关于更新工作树(HEAD如果没有指定路径,有效地切换分支)
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
Run Code Online (Sandbox Code Playgroud)何时
<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将在它停止的地方恢复。