【问题标题】:Why cherry-pick pick change more than one commit?为什么cherry-pick pick 更改不止一个提交?
【发布时间】:2011-12-09 18:38:13
【问题描述】:

我在这里有 2 个分支,比如 branch1 和 branch2。 branch1 增加了很多新特性,branch2 是稳定的。今天,我只想将 1 个功能从分支 1 合并到分支 2。所以,我只运行git cherry-pick <commit-for-feature1-in-branch1。我想应该只有<commit-for-featur1-in-branch1 的变化会被合并到branch2 中。但我发现其他功能的变化更多。

我认为它只会为指定的提交获得差异,对吧?

仅供参考,branch1 中的提交是从其他开发分支合并的,这可能会导致这个问题吗?

我做错了什么?

谢谢。

【问题讨论】:

  • 您确定指定的提交没有包含比您想象的更多的更改吗?
  • 是的,我试图查看该提交的差异:git diff revision^ revision。这就是我需要的。

标签: git cherry-pick


【解决方案1】:

git cherry-pick 所做的是接受您指定的提交并读取它与其父级之间的差异。这有效地制作了补丁。然后它将这个补丁应用到你当前签出的分支。

在您的情况下,提交包含其他功能的添加。您可以通过查看此提交将使用git log 生成的补丁来仔细检查提交消息是否与您认为的功能相对应:

git log -p -1 <sha1-of-your-commit>

-p 告诉日志不仅显示提交信息,如作者、日期和提交消息,还包括提交引入的补丁(或差异)。 -1 选项告诉 git log 在 1 次提交后停止列出历史记录。

【讨论】:

  • 感谢您的回答。我检查了日志。这正是我想要的。但是在我运行 git cherry-pick 之后,它添加了该提交中没有的额外代码。仅供参考,branch1 中的提交是从其他开发分支合并的,这可能导致这个问题吗?
  • 代码在您的分支中。在您挑选的分支上运行git log -p -1,看看添加了什么。如果多余的东西不存在,则意味着它已经存在于该分支中。要检查哪个提交添加了一段代码,git log -Ssometextfromafeature 将显示添加了该代码的内容。
【解决方案2】:

我也遇到过这种行为...我已将其追溯到以下解释,但也许有人对此进行了更多澄清:

  • 您选择了一个提交,该提交在 1 个文件中包含 1 个更改
  • 您注意到,不仅提交中包含的更改,还有更多的更改(主要包括该更改)

这是因为提交中的更改取决于先前的更改。因此,在您要挑选的目标分支创建后,此代码区域已多次更改。

Git 会回溯历史,直到樱桃挑选源与目标匹配并基于此修订创建补丁。这就是为什么可能会出现更多变化的原因......

我觉得这种行为有点可怕,因为人们会期望只选择来自给定提交哈希的更改

【讨论】:

  • 很抱歉发布了 necro,但您能找到一种方法来避免这种行为并仅包含指定提交中的更改吗?我遇到了同样的问题,无法找到解决方案
猜你喜欢
  • 2016-04-11
  • 2020-04-30
  • 1970-01-01
  • 2013-03-26
  • 2012-11-05
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多