"git cherry"显示已经挑选的提交为“准备好被应用”。

3

我一直在分支 align 上工作,想要从中挑选一些提交到 master。 我使用 git cherry 查找候选提交:

C:\Users\me\Documents\repo>git cherry -v master align | head -1
+ c2bbb3d99440be7524673702c92ad65e6522d2b1 Made RW_assert() work on 64-bit.

我理解的是 '+' 表示在 master 分支上没有相应的提交。 但我记得已经将此提交合并到了 master 分支。 实际上,这是在 align 分支上对文件 rw-fwd.h 进行的最新更改:

C:\Users\me\Documents\repo>git log align -1 rw-fwd.h
commit c2bbb3d99440be7524673702c92ad65e6522d2b1
Author: Me
Date:   Thu Jun 8 10:41:01 2017 +1000

    Made RW_assert() work on 64-bit.

这是在分支master上对rw-fwd.h进行的最新更改:

C:\Users\me\Documents\repo>git log master -1 rw-fwd.h
commit 5bc790b9b0adfcdc6c0a07b679155e33974e343a
Author: Me
Date:   Thu Jun 8 10:41:01 2017 +1000

    Made RW_assert() work on 64-bit.

git cherry 的文档中指出:"等效性测试基于差异,在删除空格和行号之后。因此,git-cherry 可以检测到使用 git-cherry-pick[1]、git-am[1] 或 git-rebase[1] 进行 "复制" 提交的情况。"

通过使用 git show,提交看起来是相同的,但让我们确保一下:

C:\Users\me\Documents\repo>git show c2bbb3d | git patch-id
f6ad0912fd71f694b6b00c6ea93c87af7cf4ab98 c2bbb3d99440be7524673702c92ad65e6522d2b1

C:\Users\me\Documents\repo>git show 5bc790b | git patch-id
f6ad0912fd71f694b6b00c6ea93c87af7cf4ab98 5bc790b9b0adfcdc6c0a07b679155e33974e343a

