git - 使用 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 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
来生成有效补丁吗?
您可以随时执行此操作。它的有效性取决于谁拥有哪个提交以及他们想对这些提交做什么。
要记住的是,名称会随着时间而改变。一个类似mainline
或origin/mainline
引用哈希 ID 的提交的名称。您可以找出他们现在使用的名称git rev-parse
。明天,人们用分支做事后,他们可能会引用不同的提交哈希 ID。
但是,哈希 ID 永远保持不变。给定任何特定的哈希 ID,该哈希 ID 代表该提交。没有其他提交可以拥有该哈希 ID。该提交的快照一直被冻结;该哈希 ID 将始终以该形式表示这些文件。
哈希 ID 又长又丑,看起来很随机,而且很难输入。这就是我们使用名称的原因之一。 但是,分支名称会随着时间而变化。这就是我们使用标签名称的原因之一:标签名称被设计成稳定的,不会随着时间的推移而改变。使用提交哈希;或者,使用标签名称来指定一个特定的提交,并且不要手动移动标签名称(Git 不会自行移动它们)并且您有一种稳定的方式来引用该特定提交。
推荐阅读
- javascript - 如何在 JXA 中启动异步后台进程
- php - 使用 mysql 生成当前、30、60、90 天的老化报告
- amazon-web-services - AWS Step函数:如何在状态机中传递静态键值对(不使用类型:传递)?
- hash - 加密图像的深度学习
- scala - 在Scala中动态选择类型类
- java - OnActivityResult 在片段内不起作用。我怎样才能在我的代码上解决这个问题?
- c# - 带有实体框架的 SQLite DATETIME(在 Julian/Real/Double 中)列
- python - 如何从 git worktree 命令生成多个文件夹?
- docker - 有没有更有效的方法来码头化 Luarocks?
- ruby-on-rails-6 - Rails::SourceAnnotationExtractor 不是类/模块 (TypeError)