- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读git的文档时,我似乎发现了一个矛盾。
在this official tutorial of git中,据说git log -p
可显示提交的历史记录以及完整的差异信息。但是,在the documentation of git-log中,据说-p
选项产生补丁文件,而不是直接输出。而且,“至少它们对我来说”这样的描述令人困惑,因为“上述”很模糊。
除了上面给出的部分外,我只发现one other place提到了-p
选项,该选项与本教程中的描述相匹配,而不是补丁部分。另外,当我在计算机上运行git log -p
时,它显示提交历史记录和diff信息,并且看不到生成任何补丁文件。那么文档的两个部分矛盾吗?还是我误解了“生成补丁文件”的过程?谢谢!
最佳答案
我们可以说,有很多Git文档不是很理想。
重要的是要意识到,每个Git提交都会保存快照而不是更改,因为这解释了Git在某些棘手情况下的行为。然后,各种Git命令(包括git diff
和git log
)都可以提取两个快照并进行比较。比较旧快照和较新快照(或“左侧”与“右侧”)的结果是差异或补丁,因为您可以将其反转,然后将较新快照与较早的快照进行比较。
准备这样的diff / patch的默认方法是产生一系列指令,如果遵循字母,则会将每个左侧文件转换为相应的右侧文件。这些指令的一般形式为:希望此特定上下文在左侧和右侧文件中均可见,然后从左侧文件中删除任何-
行,并从右侧文件中添加任何+
行。如果左侧文件来自某个提交的(单个)父级,而右侧文件来自该提交本身,则可以告诉您该文件中有人进行了更改。
毫无疑问,您已经看到了此输出,甚至可能有些道理。
但是,您正在阅读的文档是根据多个输入片段自动编译的,并且 git log
description to which you linked被编写为在this other description of the default output of git diff-tree
之后读取,其中包括以下特定文本:
in-place edit :100644 100644 bcd1234 0123456 M file0
copy-edit :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit :100644 100644 abcd123 1234567 R86 file1 file3
create :000000 100644 0000000 1234567 A file4
delete :100644 000000 1234567 0000000 D file5
unmerged :000000 000000 0000000 0000000 U file6
git log -p
根本不产生该输出-因此
git log
文档不包括此部分。但是
git log -p
确实产生与
git diff-tree -p
相同的输出。当
git diff-tree -p
文档的后面部分使用短语“不产生上述输出”时,它是在谈论
:100644 ...
内容。
git log -p
show[s] the history of commits together with complete diff info
git log -p
而言太复杂了。具体来说,合并提交定义为具有两个或多个父提交的任何提交。
git log
可以运行
git diff
,其左侧的父代(单数),右侧的提交(单数)。通过这种方式,您可以看到父子之间的变化:提交的作者在提交中发生了变化。
git merge
命令倾向于构建它们。 (我们不能说它总是构建它们,因为-与Git命令非常常见-
git merge
实际上可以根据情况和某些命令行参数来执行几个不同的任务之一。)给定这种合并提交,
git log
不只是选择一个父级,然后向您显示该父级快照与提交快照之间的差异。它不会选择两个父对象并进行区分(通常这不是很明智,并且不会告诉您有关合并结果的任何信息),它甚至不会尝试同时比较所有三个提交,至少默认情况下不会。
git log
对双亲(或双亲以上)合并提交的作用是向您显示日志消息,然后根本不用显示差异。在大多数情况下,这实际上是最实际的操作,这就是
git log
要做的原因。但这立即告诉我们,我们绝对无法获得完整的图像!
A <-B <-C ... <-F <-G <-H <--master
git log
的工作是从最后一次提交开始-它具有一些哈希ID,但是在这里,我将其称为
H
-并向您显示其作者和日志消息,然后提取两个快照,一个快照来自父
G
,另一个快照来自
H
本身,然后进行比较。然后它继续前进(或向后退)以提交
G
。现在,它向您显示
G
的作者和日志消息,然后提取
F
(
G
的父级)和
G
的快照并进行比较。重复上述过程,Git从子提交到父提交逐个提交。只是在合并时
git log
根本不会打扰差异。
git show
命令与
git log
非常相似:它主要完成
git log
的工作,但仅执行一次提交。也就是说,如果为
git show
提供commit
G
的哈希ID,它将向您显示
G
的作者信息及其日志消息,以及
F
与
G
的区别,但只是到此为止-它不会继续也显示
F
。但是,如果您将
git show
指向合并提交,则至少有时会显示差异。它显示的是组合的差异,这些手册页中对此进行了进一步的描述。重要的是要注意,组合diff仍然故意遗漏了一些东西。特别要特别注意文档的(单独)部分,其中提到:
combined diff lists only files which were modified from all parents.
git log
不显示任何内容而
git show
产生组合差异。
git log
和
git show
以及其他各种命令可以执行这种特殊的组合差异操作。但是默认情况下,
git log
不会打扰。您可以给
git log
一个
-c
或
--cc
标志(请注意,第一个是“一个破折号,一个c”,第二个是“两个破折号,两个c”),以使
git log
产生合并的差异以进行合并。
git show
命令默认为
--cc
行为。
git log
和
git show
一个
-m
标志。在这种情况下,这些命令将更加特别地对待合并:对于具有两个父P1和P2的合并提交C,这两个命令实际上将运行:
git diff P1 C
git diff P2 C
--graph
,否则
git log
不会为您提供足够的信息来再现实际的提交图—这对于理解
git merge
至关重要。但这是另一天...
关于git - git log -p:显示差异还是生成补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941299/
我正在尝试在站点列表中添加站点名称,以便在 publish:end:remote 上清除 HTML 缓存事件。 mysite 但是,它没有按预期工
我正在尝试使用不同目录中的多个文件制作补丁。我不想包含所有未提交的文件,因为我有很多不适用于补丁。 我知道这个命令可以使用特定文件创建补丁,唯一的问题是这是一个文件: svn diff -up ori
我经常使用 gnu-utils 补丁和差异。使用 git,我经常这样做: git diff 通常简单的更改会创建一个大补丁,因为唯一的更改是,例如,添加一个 if/else 循环,并且里面的所有内容都
我使用命令(从 ~ 执行)生成了一个 diff.txt 文件: diff -r /full/path/to/directory/A /full/path/to/directory/B > diff.t
我正在编写一个项目,我需要通过网络传输一组相似的图像。为了加快速度,我考虑过做大多数电影编解码器所做的事情。有关键帧,然后发送更改。 现在,我得到的是一组 BufferedImage,因此类似于文本文
我正在尝试将更改拆分为多个提交,但在手动编辑大块时我遇到了问题。 原始大块头: @@ -116,8 +116,8 @@ context context -
我想自动测试一组仍然干净利落地适用于(更新的)代码库的补丁。为此,我打算运行 patch -p 1 a echo b > b diff -Nu a b > p rm a b patch -p 1 <
我已经从一个模块中导入了一个类,但是当我尝试在没有模块作为前缀的情况下修补类名时,我得到一个类型错误: TypeError: Need a valid target to patch. You sup
最近我从 SVN 迁移到 git,我的团队已经开始在新的 git 存储库中工作。 后来我发现了一些转换问题,并从 SVN 制作了第二个 git repo,并进行了一些修复和历史重写。 现在我有了 SV
我正在尝试为我的应用程序创建一个补丁。实现描述的示例 here按预期工作。但是,每个版本的文件都存储在单独的目录中。 1.0 版文件在 c:sample\1.0 中,1.1 版文件在 c:sample
首先请原谅我的长文,但我会尽量详细。 我正在为一个开源项目 (DSpace) 进行开发。我没有对他们的 SVN 存储库的提交权限,所以我查看了源代码并一直使用 git 来管理我的版本控制。 在我的开发
有没有办法自动 merge (interdiff)2 个头分支和 1 个基分支之间的冲突? 我试图在补丁级别做这件事 版本A是我的基础 VersionB 是 VersionA 的分支 VersionB
我正在尝试申请 this修补到 MinGW 上的 GCC 以获取它 to compile GDC 2 ,但我不知道如何。 (我对 GCC 的内部结构还很陌生,甚至对一般的 *nix 工具也很陌生。)我
我对软件开发很陌生,所以这无疑是一个非常基本的问题。我得到了一个开源项目的 mercurial repo。我复制了它并做了一些工作。 promise 。工作更多,然后进行了第二次提交。所以我的树看起来
我想对这个错误 ( http://code.djangoproject.com/ticket/13095 ) 应用补丁,但我以前从未做过,也不知道从哪里开始。谁能给我指点教程? 最佳答案 在 Linu
我前段时间使用 p4 diff 生成了一个补丁。命令。 然而,现在我想应用它,我意识到没有办法在 Perforce 中应用补丁。 由于我没有使用 -du选项,补丁是那种晦涩难懂的 perforce 格
我可以使用 NSIS 的 Vpatch 生成从一个版本到另一个版本的补丁文件。假设我有 mydll.dll 版本 1,我有一个补丁可以将它更新到版本 2。然后我又有了一个新版本,因此我生成了另一个补丁
我有一个补丁,用 hg export 42 制作在另一个存储库中,修改文件 asd/fgh/foo/bar.c asd/fgh/foo/fish.h boo/hoo.txt 我需要将此补丁导入具有如下
我们有一个相当大的库,我们需要定期将其导入(然后修补)到我们的代码库中。 SVN Book 似乎推荐了一个“vendor branch”方案,我们保留了“vendor drops”的补丁版本。这会起作
我正在家里用 tensorflow 玩卷积神经网络(顺便说一句,我已经完成了 udacity 深度学习类(class),所以我有理论基础)。 运行卷积时,patch 的大小会产生什么影响?当图像变大/
我是一名优秀的程序员,十分优秀!