Git 日志列表提交不包括从第一个分支中精心挑选的内容

2024-04-24

例如我有这个提交历史记录

让我们说在某个时刻release1几天后发布到生产环境,release2分支被释放。

  • branch relase1包含从 master 精心挑选的 2 个提交(4 和 5)
  • branch release2包含 2 个提交(8 和 9),也是从 master 中精心挑选的。

樱桃采摘从未停止过-x争论。

我想要得到所有承诺release2“当时尚未发布”这意味着由绿色圆圈标记的提交(6,7,8,9)。

做到这一点最简单的方法是什么?

存储库的示例github https://github.com/yulrizka/git-question

更新1(git樱桃)

$ git cherry -v release1 release2
- 91785f2be363244a1da4459746fce6a6ea28c2b5 4
- e88de1f8b62213089b300e3143c4caf509b5c13b 5
- 9d23e9c7e6f769c3bbb44ad42bc7b708b4b0a9e6 6
- 6fb71e4406e0b127e06f6e5b145de8a9d39db01e 7
- 6276becc413494b7724a4dd8b852234f4b71e913 8
- 6dd3b5b75222c02c921c9c20bcaee83e1c8be746 9

With cherry,看来我还有4和5,它们都是form master

更新 2(--左-右--cherry-mark)

$ git log --left-right --cherry-mark --pretty=oneline --abbrev-commit  release2...release1
= 6dd3b5b 9
= 6276bec 8
> caa4e2f 5
= 0230a1f 4
= 6fb71e4 7
= 9d23e9c 6
= e88de1f 5
= 91785f2 4

这给了我一切,除了 5 是樱桃标记的,我很难解释这一点

带有非空提交的更新 3

在最初的尝试中,我创建了每个提交--allow-empty。如下所示,它创建了空树的哈希值。

用真实内容重新创建存储库后,我得到了想要的结果,下面有两个答案git cherry and --left-right --cherry-mark


注意你的链接存储库 https://github.com/yulrizka/git-question包含 15 个完全空的提交。我所说的“空提交”并不仅仅指那种无更改的提交git commit --allow-empty允许,而是完全地空:每个提交根本没有文件,只有一条提交消息。 (更准确地说,每个提交都有空树4b825dc642cb6eb9a060e54bf8d69288fbee4904 https://stackoverflow.com/q/9765453/1256452作为它的树。)所以every存储库中的提交补丁 ID 相当于所有其他提交到您的存储库中。

这(主要)解释了为什么你的 update-2 部分显示了它的输出:commit6dd3b5b补丁等同于提交6276bec, 9d23e9c, 等等。谜题是为什么要承诺caa4e2f不与另一个配对,因为它也与每个其他提交是补丁等效的。无论如何,这几乎是一个误报的例子,但这里它实际上更像是一个真正的肯定:这些提交are都是一样的,因此可以被丢弃而没有效果。


Git 的修订行走命令(git log and git rev-list) 可以使用git patch-id https://git-scm.com/docs/git-patch-id标记补丁等效承诺。这并非万无一失,但如果在没有手动干预的情况下精挑细选提交,则副本和原始版本的补丁 ID 将匹配。

要了解如何使用它,请查看the git log or git rev-list文档 https://git-scm.com/docs/git-log(关于此的部分在两组文档中共享 - 正如底层实现一样 - 所以我只链接到一个)。跳下至的部分--left-right option https://git-scm.com/docs/git-log#Documentation/git-log.txt---left-right。注意--left-right 仅当与对称差结合时才有意义,在本例中意味着使用语法release1...release2 or release2...release1。请注意,有three,不是这里两个名字之间的两个点。

