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

时间:2013-11-06 20:07:42

标签: git

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

基本上我想要这个:

  • featureA
  • 创建新分支master
  • 将分支/tools/my-tool中的目录dev合并到featureA

5 个答案:

答案 0 :(得分:15)

要回答关于如何挑选一些目录(作为提交而不是强力结账)的原始问题,这是可能的。想象一下, ##Query for ID ## s = Search( using=client, index="logstash-*", )\ .query("match", host="{h}".format(h=host_name)) ## Sort by State ## s = s.sort("state", {"order" : "CRITICAL", "WARNING", "UNKNOWN"}) 已与featureA分道扬and,您想要提交master次提交。

  

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

这将按逆时间顺序为您提供/tools/my-toolmaster的提交列表(尚未包含在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 [...] tail -r),然后隔离提交哈希的列(例如tac):

cut

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

git log --format=oneline --no-merges featureA...master tools/my-tool \
    | tail -r \
    | cut -d " " -f 1

答案 1 :(得分:11)

注意:

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

答案 2 :(得分:2)

Jason Rudolph在总结这种情况以及本文中公认的解决方案方面做得很出色:

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

这是一个很好的老问题,上面的回答在回答这个问题上做得很好,但是自从我最近遇到这个问题以来,他的文章如此简洁地表达了我的想法,我想在这里分享。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

这是从一个分支的另一个分支中挑选信息的正确方法:

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

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

如果任何提交都有合并冲突,它将暂停以进行修复。 git am --continue将在中断处恢复。