如何“git show”合并提交的差异?

2023-12-05

当我进行合并提交并运行时git show <commit-ish>,它仅显示提交日志,而不显示差异:

commit c0f50178901e09a1237f7b9d9173ec5d1c4936c
Merge: ed234b ded051
Author: abc
Date:   Mon Nov 21 15:56:33 2016 -0800

    Merge branch 'abc'

我知道真正的提交在合并日志中,但我想节省打字。有没有一种方法可以显示其中的差异?


使用以下其中一项:

git show -m c05f017
git show --first-parent c05f017
git diff c05f017^ c05f017

您的问题存在一个根本性错误:提交不是差异;而是提交。提交是快照。这看起来似乎是一个没有区别的区别——对于某些提交来说,它is。但对于合并提交来说,它是not.

When git show (or git log -p) 显示提交as一个差异,它是这样做的将提交的快照与其他内容进行比较. The git diff命令执行相同的操作:它将一个提交与另一个提交进行比较。 (或者它可以比较对工作树的提交,或与索引的内容,或其他一些组合。)

对于普通提交,比较什么是显而易见的:comparethis将快照提交到previous(即父级)提交的快照。所以这就是git show确实(并且git log -p太):它运行一个git diff从父提交到此提交。

Merge commits don't have just one parent commit, though. They have two parents.1 This is what makes them "merge commits" in the first place: the definition of a merge commit is a commit with at least two parents.


1A merge commit can have three or more parents. These are called "octopus merges". They don't do anything special, though, and are mainly for showing off. :-) You can ignore them here.


当有两个父母时,哪一个应该git show比较?

What git log -p默认选择做的是根本不进行比较。您可以通过添加各种标志使其显示一些内容(见下文)。

What git show chooses to do by default is more complicated. Since there are two parents, git show first compares against the "first parent",2 then compares against the second parent. Then—this part is quite crucial—it combines the two diffs, producing a so-called "combined diff".

在下一节中,我将介绍一些棘手但非常有用的 Git 语法。如果您有一个提交 ID,例如c05f017,您可以添加插入符号或“帽子”字符^之后,命名一个父提交。您可以选择添加另一个号码来选择which父母。对于常规(非合并)提交只有一次,所以c05f017^ is the父母。对于合并提交,c05f017^ and c05f017^1两者的意思都是第一个父母, while c05f017^2 means 第二个父母.


2I put this in quotes because the first parent idea is especially important in Git, as we will see in a moment. In other words, Git cares most about which parent is first, while the rest are just "the rest".


组合差异

The combined diff format is described in the documentation, but a key bit is first described here, so as to make it especially obscure:3

注意组合差异仅列出所有父级修改的文件。

也就是说,假设M是合并提交,并且比较M^1 vs M说文件mainline.txt and common.txt都被改变了。进一步假设 diffM^2 and M说那个文件sidebranch.txt and common.txt都被改变了。合并后的差异将显示only common.txt,同时跳过mainline.txt and sidebranch.txt因为这两个文件仅修改自one父母(每个)。 (即便如此,Git 也可能只显示一些差异common.txt.)


3It took me a long time to find this in the documentation, as I kept looking at the other section.


拆分差异

The -m option—m可能代表merge这里——告诉 Git 实际上“分割”合并。也就是说,不要尝试将每个父级的差异组合成一个大的组合差异,而只需显示针对每个父级的差异each父级,一次一个差异。

有时这就是您想要的。当这不是你想要的时,你可以运行你自己的显式git diff只是与两个父母之一进行比较(或见下文)。

你应该反对哪位家长?

通常,正确答案是“第一任父母”。

“第一个父级”概念的关键是,当 Git 进行合并提交时,它总是将您当时所在的分支记录为第一个父级。另一个分支成为第二个父分支。

也就是说,如果你在develop然后你合并topic:

$ git checkout develop
$ git merge topic

Git 将进行一次新的提交——a合并提交,有两个父母 - 在您当前的分支机构,develop. The first合并提交的父级将是最顶端的提交develop刚才。这second父级将是(仍然)是尖端的提交topic.

由于您通常关心合并带来的内容,因此与第一个父级进行比较就会得到这一点。所以通常这就是你想要的。为此原因,git show允许你运行git show --first-parent。 “分割”提交然后git show仅与第一个父级不同。 (这与git show -m,它将提交拆分两次:第一次拆分与第一个父级进行比较,第二次拆分与第二个父级进行比较。)

同样,你可以运行git log -p --first-parent在这里,--first-parentflag还有一个更重要的作用:日志操作不看any侧分支的提交,仅限于主(第一个父)行上的提交。请注意,如果您的 Git 版本早于 2.31,您仍然需要-m也标记(当使用git log, 那是;git show默认为--cc因此不需要-m,所有这些都在 Git 2.31 中得到了清理)。

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

如何“git show”合并提交的差异? 的相关文章

  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • Git守护进程克隆错误

    All 我正在按照以下指示进行操作this SO https stackoverflow com a 377293 724357答案 快速提供回购 当我跑步时git clone git ipAddr git project我得到这个输出 r
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • Git 中的“分支提示”是什么?

    我正在学习 Git 并阅读专业 Git 书籍 https git scm com book en v2 书中和 Stack Overflow 上有时会使用术语 分支提示 但我找不到它的含义 分支提示是分支上的最后一次提交或最近一次提交 基本
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • gitlab 上的权限被拒绝(公钥)

    我的问题是我无法从 GitLab 推送或获取 不过 我可以克隆 通过 HTTP 或通过 SSH 当我尝试推送时出现此错误 权限被拒绝 公钥 致命 无法从远程存储库读取 从我看过的所有线程中 这是我所做的 在我的计算机上设置 SSH 密钥并将
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 有没有可以在 HTML 文档之间进行比较的 ruby​​ gem?

    事实证明 对两个不同的 html 文档进行比较是一个完全不同的问题 而不仅仅是对纯文本进行比较 例如 如果我在以下之间进行简单的 LCS 差异 Google and Google diff 结果不是 but a gt github com
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 无法使用 git 推送或获取 [重复]

    这个问题在这里已经有答案了 我可以拉 但无法使用 git 版本 1 9 5 推送或获取 它突然开始给我以下错误 关于如何修复它有什么想法吗 git fetch fatal unable to access https email prote
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • 具有延迟 NSMenu 的 NSButton - Objective-C/Cocoa

    我想创建一个NSButton单击时会发送一个操作 但按下 1 或 2 秒时会显示 NSMenu 和这个问题完全一样here https stackoverflow com questions 3309030 how to create ns
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da

随机推荐

  • 如何从windows(v10)上彻底卸载Android Studio?

    我已经看过了this问题 但这是针对 Mac 操作系统的 我正在使用Windows 每次我创建一个新项目或尝试build rebuild项目冻结了 我已经安装了最新版本 9 10 2016 但事情正在变得更糟 我想完全删除它并安装它 就像我
  • 概率多项选择测试,sliderInputs 总和为 1 约束

    我正在开发一个小shinyapp要进行概率多项选择测试 请参阅贝尔纳多 1997 对于测试中的每个问题 都会有 4 个可能的答案 每个参与者都应该为每个选项分配一些值 以反映他们对每个选项都是正确答案的信念程度 我正在使用以下命令记录此输入
  • 嵌套对象初始值设定项语法

    Resharper 刚刚向我建议了以下重构 Constructor initializes InitializedProperty but the UninitializedSubproperty is uninitialized var
  • 最近 VSO 更新后,将 Ranorex CodedUI 测试链接到 MTM/VSO 2013 CI 时出现问题

    我们已经建立了 CI 流程 将 118 个 Ranorex 测试用例链接到 MTM 测试用例 并在专用自动化 VM 上运行它们 该 VM 由 Visual Studio 中的定时构建触发 CI 流程仍然正常工作 但我刚刚尝试添加另一个测试
  • 如何在 C# 中计算整数的除法和模数?

    如何在 C 中计算整数的除法和模数 这是来自MSDN 文档 当您将两个整数相除时 结果始终是一个整数 例如 7 3 的结果是 2 要确定 7 3 的余数 请使用余数运算符 int a 5 int b 3 int div a b quotie
  • 递归函数中的 Catch 块重复执行

    我有一个递归函数 用于从 AWS 上的 CodeCommit 存储库获取 SQL 文件并按顺序运行它们 我们需要等待上一个文件完成才能运行下一个文件 如果其中一个 SQL 文件失败 我需要 catch 块来返回有关失败文件的信息 目前我在代
  • 如何使用正则表达式删除方括号及其之间的任何内容?

    如何删除方括号之间和方括号本身的文本 例如 我需要 hello quote im sneaky world 成为 hello world 这是我尝试使用的 但它没有达到目的 preg replace str 我刚刚结束 hello quot
  • 处理外部文件的 getResourceAsStream

    我的 getResourceAsStream 方法有问题 由于目录错误 它返回 null 问题是我不知道如何定义目录 我的项目结构看起来像这样 Project src com package ExampleClass java dll My
  • 如何查询数据库中用户的排名,但只考虑每个用户的最新条目?

    假设我有一个名为 Scrape 的数据库表 可能设置如下 UserID int UserName varchar Wins int Losses int ScrapeDate datetime 我试图根据用户的赢 输比对他们进行排名 但是
  • 按钮点击计数器 [PHP]

    我尝试创建一个变量来存储单击按钮的计数 不幸的是我收到这个错误 Undefined variable counter 这是我的代码 if SERVER REQUEST METHOD POST counter isset POST count
  • MySQL处于“正在发送数据”状态是什么意思?

    如果 Mysql 查询 SHOW PROCESSLIST 在 状态 列中返回 正在发送数据 我想这意味着查询已经执行并且MySQL正在向客户端发送 结果 数据 但我想知道为什么它花费了这么多时间 最多一个小时 谢谢 这是一个相当具有误导性的
  • 下面的代码中实习生是如何工作的?

    String a abc String b a substring 1 b intern String c bc System out println b c 这个问题可能很愚蠢 因为实习生在这里没有主要用途 但我仍然对这个事实感到困惑 为
  • 在android中通过Loaders插入记录

    这个问题将是被问者的后续问题内容解析器与游标加载器答案清楚地说明了如何使用 Content Resolver 将记录插入到 sqlite Db 中 我的问题如下 我可以使用加载器 普通加载器 来实现此功能吗 eg public Loader
  • 使用java将HTML转换为图像

    我在使用 java 将 html 转换为图像时遇到一些问题 我正在使用 html2image java 它创建一个图像 但问题是它只在 html 的一小部分上创建图像 我怎样才能制作整个 html 的图像 谢谢 这是我的代码 import
  • 如何使用 Nokogiri 用

    标签包装 HTML 无标签文本?

    我必须将 HTML 文档解析为不同的新文件 问题是有一些文本节点没有被包裹起来 p 标签 而不是他们有 br 每个段落末尾的标签 我想用以下文字换行 p p 使用 Nokogiri 的标签 p div b Footnote 15 b Cat
  • 在Python中复制多个文件

    如何使用 Python 将一个目录中存在的所有文件复制到另一个目录 我有源路径和目标路径作为字符串 您可以使用os listdir 获取源目录中的文件 os path isfile 查看它们是否是常规文件 包括 nix 系统上的符号链接 以
  • 如何递归替换对象中的键名称?

    我试图弄清楚如何使用递归将对象的键名称替换为新的键名称 这也包括嵌套对象内部的键名称 我觉得这与我在第一个 if 条件语句中重新分配给 newObj 的方式有关 有什么建议么 到目前为止 这是我的代码 24 Find all keys in
  • azure 搜索按分数排序和过滤

    我想知道如何使用 azure 搜索按分数过滤和排序结果 我试过 https domaine net indexes indexName email protected 20desc count true Return object stdC
  • 如何在网页中的特定 div 中垂直向下滚动

    我搜索了所有论坛 但没有得到我的问题的正确答案 我要测试的网页下面隐藏了一个链接 我尝试通过使用 xpath 或元素的 ID 属性搜索它来手动找到它 但在运行 Web 驱动程序脚本时找不到它 即使它没有在该元素上给出任何错误 我也会在下一个
  • 如何“git show”合并提交的差异?

    当我进行合并提交并运行时git show