使用三个点和--left-right,Git 将枚举可从以下位置访问的提交 5 和 4release1,以及可从以下位置访问的两个不同提交 5 和 4release2。 (当然,Git 首先会枚举可从以下位置访问的提交 9、8、7 和 6:release2,在枚举可到达的 5 和 4 之前release2但不是release1。正如您所看到的,用相同的两个名称来调用这四个不同的提交可能是错误的。它们具有不同的哈希 ID 是有原因的:它们是不同的提交。给他们打电话5A and 5B and 4A and 4B如果你喜欢,或者也许5.1 and 5.2添加版本号,但给它们不同的名称!)

到目前为止,这还没有多大帮助:Git 显示您提交了 5.1 和 4.1release1,标记为< or >取决于名称在三个点的哪一侧release1已开启。并且,Git 显示您提交了 9、8、7、6、5.2 和 4.2release2,用另一个标记标记。但这是最重要的起点。您现在可以从--left-right to --left-only https://git-scm.com/docs/git-log#Documentation/git-log.txt---left-only or --right-only,告诉 Gitdon't show我是两组中的一组,即使您仍在枚举所有提交。

无论有或没有仅左或仅右选项,您都可以添加--cherry-mark https://git-scm.com/docs/git-log#Documentation/git-log.txt---cherry-mark,告诉 Git:Run git patch-id在两组中的每次提交上。当左侧集中的提交与右侧集中的提交具有相同的补丁 ID 时,请使用等号标记该提交=。否则,用加号标记提交+.

因此,在这种情况下,如果您运行:

git rev-list --left-right --cherry-mark --abbrev-commit release2...release1

你会看到(假设提交 9 的哈希 ID 开头为999999, etc):

<9999999
<8888888
<7777777
<6666666
=5200000
=4200000
=5100000
=4100000

所以你想要的提交正是那些标记为<。使用release1...release2,您想要的提交正是那些标记为>.

假设以上所有内容都有意义,现在阅读--cherry-pick section https://git-scm.com/docs/git-log#Documentation/git-log.txt---cherry-pick.

