为什么需要挑选多个提交来进行代码修改?

11
我这里有两个分支,分别是branch1和branch2。在branch1中添加了很多新功能,而branch2则比较稳定。今天,我想将branch1中的一个功能合并到branch2中。所以,我只运行了git cherry-pick <commit-for-feature1-in-branch1命令。我原本认为只会将<commit-for-featur1-in-branch1中的更改合并到branch2中。但是我发现还包括其他功能的更改。
我以为它只会获取指定提交的差异,对吗?
顺便说一下,在branch1中的提交是从其他开发分支合并过来的,这可能导致这个问题吗?
我做错了什么吗?
谢谢。

2
你确定指定的提交没有包含比你想象中更多的更改吗? - VonC
是的,我尝试查看该提交的差异:git diff revision^ revision。那就是我需要的。 - Rocky
2个回答

8
我也遇到了这种情况...我已经追踪到以下解释,但或许需要有人更详细地说明一下:
- 你挑选了一个提交,该提交包含1个文件中的1个更改。 - 你会注意到不仅包含在提交中的更改,还有更多的更改(主要是围绕着那个更改)。
这是因为提交中的更改依赖于先前的更改。所以在创建目标分支之后,这段代码区域被多次更改。
Git会回溯历史记录,直到挑选源与目标匹配,并基于此修补程序。这就是为什么可能会出现更多的更改...
我觉得这种行为有点可怕,因为人们期望只挑选给定提交哈希中的更改。

抱歉打扰,但您是否找到了避免这种行为并仅包含指定提交中更改的方法?我遇到了同样的问题,但似乎找不到解决方案。 - astul betizagasti

4
< p > < code > git cherry-pick 的作用是提取指定的提交,读取它和其父提交之间的差异。这实际上相当于生成了一个补丁。然后将此补丁应用于当前所检出的分支。

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

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

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


谢谢您的回答。我已经检查了日志,它正是我想要的。但是在我运行git cherry-pick之后,它添加了不在该提交中的额外代码。另外,需要注意的是,branch1中的提交是从其他开发分支合并而来的,这可能会导致此问题吗? - Rocky
代码在你的分支中。在你选择的分支上运行 git log -p -1 并查看添加的内容。如果额外的内容不存在,则说明已经存在于该分支中。要检查哪个提交添加了一段代码,可以使用 git log -S某个功能的文本 来显示添加了该代码的内容。 - Adam Dymitruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接