我在StackOverflow上看到了不同的帖子,它们对樱桃拣选进行了一些解释,但是他们代码中的注释并没有说明什么是分支,什么是目录。例如 git checkout A -- X Y
没有告诉我太多。
基本上我想要做的是:
- 从
master
分支创建新分支featureA
- 将来自
dev
分支的目录/tools/my-tool
合并到featureA
中
我在StackOverflow上看到了不同的帖子,它们对樱桃拣选进行了一些解释,但是他们代码中的注释并没有说明什么是分支,什么是目录。例如 git checkout A -- X Y
没有告诉我太多。
基本上我想要做的是:
master
分支创建新分支 featureA
dev
分支的目录 /tools/my-tool
合并到 featureA
中以下是从另一个分支挑选一个文件夹的提交记录的正确方法:
git format-patch -k --stdout master...featureA -- tools/mytool | git am -3 -k
这将仅针对“tools/mytool”文件应用补丁,并按顺序进行。
如果在任何提交上出现合并冲突,它将暂停以供您修复。 git am --continue
将在离开的地方继续。
另请参阅Git文档:
Checkout checkout A -- X
就可以正常工作。 - Inigogit format-patch
的限制,即合并提交被拆分开来:https://dev59.com/O3E95IYBdhLWcg3wf-AF#8840381。该答案展示了如何为每个顶级提交创建一个提交。 - krlmlrfeatureA
已经与master
分叉,并且你想要带上tools/my-tool
提交。
这将得到一个假设您从未进行过同时包含来自
/tools/my-tool
和其他目录内容的提交
tools/my-tool
提交清单,按照时间先后顺序排列(并不在featureA
中) ,用于向master
挑选目录:git log --no-merges featureA...master tools/my-tool
换句话说:
git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...]
要按时间顺序获取您需要的提交记录,您需要先反转输入行的顺序(例如使用 tail -r
或 tac
),然后隔离提交哈希的列(例如使用 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 log --pretty=tformat:"%h" --no-merges featureA...master tools/my-too | tail -r
- rh0diumtac
或者 tail -r
以及 cut
,你也可以使用 git rev-list --no-merges --reverse
直接获取一份反序的修订 ID/哈希列表。注意不要改变原意。 - Achilleas注意:
git cherry-pick
用于将一个完整的提交(或多个提交)应用到另一个分支上。它没有“路径”这个概念。git checkout
用于更新工作树(如果没有指定路径,则有效地切换分支并更新HEAD
)。
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
当给出
<paths>
或--patch
时,git checkout
不会切换分支。它会从索引文件或命名的<tree-ish>
(通常是一个提交)更新工作树中的指定路径。可以使用<tree-ish>
参数来指定要用于给定路径更新索引的特定tree-ish(即提交、标签或树)。
您的命令git checkout dev -- tools/my-tool
会更新特定路径,但它不是“合并”或“git cherry-pick”。
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/
这是一个老问题,上面的答案已经很好地回答了它,但由于我最近遇到了这个问题,他的文章概括地说明了它,所以我想在这里分享一下。
tools/mytool
目录,方法如下:git format-patch -k --stdout \
master...featureA \
-- . ':!tools/mytool' \
| git am -3 -k
--
之后的 .
包括了仓库中的所有内容。而 ':!tools/mytool'
接着又排除了这个目录(你也可以使用长格式 ':(exclude)tools/mytool'
)。<pathspec>
文档,了解 :(exclude)
和 :!
。
--
时,左侧是分支名称或提交说明符,右侧是路径。 - torekgit checkout dev -- tools/my-tool
。 - daleyjem