请注意,如果您在挑选时必须解决冲突,则原始提交及其副本的补丁 IDwon't匹配。这样的提交won't被这个过程省略。也有可能得到错误的匹配。这种情况往往发生在仅包含移动一些左大括号和右大括号的修复中:补丁 ID 不仅是通过去除行号,而且还去除空格来形成的。因此,减少对补丁 ID 的两个不同(通过缩进和行号)大括号更改提交会折叠提交should有所不同。因此,我在顶部的声明并不是万无一失的:您可以获得两个误报(合并冲突已解决的樱桃选择)and误报(实际上不同的合并提交)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 日志列表提交不包括从第一个分支中精心挑选的内容 的相关文章

  • Git checkout 分支从其他分支留下目录树

    我有一个branch2 其源是branch1 并重命名了源自branch1 的目录 当签出branch1时 重命名的目录仍然存在 但没有标记为未暂存的修改 重命名的目录当然不会作为branch1 上的提交出现 为什么会出现这种情况 上述目录
  • 在github原子编辑器中隐藏隐藏(点)文件

    我对 Github Atom 编辑器非常陌生 它总是显示隐藏文件 例如 git sass在侧窗格中 如何在atom编辑器的侧窗格中隐藏隐藏文件 点文件 编辑 gt 首选项 gt 包 在 已安装的软件包 下面的字段中 输入 树视图 该软件包有
  • jenkins构建完成后如何将更改推送到github?

    我有一个 jenkins 作业 它从 github 克隆存储库 然后运行 powershell 脚本来增加文件中的版本号 我现在正在尝试将该更新文件发布回 github 上的原始存储库 因此当开发人员提取更改时 他会获得最新的版本号 我尝试
  • 没有工作树就无法使用 Git-Windows-git-pull

    我在 Windows 上遇到与 Git 相关的问题 无法从 git 上的存储库中提取更改 我能够添加 提交和推送我的更改 但不能拉取 它给了我一个错误 致命 C Git libexec git core git pull 不能在没有 工作树
  • jquery 克隆组合框无法运行

    我有下表 当我按下第一个按钮时 我调用 jquery 来克隆第一行并添加新行 table class table table striped table bordered bootstrap datatable style font siz
  • 如何在 github 中拉取请求时忽略或排除文件

    我们有 4 个分支 1 dev 2 qa 3 staging 4 master 我们要更新并添加1 dev中的CODEOWNERS文件中的一些人 2 qa到4 master的CODEOWNER文件将被保留 因为 1 dev 有 4 个审稿人
  • 两个人同时在 git 中处理一个文件[重复]

    这个问题在这里已经有答案了 可能的重复 当两个对等点同时将更改推送到同一个远程时 git 如何工作 https stackoverflow com questions 4643998 how git works when two peers
  • 为什么我的 git 预提交钩子不修剪行尾的空白?

    我在 Mac Mojave 上 我在 git templates hooks pre commit 创建了一个文件 我想删除我正在提交的文件行尾的空格 我希望这种情况在全球范围内发生在我的所有项目中 A git hook script to
  • 复合运行步骤 GitHub Actions 错误:“在 URI 处找不到操作”

    我正在尝试在 GitHub Actions 上使用复合运行步骤操作 如上所述here https github blog changelog 2020 08 07 github actions composite run steps 7E
  • Docker 错误:无法找到包 git

    我正在使用图像nginx这是基于dockerfile ubuntu 连接到 docker 容器的 shell docker exec it
  • 如何将 git 存储库转换为 Mercurial?

    我一直在使用 git 作为源代码存储库开发 java 应用程序 我想与其他 java 开发人员分享该项目 hg 似乎是他们最常用的 我的问题是如何将 git 存储库转换为 hg 如果我尝试谷歌搜索 将 git 转换为 hg 并且每次搜索命中
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • 如何将/ff分支提升到HEAD

    我有一个受保护的分支 只有在集成构建上的集成构建通过后 才应提升 快进该分支 我目前尝试通过在集成分支的拉取请求上构建集成来解决这个问题 一旦成功 只需将发布分支快速转发到集成分支的尖端 但是 当我在 TFS 构建系统上构建分支时 它将检出
  • 连接两个 Git 存储库的历史记录?

    我有一个旧的 Git 存储库 请调用它app 然后 一年后 我想从头开始重建应用程序 所以我创建了一个新的存储库 称之为app 2 现在 我意识到我应该创建一个新分支或其他东西 而不是一个新的存储库 因为我想移动app 2在之上app然后摆
  • 如何从现有的远程分支创建本地分支?

    我想从现有的远程分支 假设是远程 A 创建一个分支 然后将更改提交到存储库 我已使用以下命令从现有的远程 A 创建本地分支 git checkout remote A git branch master remote A 现在我已经使用以下
  • 使用 Git 和 Eclipse 管理 Android 项目

    我相信我有一个非常常见的问题 它会影响具有多个应用程序版本的开发人员 在我的例子中 我有两个 付费版本和免费版本 为了管理这两个版本 我使用具有 2 个不同分支的同一个 git 项目 免费和付费 然而 我的源代码包名称彼此不同 如预期 并且
  • git merge,保留两者

    为了合并 我用它来 保留我的 git merge X ours foo 这是 保留他们的 git merge X theirs foo 然而 在我最近的合并中 看起来最好保留双方 Git 是否有一个 策略 来避免手动编辑文件 没有解决这些冲
  • git 奇怪的彩色终端响应[重复]

    这个问题在这里已经有答案了 最近我被下面的彩色终端响应吓死了 它是由 git push 命令触发的 Does anybody have a clue where this colored response comes from 只是猜测 但
  • git log over 使用 --follow 时限制输出? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 在以下服务
  • 具有服务器端挂钩的托管 Git 解决方案?

    已经有一个类似的 版本控制托管解决方案 带有预提交挂钩 关于SO的问题 然而 提出这个问题的用户只需要客户端钩子 我正在寻找一个允许您配置的 Git 主机服务器端 hooks 我寻找这个的原因是为了防止开发人员能够在特定分支上 push f

随机推荐