我正在尝试比较Git项目的两个提交。我所做的是将存储库克隆到postfix文件夹,然后使用:
git --grep=xxx
其中xxx是提交编号,检索哈希值,然后对检索到的哈希值使用git checkout。
但是,git grep只返回该特定提交的详细信息。
例如,如果提交具有ID 24,那么我是否可以检索ID为23的提交以获得没有修复的项目版本?
答案 0 :(得分:2)
我不确定您正在谈论的ID是什么:Git提交没有任何后续ID,只能通过SHA-1名称来识别,这些名称是通过相应提交对象计算的哈希值。
所以我可能会假设您正在谈论一个嵌入了外部生成的 ID的项目。一个原因可能是这是一个跟随Subversion存储库的项目,因为默认情况下,在这样的存储库中创建的所有提交都会将Subversion URL和版本ID巧妙地嵌入其消息中。
首先要做的事情:总的来说,你的问题的答案是否定的。原因是任何Git提交可能有多个父 - 如果它是合并提交。因此,考虑一个提交而只是向后退(见下文,如何做到这一点)是不可能的。
gitrevisions(7)
手册页列出了两种选择父提交的形式:
<rev>^
,例如HEAD^
,v1.5.1^0
修订参数的后缀
^
表示该提交对象的第一个父级。^<n>
表示<n>
个父级(即<rev>^
等同于<rev>^1
)。作为一项特殊规则,<rev>^0
表示提交本身,并且在<rev>
是引用提交对象的标记对象的对象名时使用。
<rev>~<n>
,例如master~3
修订参数的后缀
~<n>
表示提交对象,它是指定提交对象的<n>
代祖先,仅跟随第一个父对象。即<rev>~3
相当于<rev>^^^
,相当于<rev>^1^1^1
。请参阅下文,了解此表单的使用说明。
正如您所看到的,Git要么强制您明确指示父级,要么假设第一个(也是#34;左侧&#34;)父级(这是合并已成为的父级)。
因此,一旦您知道提交的SHA-1名称,就让它为2abcde45
,您可以使用2abcde45^
或2abcde45^1
或{{1}来引用其第一个父级这对于这个任务来说都是一样的。
我想再次强调Git承诺没有&#34; ID&#34;在你似乎正在使用的意义上,所以请花时间真正了解你正在处理的ID。在这里发布另一个问题,如果引用样本提交的提交消息,我认为可以。
答案 1 :(得分:1)
一旦你签出提交,你就可以轻松回到父提交(假设它只有一个父提交):
$ git checkout HEAD^
答案 2 :(得分:0)
要比较Git存储库的两个提交,只需使用git diff
:
git diff commit1 commit2