首页 > 解决方案 > 使用 git diff 生成补丁文件

问题描述

我在理解为什么生成的补丁文件git diff不同时遇到了一些问题。

下面是我的 git 日志:它local_tracking_branch有一个额外的功能,它没有被推送到远程。

commit COMMIT_HASH_1 (HEAD -> local_tracking_branch)

commit COMMIT_HASH_2 (origin/mainline, origin/HEAD)

git diff mainline > patch1用来生成第一个补丁。

然后我git diff COMMIT_HASH_1 COMMIT_HASH_2 > patch2用来生成第二个补丁。

事实证明,patch1它大于patch2大约 10K 字节。

这里有更多的上下文,我被指示使用第一种方法来生成要发布的补丁,但我想知道使用第二种方法来生成补丁文件是可以的。

另一种情况是,一旦我将功能推送到远程主线,我可以使用第二种方法 git diff commmit-hash1 commit-hash2来生成有效补丁吗?

感谢您的解释。

标签: git

解决方案


我用git diff mainline

这种形式的git diff比较给定的提交——哈希 ID 将是运行的结果:

git rev-parse mainline

这很可能与以下内容完全不同:

git rev-parse origin/mainline

——到当前的工作树。更准确地说,它将给定提交中保存的快照与当前工作树(您可以看到的文件)进行比较。

我用git diff COMMIT_HASH_1 COMMIT_HASH_2

这种形式git diff将第一次提交中保存的快照与第二次提交中保存的快照进行比较。

鉴于以下输出片段git log

commit COMMIT_HASH_1 (HEAD -> local_tracking_branch)
commit COMMIT_HASH_2 (origin/mainline, origin/HEAD)

我们可以预测它会mainline解析为第三个提交哈希。我们不能确定您当前的工作树是否与 中保存的快照相匹配COMMIT_HASH_1,但如果git status说一切都是“干净的”并且没有什么可提交的,那么它可能确实匹配。

所以所有奇怪的最可能的来源是指第三次提交,其快照与名称解析mainline的提交中的快照不太相似。origin/mainline(您已经拥有该哈希 ID,但要再次查看它本身,请使用前面提到的git rev-parse origin/mainline.)但另一种可能性是当前工作树与任何和/或所有这些其他提交不同。由于工作树由普通文件组成,因此您的任何普通(非 Git)命令都可以对这些普通文件进行任意更改。

另一种情况是,一旦我将功能推送到远程主线,我可以使用第二种方法git diff commmit-hash1 commit-hash2来生成有效补丁吗?

您可以随时执行此操作。它的有效性取决于谁拥有哪个提交以及他们想对这些提交做什么。

要记住的是,名称会随着时间而改变。一个类似mainlineorigin/mainline引用哈希 ID 的提交的名称。您可以找出他们现在使用的名称git rev-parse。明天,人们用分支做事后,他们可能会引用不同的提交哈希 ID。

但是,哈希 ID 永远保持不变。给定任何特定的哈希 ID,该哈希 ID 代表提交。没有其他提交可以拥有哈希 ID。该提交的快照一直被冻结;该哈希 ID 将始终以该形式表示这些文件。

哈希 ID 又长又丑,看起来很随机,而且很难输入。这就是我们使用名称的原因之一。 但是,分支名称会随着时间而变化。这就是我们使用标签名称的原因之一:标签名称被设计成稳定的,不会随着时间的推移而改变。使用提交哈希;或者,使用标签名称来指定一个特定的提交,并且不要手动移动标签名称(Git 不会自行移动它们)并且您有一种稳定的方式来引用该特定提交。


推荐阅读