协慌网

登录 贡献 社区

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

我从 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

答案

' git cherry-pick ' 应该是你的答案。

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

不要忘记在这篇文章中阅读bdonlan关于樱桃采摘结果的回答:
“从分支中提取所有提交,将指定的提交推送到另一个提交” ,其中:

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

变为:

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

这个提交的问题是 git 认为提交包括它们之前的所有历史

其中 C' 具有不同的SHA-1 ID。
同样,从一个分支到另一个分支的樱桃选择提交基本上涉及生成补丁,然后应用它,从而也以这种方式丢失历史。

这种更改提交 ID 会破坏 git 的合并功能(尽管如果谨慎使用,还会有一些启发式方法可以解决这个问题)。
更重要的是, 它忽略了函数依赖 - 如果 C 实际使用了 B 中定义的函数,你将永远不会知道

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

示例: git cherry-pick d42c389f

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

我有一个分支,比如说master ,指向 X ,我有一个指向 Y 的新分支。

其中Y = 分支提交 - 很少提交

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

步骤 1:

git checkout -b local origin/new

其中 local 是分支名称。可以给出任何名称。

第 2 步:

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

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

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

git merge --help

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

git cherry-pick <commit-id>