补丁ID是相同的。为什么git cherry没有检测到这个提交已经被cherry-pick了呢? 编辑:下面是一个经过加密处理的git log --oneline --decorate --graph。 我添加这段内容是为了回应@torek的答案,不是因为我怀疑答案是否正确,而是因为我希望能在那个答案的指导下解释真正的提交日志。 master在a52f43e(第一行),而align在9ffa94e(第三行)。 align是图表中最右侧的一条线,而且没有被合并。
* a52f43e ######## ############ #####
* 507e731 ##### ##### ### ## ###
| *   9ffa94e (origin/align) Merge branch 'master' of https://ghe/repo/repo into align
| |\
| |/
|/|
* |   657d6c8 Merge pull request #8 from repo/test_system
|\ \
| * \   679739b Merged origin master into local branch.
| |\ \
| |/ /
|/| |
* | |   c7a5944 Merge branch 'master' of https://ghe/repo/repo
|\ \ \
| * \ \   e12016c Merge pull request #7 from repo/lean-mean
| |\ \ \
| | * | | 144fefd ##### ####### ##### ## #######
| | * | | 87e0e23 ####### ############## ## ####### ####### ...
| * | | | 8613f4e ######## ####### ######### ## ###### #####...
| |/ / /
* | | | 8f70a8d ######### #### ##### ### ###### ### ########...
* | | |   aedb306 Merge branch 'master' of https://ghe/repo/repo
|\ \ \ \
* \ \ \ \   0a4fd59 Merge branch 'master' of https://ghe/repo/repo
|\ \ \ \ \
* \ \ \ \ \   e1cfbfd Merge branch 'PBA_Experiment' of https://ghe/repo/repo
|\ \ \ \ \ \
| * | | | | | 7f1bc5b (######/##############) ##########
| | | | | * | 323d965 ######## ######### ####### ########.##...
| | | | | * | 5839749 ##### #######-#### ###### ## ### ## ##...
| | | | | | * d96ba71 ##-####### ############, ## ##### ####...
| | | | | | * 680354b #### ##### ######### #####, ##-###### ...
| | | | | | * a066e66 #####.  ### ### ###### ########## ####...
| | | | | | * afb7945 (###: ####-##-##-#######, ###: ####-##...
| | | | | | *   a14e769 Merge remote-tracking branch 'origin/master' into align
| | | | | | |\
| | | | | |_|/
| | | | |/| |
| | | | * | |   4354de6 Merge pull request #5 from repo/tech-bug-fixes
| | | | |\ \ \
| | | | | * | | c084aa8 (######/####-###-#####) ##### ######...
| | | | | * | | aea8a4f ######### ###-######## # ###### ### ...
| | | | | * | | 7857c95 ### #### #############, ### ### ####...
| | | |_|/ / /
| | |/| | | |
| | | | * | | 0b65102 .
| | | | * | |   2448af9 Merge branch 'master' of https://ghe/repo/repo
| | | | |\ \ \
| | | | * | | | 04c03da ##### ##### ###### ## ###### #######...
| | | | | | | * e05b167 ###### ### ## ######### ##########, ...
| | | | | | | * c3422d5 ##### ###############() ###### ## ##...
| | | | | | | * 92f4eff ##### ### ## ######/######### ####-#...
| | | | | | | * 35fb291 ### ################## (##### ######...
| | | | | | | * 6d12b2c ##### # ####### ## ######### #-###-#...
| | | | | | | *   aa84d37 Merge branch 'master' into align
| | | | | | | |\
| | | | | | |_|/
| | | | | |/| |
| | | | | * | | a96cb9d ##### #### ##### ######## ### ##### ...
| | | | |/ / /
| | | | * | | 911e5d2 ######## ### ##### #########.
| | | |/ / /
| | | * | |   d32ef9a Merge pull request #4 from repo/tech
| | | |\ \ \
| | |/ / / /
| | | * | | 092858f (######/####) ######## #### ## ######.
| | | * | | 1d862dd ##### ############ ## #### ### ### #### ...
| | | * | |   7eae069 Merge branch 'master' into tech
| | | |\ \ \
| | | |/ / /
| | |/| | |
| | | * | | f639a00 ##### ##### ## ### ########
| | | * | | ac794d9 ##### ################ ###### #### #####...
| | | * | | b0296ac ####### ########## ## ####### #### ## ##...
| | | * | | 91f2adf ###########
| | | * | | 47ae5eb ######
| | | * | | a975c46 ####### ##### ## #########
| | | * | |   041a552 Merge branch 'tech' of https://ghe/repo/repo into tech
| | | |\ \ \
| | | | * | | 908b8f7 ######
| | | | * | |   85ff704 Merge branch 'tech' of https://ghe/repo/repo into tech
| | | | |\ \ \
| | | | * | | | 6351c83 ######
| | | * | | | | 1486296 ###### #### ########.
| | | | |/ / /
| | | |/| | |
| | | * | | | 89cefd9 ######### ############# #### ### #####...
| | | |/ / /
| | | * | | 401b346 ### ########## ## ######### ######### ##...
| | | * | |   0e36458 Merge branch 'tech' of https://ghe/repo/repo into tech
| | | |\ \ \
| | | | * | | 7029347 ######
| | | | * | |   d819996 Merge branch 'tech' of https://ghe/repo/repo into tech
| | | | |\ \ \
| | | | * | | | 1d11d8a ######
| | | | * | | |   0f52244 Merge branch 'tech' of https://ghe/repo/repo into tech
| | | | |\ \ \ \
| | | | * | | | | 63f49c3 ######
| | | * | | | | | 15e0017 ######
| | | | |_|/ / /
| | | |/| | | |
| | | * | | | | a7c00b8 ######### ## ### #### ### #### ####
| | | | |/ / /
| | | |/| | |
| | | * | | | 5074fe5 ####### ## #### ########## ###### ## #...
| | | |/ / /
| | | * | | 989e68c ####### ## ### #### ### #### #### ####, ...
| | | * | |   9b3545c Merge branch 'tech' of https://ghe/repo/repo into tech
| | | |\ \ \
| | | | * | | 2a9f6b2 ##### #### ## ######## ######### #####...
| | | * | | | 519ac87 ######
| | | |/ / /
| | | * | | e850bac ######
| | | * | | 7e920c4 ######### ## ### #### ### ####### ### ##...
| | | * | | ac4608d ######## ## #### #### ########### ## ###...
| | | * | | f7f4e0c ###### ##-######### ## ###### ## ## ####...
| | | * | | 7ed258f ##### ######## ## ###### ##### ##### ###...
| | | | | * 67c8f71 ##### ### ## ######### ######## ########...
| | | | | * 2280a88 ##### ######### ### #### ### ##########
| | | | | * 3bd5b85 ##### # ### ## ##-######; ## ##### #####...
| | | | | *   7919cc3 Merge branch 'master' into align
| | | | | |\
| | | |_|_|/
| | |/| | |
| | * | | | 7278053 ##### #### ####### ##########.
| |/ / / /
|/| | | |
| | | | * 31d1e44 ##### # ### ### ### ######### ## ###### ##...
| | | | * 87f8195 ######## ### ### ###### ##### ####### ####...
| | | | * 379bd4a ### '#' ### ## #### # #### ### ####### ###...
| | | | * fe30105 ##### ######### ###### ##### ## ###### ###...
| | | | *   3b50f20 Merge branch 'master' of https://ghe/repo/repo into align
| | | | |\
| |_|_|_|/
|/| | | |
* | | | |   48ca2d6 Merge branch 'master' of https://ghe/repo/repo
|\ \ \ \ \
| |/ / / /
| * | | |   edbf46e Merged from align
| |\ \ \ \
| * | | | | af282b8 ##### ###### ### ######### ### ## .#####...
| * | | | | 2237855 ####### ### ######### ### #### ##### ## ...
| * | | | | f0711d9 ##### ###################() ### ########...
| * | | | | 5bc790b Made RW_assert() work on 64-bit.
* | | | | | c53aad5 ##### ######## ### ######## ####### ### ...
* | | | | | 1b4f135 ##### ####### #### #### ### ######-#####...
| | | | | * 49730f3 #####, ### ######, ## ###### ######## ##...
| | | | | * 8efc11e ##### ###### ### ######### ### ## .#####...
| | | | | * e0f583a ####### ### ######### ### #### ##### ## ...
| | | | | * 3b1a263 ##### ###################() ### ########...
| | | | | * c2bbb3d Made RW_assert() work on 64-bit.
| | | |_|/
| | |/| |
| | * | | 67154d6 ##### ##### ####### ### ####. ######### ##...

看着上面的日志底部,c2bbb3d是对齐的初始提交,5bc790b是从该提交中精选到主分支master。我预计67154d6是公共祖先,这就是git cherry输出停止的地方。
但我仍然无法回答的问题是如何获取提交到align的列表,这些提交尚未在master上。似乎任何可从align到达但不可从master到达的提交都是候选的,只要它还没有被精选到master。必须检查每个流入master的分支是否有精选——这包括图表中除最右边的一个align之外的所有分支。
注:我们使用git仅有几个月,所以我很确定我们正在做的许多事情都不是最佳实践。我们正在通过试错学习很多东西。

你在 cherry pick 之后提交了吗?或者运行了 cherry-pick --continue 命令吗? - developer_hatch
我相信 cherry-pick 应该已经自动创建了提交记录。(不会有任何合并冲突。我记不清楚我使用的确切命令行,而且我认为没有办法找出来。) - Chungzuwalla
从你发布的内容来看很难确定,但是我怀疑 master 分支上的提交已经落后于合并分支点。如果你执行命令 git log --left-right --oneline master...align,会得到什么结果呢?(如果你喜欢 gitk 的输出格式,也可以尝试使用 gitk master...align 命令。) - torek
我已经将align合并到master中以继续进行(我可以接受少量不需要的提交); 但是,如果我给出先前由alignmaster引用的提交,则最后一行是> c2bbb3d Made RW_assert() work on 64-bit.,这是与align相关的提交。 另一个提交(cherry-pick)未列出,但我可以在gitk中看到它。 - Chungzuwalla
1个回答

6
让我把新添加的额外问题放在最前面,因为它实际上更重要,也更容易回答:
引用: 我仍然无法回答的问题是,我如何获得已提交到“align”的提交列表,这些提交在“master”上尚不存在?
当您提供以下内容时,可以使用“git rev-list”(适用于计算机)或“git log”(适用于人类)的输出来获取该列表:
align ^master

作为两个约束条件。(小提醒:git rev-list 和 git log 命令本质上是相同的,区别在于 git rev-list 旨在进一步处理,默认情况下只生成完整的哈希 ID;而 git log 旨在供人阅读,默认情况下显示提交。关于 git log 显示提交的方式有许多细节,但对于 --oneline 输出来说,这些细节在这里并不重要。)
这些约束条件告诉 Git revision-list walker: 找到从名为 align 的提交开始的历史遍历中“处于”(即可到达)的提交,但从该列表中排除所有“处于” master 的提交。鉴于上图,这个提交列表相当长。
这种特定形式的 yes ^no 可以改写为 no..yes,从而给出更常见的简短形式:
git log --decorate --oneline --graph master..align

请注意,此表单中有两个点。我已经包含了DOG,Decorate Oneline Graph,选项,因为对于这个特定的目的,友好的狗确实经常很有帮助。如果您反转名称-git log align..master - 您会得到在align上没有的master上的两个提交(在这种情况下是两个)。
这也是三个点或对称差异形式所涉及的:当我们写master...alignalign...master时,如下面的原始答案所示,我们告诉Git生成这两个步骤。一个找到在master上而不在align上的提交(只有两个),而另一个找到在align上而不在master上的提交(许多)。
当我们使用这种三点对称差分形式与git rev-list(或git log)一起使用时,我们可以告诉Git标记输出以显示提交来自哪个方面。该标记甚至可以使用git patch-id找到两个方面中相同的提交。但它不会查看任何未被两个方面选择的提交,特别是当您将其削减为--left-only--right-only时,您可以丢弃很多数据。(这些数据点通常是无用的,删除它们是好的,但它们并不总是无用的。)

1对于git log,我认为几乎总是打开--decorate是一个好主意。事实上,这个主意如此之好,以至于Linus Torvalds本人在Git v2.1.0中将其添加到了Git中,但是直到Git v2.9.0才有人记得记录


请注意,您添加的图表有点复杂(许多松散的小线条),因此存在多个提交点在其中各种线条分叉和连接。当您使用master...alignalign...master时,修订版本遍历代码会剪除从两个起始点可达的任何提交。想象一下将日志打印出来并用两个荧光笔标记它。用一种颜色,您开始在master处标记并着色所有可以从那里到达的线条和星号。用另一种颜色,您开始从align处标记并着色所有可以从那里到达的线条和星号。无论两个高亮显示重叠在哪里,这些提交都在两个上;如果它们没有,那些提交就只在一个分支上。

关于git cherry的原始答案

补丁ID是相同的。为什么git cherry没有检测到已经挑选了这个提交?

< p > git cherry 命令只查看提交图的 有限子集。 查看整个图需要太长时间,而获得的收益太少。

您如何进入此特定情况,我不确定(有多种方法可以到达此处),但这里有两种不同的 [Edit: 和 simple] 情况,它们可能会通过 git log --oneline --decorate --graph align master 显示:

* c2bbb3d (align) Made RW_assert() work on 64-bit.
* xxxxxxx some other commit here
| * 5bc790b (master) Made RW_assert() work on 64-bit.
|/
* yyyyyyy whatever commit here
* zzzzzzz yet another commit
   ... snip ...

或者:

* c2bbb3d (align) Made RW_assert() work on 64-bit.
* xxxxxxx some other commit here
| * zzzzzzz (master) yet another commit
|/
* yyyyyyy whatever commit here
* 5bc790b Made RW_assert() work on 64-bit.
   ... snip ...

运行git cherry master align将会显示该提交是多余的,即不需要挑选樱桃,仅限于第一个图形。原因是git cherry只查看两个图形线分叉点以上向上延伸的部分

由于两个图形线在yyyyyyy whatever commit here处重新合并,该命令从未查看该点以下的任何提交。鉴于你声称c2bbb3d是“新的”,你的图形必须类似于第二个图形,而不是第一个(你的评论回复表明是这样的)。

更精确的定义

更精确地说,git cherry master align 使用 git rev-list --left-right master...align 来识别那些在 align 分支或 master 分支上但不在两个分支上的提交。对于像上面这样简单的图形,这会截断合并基础及其所有父提交。如果图形具有更复杂的拓扑结构,则可能存在多个合并基础;所有这些都被排除在外;只有从两个特定提交中的一个到达的提交被包含在内,并且每个这样的提交都被标记为内部是否从左侧参数 (mastermaster...align) 或右侧参数 (alignmaster...align) 到达。 git cherry 命令,或者使用正确参数的 git rev-list 命令,可以计算两个分支上每个提交的 git patch-id。这使得它可以检测哪些提交是相同的,哪些是不同的。但是,它从不为对称差异三个点语法排除的 任何 提交计算补丁 ID。在大型存储库中,这排除了大多数提交,通常对于那些已经在两个分支上的提交来说并不重要。

@torek 谢谢。另外,在您的第二个图表中,5bc790b处进行的错误修复应该在两个分支中继承,那么除了在分支align上的错误修复被某种方式撤消并在提交c2bbb3d中重新执行(这恰好与5bc790b相同),还可能发生这种情况吗? - Chungzuwalla
@VonC:谢谢。@Chungzuwalla:添加的 --graph 输出显示了 master 上仅有的两个提交,这些提交不在 align 上,因为 657d6c8 在两者上都存在,这终止了从 a52f43e 开始的遍历。在 align 上不在 master 上的提交集更长:9ffa94ed96ba71 等等。但是,在 align 上不在 master 上的所有提交,只与 master 上不在 align 上的两个提交进行比较。我将编辑答案以回答额外的问题。 - torek
@torek,非常有帮助和详细的答案,感谢您的更新。我完全可以理解为什么您拥有这样的声誉。Git的许多命令行选项和语法(例如2个点和3个点之间的区别)仍然让我们感到困惑。但是随着更多的经验,我们会发现您的答案更加有用!干杯。 - Chungzuwalla

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