首页 文章

如何在Git中合并特定的提交

提问于
浏览
845

我从GitHub中的一个存储库中分叉了一个分支,并为我提交了一些特定的东西 . 现在我发现原始存储库有一个很好的功能,位于 HEAD .

我想在没有事先提交的情况下合并它 . 我该怎么办?我知道如何合并所有提交:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

3 回答

  • 577

    'git cherry-pick'应该是你的回答 .

    应用现有提交引入的更改 .

    不要忘记在这篇文章中阅读bdonlan关于采摘樱桃的后果的答案:
    "Pull all commits from a branch, push specified commits to another",其中:

    A-----B------C
     \
      \
       D
    

    变为:

    A-----B------C
     \
      \
       D-----C'
    

    这个提交的问题是git认为提交要包括它们之前的所有历史记录,其中C'具有不同的SHA-1 ID . 同样,樱桃从一个分支到另一个分支的提交基本上涉及生成补丁,然后应用它,从而也以这种方式丢失历史 . 这种更改提交ID会破坏git的合并功能(尽管如果谨慎使用,还会有一些启发式方法可以解决这个问题) . 更重要的是,它忽略了函数依赖 - 如果C实际使用了B中定义的函数,你将永远不会知道 .

  • 1007

    您可以使用git cherry-pick将单个提交单独应用于当前分支 .

    示例: git cherry-pick d42c389f

  • 16

    让我们试着举个例子来理解:

    我有一个分支,比如 master ,指向X <commit-id>,我有一个指向Y <sha1>的新分支 .

    哪里 Y <commit-id> = <master> branch commits - few commits

    现在说对于Y分支,我必须在主分支和新分支之间进行间隙关闭 . 以下是我们可以遵循的程序:

    Step 1:

    git checkout -b local origin/new
    

    其中local是分支名称 . 任何名字都可以给出 .

    Step 2:

    git merge origin/master --no-ff --stat -v --log=300
    

    将提交从主分支合并到新分支,并创建日志消息的合并提交,其中包含来自最多<n>实际提交的一行描述 .

    有关Git merge的更多信息和参数,请参阅:

    git merge --help
    

    此外,如果您需要合并特定的提交,那么您可以使用:

    git cherry-pick <commit-id>
    

相关问题