我在 StackOverflow 上看到了不同的帖子,解释了一些樱桃采摘,但他们代码中的注释对于什么是分支和什么是目录并不是很具体。例子git checkout A -- X Y
并没有告诉我太多。
基本上我想要这个:
featureA
创建新的分支master
- 将目录
/tools/my-tool
从分支合并dev
到featureA
我在 StackOverflow 上看到了不同的帖子,解释了一些樱桃采摘,但他们代码中的注释对于什么是分支和什么是目录并不是很具体。例子git checkout A -- X Y
并没有告诉我太多。
基本上我想要这个:
featureA
创建新的分支master
/tools/my-tool
从分支合并dev
到featureA
要回答有关如何挑选一些目录(作为提交而不是蛮力签出)的原始问题,这是可能的。想象一下,这featureA
已经偏离master
并且您想要带来tools/my-tool
提交。
假设您从未进行任何包含来自其他目录的内容
/tools/my-tool
和来自其他目录的内容的提交
这将按时间倒序为您提供对master
in tools/my-tool
(尚未在 中)的提交列表:featureA
git log --no-merges featureA...master tools/my-tool
换一种说法:
git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...]
要按时间顺序获取您需要的提交,您需要首先反转输入行的顺序(例如 withtail -r
或tac
),然后隔离提交哈希的列(例如 with 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>
或被--patch
给出时,git 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
将从中断的地方继续。
您可以使用git checkout <from_branch> -- <files_to_bring>
.
我会这样做:git checkout dev -- tools/my-tool
说明:这告诉 git 替换/复制分支中的文件和当前分支dev
的路径。tools/my-tool
Jason Rudolph 很好地总结了这种情况,以及这篇文章中公认的解决方案:
https://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/
这是一个很好的老问题,上面的答案很好地回答了这个问题,但是由于我最近遇到了这个问题,而且他的文章说得很简洁,我想我会在这里分享。