【问题标题】:"git cherry" shows an already cherry-picked commit as "ready to be applied"“git cherry”将一个已经挑选好的提交显示为“准备应用”
【发布时间】:2017-12-11 05:00:30
【问题描述】:

我一直在分支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 没有检测到这个提交已经被挑选出来了?

编辑: 下面是经过消毒的 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 是对align 的初始提交,5bc790b 是对master 的提交的精选。我期望的 67154d6 是共同祖先,这就是 git cherry 的输出停止的地方。

我仍然无法回答的问题是,我如何才能获得对 align 所做的提交列表,而这些提交列表尚未在 master 上?似乎任何可以从align(但不能从master)访问的提交都是候选者,只要它还没有被挑选到master。任何馈入master 的分支都必须检查樱桃挑选——包括图中除最右边的分支align 之外的每个分支。

注意:我们已经使用 git 几个月了,所以我很确定我们正在做的大部分事情都不是最佳实践。我们从反复试验中学到了很多东西。

【问题讨论】:

  • 樱桃采摘后你提交了吗?或运行cherry-pick --continue
  • 我相信 cherry-pick 会自动创建提交。 (不会有任何合并冲突。我不记得我使用的确切命令行,我希望没有办法找到。)
  • 很难从您发布的内容中确定,但我怀疑 master 上的提交落后于分支连接点。如果你运行git log --left-right --oneline master...align,你会得到什么? (如果你喜欢 gitk 的输出格式,也可以使用gitk master...align。)
  • 我已经将align 合并到master 以便继续(我可以忍受少数不需要的提交);但是,如果我给出之前由alignmaster 引用的提交,最后一行是> c2bbb3d Made RW_assert() work on 64-bit.,相关的提交是align。另一个提交(cherry-pick)没有列出,但我可以用 gitk 看到它。

标签: git git-cherry


【解决方案1】:

让我把新添加的额外问题放在最上面,因为它实际上更重要,也更容易回答:

我仍然无法回答的问题是,我如何才能获得对 align 的提交列表,而这些提交列表尚未在 master 上?

当给出git rev-list(用于计算机)或git log(用于人类)的输出时,您会得到:

align ^master

作为两个约束。 (提醒一下:git rev-listgit log 本质上是相同的命令,不同之处在于 git rev-list 旨在进一步处理,因此默认情况下它只生成完整的哈希 ID,而 git log 是针对人类阅读,所以它默认显示提交。有很多关于 方式 git log 显示提交的小而重要的细节,但对于 --oneline 输出它们无关紧要在这里。)

这些约束告诉 Git 修订列表 walker:找到“开启”的提交——意思是“在从历史开始的遍历历史中可达”——由名称 align 指定的提交,但排除在列出所有“开启”的提交master鉴于上图,这个提交列表相当长。

这个特殊的形式,yes ^no,可以拼写为 no..yes,给出更熟悉的简写形式:

git log --decorate --oneline --graph master..align

(注意这个表格中有两个点)。我已经包含了DOG,装饰线条图,选项,因为对于这个特殊的目的,友好的狗真的很有帮助。1

如果你颠倒名称——git log align..master——你会得到,在这种情况下,两个提交在 master 上,而不是在 align 上。

这也是 -点或 对称差异 形式处理的内容:当我们写 master...alignalign...master 时,如下面的原始答案所示,我们告诉 Git 生成 both 的这些遍历。一个找到在master 上但不在align 上的提交(只有两个),另一个找到在align 上但不在master 上的提交(很多)。

当我们将这种三点对称差分形式与git rev-list(或git log)一起使用时,我们可以告诉Git 标记输出以显示提交来自哪一侧。该标记甚至可以使用git patch-id 来查找两侧相同的提交。但它不会查看任何未被双方选择的提交,特别是当您将其剥离到--left-only--right-only 时,您可能会丢弃大量数据。 (这些数据点通常是无用的,丢弃它们是好的,但它们并非总是无用。)


1对于git log,我认为几乎一直打开--decorate 确实是个好主意。其实Linus Torvalds himself got it added to Git back in v2.1.0,但是nobody remembered to document it until Git v2.9.0这样的想法是个好主意。


请注意,您在上面添加的图表有些复杂(许多松鼠式的小线四处奔波),因此存在不止一个提交,其中不同的线分叉和连接。当您使用master...alignalign...master 时,修订遍历代码会修剪掉任何 可从两个 起点到达的提交。想象一下打印出日志并拿两个荧光笔。使用一种颜色,您从master 开始标记,并为您可以从那里到达的所有线条和星星上色。使用另一种颜色,您从align 开始标记,并为您可以从那里到达的所有线条和星星上色。无论两个突出显示重叠,这些提交都在both上;如果没有,这些提交只在一个分支上。

关于git cherry的原始答案

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

git cherry 命令仅查看提交图的有限子集。看整个事情会花费太长时间而收获太少。

您究竟是如何进入这种特殊情况的,我不确定(到达这里的方法不止一种),但这里有两种不同的 [Edit: 和 simple em>]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 是“新的”,您的图表必须类似于第二个图表,而不是第一个(your comment reply 表示确实如此)。

更精确的定义

更准确地说,git cherry master align 使用git rev-list --left-right master...align 来识别或者 align 分支, master 分支上的提交,但不是在两个分支上。对于像上面这样的简单图表,这会切断合并基础及其所有父提交。如果图有更复杂的拓扑,可能有多个合并基;都被排除在外;准确地包括那些仅可以从两个特定提交中的一个提交的提交,并且每个这样的提交在内部都被标记为它是从左侧参数(master...align 中的master)还是右侧 -边论(align in master...align)。

git cherry 命令——甚至是 git rev-list 命令本身,带有正确的参数——然后为两侧的每个提交计算 git patch-id。这让它可以检测哪些提交是相同的,哪些是不同的。但它永远不会为对称差异三点语法排除的 any 提交计算补丁 ID。在大型存储库中,排除了大多数提交,通常情况下,这些提交并不重要,因为这些提交已经在两个分支上。

【讨论】:

  • @torek 谢谢。顺便说一句,在你的第二张图中,在 5bc790b 处所做的错误修复应该在两个分支中继承,所以这种情况是否可能发生在分支对齐上的错误修复以某种方式撤消,然后在提交 c2bbb3d 中重新完成的情况下,这是巧合和 5bc790b 一样吗?
  • @VonC:感谢@Chungzuwalla:添加的--graph 输出仅显示master 上的两个提交,它们不在align 上,因为657d6c8 在两者上都存在并且终止了开始的步行来自a52f43ealign 上不在 master 上的提交集更长:9ffa94ed96ba71 等。但在 align 上但不在 master 上的所有提交仅与两个提交进行比较在master 上,不在align 上。我将编辑答案以解决其他问题。
  • @torek,这是一个非常有用且详细的答案,也感谢您更新它。我绝对可以看到为什么你有你所拥有的代表。很多 git 的命令行选项和语法(例如 2 点和 3 点之间的差异)仍然让我们感到困惑。但是随着更多的经验,我们会发现您的答案更加有用!干杯。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多