26

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

基本上我想要这个:

  • featureA创建新的分支master
  • 将目录/tools/my-tool从分支合并devfeatureA
4

5 回答 5

27

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

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

这将按时间倒序为您提供对masterin 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 -rtac),然后隔离提交哈希的列(例如 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)
于 2015-08-18T20:53:17.470 回答
16

笔记:

  • 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”。

于 2013-11-07T07:47:16.873 回答
11

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

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

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

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

于 2020-09-04T17:57:17.917 回答
5

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

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

于 2020-04-25T15:53:49.573 回答
1

Jason Rudolph 很好地总结了这种情况,以及这篇文章中公认的解决方案:

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

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

于 2020-03-03T13:49:45.523 回答