想象一下在git的某个特性分支上运行这行代码的场景:
第一个月
如果指定文件路径中的任何文件发生了更改,第一条语句将以0退出,然后右边的下一条命令将回显“Changed”,以指示存在相对于master分支的更改。
我希望做一些类似的事情,但是在这个场景中,当一个提交与它自己相对于以前的修改进行比较时。
所以如果我提交了A(patch1),做了一些修改,运行了"git commit --amend"
,提交被修改了,我们称之为B(patch2),A是第一个补丁,B是第二个(在Gerrit中通常是这样)。
是否可以检查两个修补程序之间的“差异”,以查看自上次"git commit --amend"
命令以来哪些文件发生了更改?
所以理想情况下,我会比较补丁X相对于补丁Y的提交与类似"git diff"
的东西,指定更改或更新的文件。
1条答案
按热度按时间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使用该命名空间来跟踪这些提交。这些引用使用以下格式:
其中:
[CD]
是更改编号的最后两位数字[ABCD]
是变更编号[EF]
是修补程序集编号例如:
你可以获取这些引用,然后直接用它们来比较不同的提交:
这会将所有Gerrit引用提取到本地
gerrit/
分支命名空间中,例如gerrit/changes/20/884120/1
。随后,获取补丁程序集的两个版本之间的差异变得非常简单: