如何“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”合并提交的差异? 的相关文章

  • Subversion 将未修改的文件标记为已修改

    这是我在使用 Subversion 时遇到的一个奇怪的问题 当从开发分支合并到主干 或返回 时 Subversion 会将许多文件标记为已更改 而它们没有任何更改 发生的情况如下 在我的分支中 我提交了 1 个修改过的文件 在主干中我合并了
  • 合并具有一个共同元素的集合 R

    我有一个这样的列表 lista list lista 1 c 1 2 4 6 8 9 10 11 12 19 32 34 35 36 37 38 lista 2 c 7 8 lista 3 c 13 14 16 26 27 28 29 30
  • 克隆存储库而不将其设为原始远程存储库

    我正在从一台将被擦除的计算机上克隆一个 git 存储库 是否可以在不创建原始存储库的情况下克隆存储库origin master 或者我是否需要克隆它 然后删除远程分支 这是通过git remote rm origin Edit 存储库只有一
  • Git - 推送到远程存储库中的远程跟踪分支

    当简单地做git push到远程存储库 其master分支得到更新 对于非裸存储库来说 这是不希望出现的情况 最近的 Git 版本显示的警告消息清楚地表明了这一点 我希望能够推送到远程存储库 并拥有其之一远程追踪分支进行更新 稍后 当我登录
  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

    我有一个大项目 比方说A repo 其中有一个子文件夹来自B repo 当我提交时 我会遇到如下警告A repo warning adding embedded git repository extractor annotator serv
  • 节点项目的 Azure git 部署失败

    我正在尝试将我的项目部署到azure 它正在失败 这些是我采取的步骤 git init git config core longpaths true git add git commit m initial commit 所有这些都有效 我
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • Git:如何变基到特定提交?

    我想变基到特定的提交 而不是另一个分支的 HEAD A B C master D topic to A B C master D topic 代替 A B C master D topic 我怎样才能做到这一点 您可以通过在您喜欢的提交上创
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 哪个是更智能的 git 协议,ssh 或 git(通过 ssh)或 https 协议?

    哪个高效 SSH 或 Git 文件压缩 我对 Git 的理解是 git 协议很智能 因为通信两端都有一个协议代理来压缩文件传输 从而通过有效地使用网络带宽来实现更快的克隆 From 我发现了以下说法 For secure authentic
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google

随机推荐

  • 如何从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