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

How to merge a specific commit in Git

我从Github的一个存储库中分叉了一个分支,并提交了一些特定于我的内容。现在我发现原来的存储库有一个很好的特性,它位于HEAD

我只想合并它,而不需要以前的提交。我该怎么办?我知道如何合并所有提交:

1
2
3
4
5
6
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push


这里的答案应该是"git cherry-pick"。

Apply the change introduced by an existing commit.

别忘了在这篇文章中读到Bdonlan关于樱桃采摘的答案:"从分支中提取所有提交,将指定的提交推送到另一个分支",其中:

1
2
3
4
A-----B------C
 \
  \
   D

变成:

1
2
3
4
A-----B------C
 \
  \
   D-----C'

The problem with this commit is that git considers commits to include all history before them

Where C' has a different SHA-1 ID.
Likewise, cherry picking a commit from one branch to another basically involves generating a patch, then applying it, thus losing history that way as well.

This changing of commit IDs breaks git's merging functionality among other things (though if used sparingly there are heuristics that will paper over this).
More importantly though, it ignores functional dependencies - if C actually used a function defined in B, you'll never know.


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

示例:git cherry-pick d42c389f


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

我有一个分支,比如说master,指向x,还有一个新的分支指向y

其中y=branch commits-少数commits

现在说,对于Y分支,我必须缩小主分支和新分支之间的承诺。下面是我们可以遵循的步骤:

步骤1:

1
git checkout -b local origin/new

其中local是分支名称。可以提供任何名称。

步骤2:

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

合并从主分支到新分支的提交,并创建一个日志消息的合并提交,其中包含一行说明,最多来自正在合并的实际提交。

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

1
git merge --help

另外,如果需要合并特定的提交,则可以使用:

1
git cherry-pick <commit-id>