如何使用“git diff”比较同一提交的不同补丁?

slmsl1lt  于 2023-01-07  发布在  Git
关注(0)|答案(1)|浏览(188)

想象一下在git的某个特性分支上运行这行代码的场景:
第一个月
如果指定文件路径中的任何文件发生了更改,第一条语句将以0退出,然后右边的下一条命令将回显“Changed”,以指示存在相对于master分支的更改。
我希望做一些类似的事情,但是在这个场景中,当一个提交与它自己相对于以前的修改进行比较时。
所以如果我提交了A(patch1),做了一些修改,运行了"git commit --amend",提交被修改了,我们称之为B(patch2),A是第一个补丁,B是第二个(在Gerrit中通常是这样)。
是否可以检查两个修补程序之间的“差异”,以查看自上次"git commit --amend"命令以来哪些文件发生了更改?
所以理想情况下,我会比较补丁X相对于补丁Y的提交与类似"git diff"的东西,指定更改或更新的文件。

jk9hmnmh

jk9hmnmh1#

关键是要明白Git中的提交是不可变的。一旦创建,它们就不能再被修改。git commit --amend既不改变也不删除现有的提交;相反,它将HEAD(当前分支)向后移动一个提交,然后用相同的树和相同的提交消息重新创建先前的HEAD提交。旧提交没有丢失,只是从当前引用不可达。如果有另一个分支或标记指向它或它的任何子提交,它仍然可以通过另一个引用访问。
Git通过reflog跟踪HEAD和其他refs指向的所有提交。git reflog会显示reflog条目。
既然您特别提到了Gerrit:Gerrit为补丁集中的每个补丁保存引用,这些引用存储在refs/changes名称空间中。
Gerrit使用refs/for/前缀来将"推送以供审阅"的概念Map到git协议中。对于git客户端来说,看起来每次推送都指向同一个分支,比如refs/for/master。实际上,对于推送到该ref的每个提交,Gerrit都会在refs/changes/命名空间下创建一个新的ref,Gerrit使用该命名空间来跟踪这些提交。这些引用使用以下格式:

refs/changes/[CD]/[ABCD]/[EF]

其中:

  • [CD]是更改编号的最后两位数字
  • [ABCD]是变更编号
  • [EF]是修补程序集编号

例如:

refs/changes/20/884120/1
git config --add remote.origin.fetch '+refs/changes/*:refs/gerrit/changes/*'

这会将所有Gerrit引用提取到本地gerrit/分支命名空间中,例如gerrit/changes/20/884120/1
随后,获取补丁程序集的两个版本之间的差异变得非常简单:

git fetch
git diff gerrit/changes/20/88420/1 gerrit/changes/20/88420/2

相关问题