Git Grep正在搜索

时间:2014-03-24 14:22:01

标签: git

我正在尝试比较Git项目的两个提交。我所做的是将存储库克隆到postfix文件夹,然后使用:

git --grep=xxx

其中xxx是提交编号,检索哈希值,然后对检索到的哈希值使用git checkout。

但是,git grep只返回该特定提交的详细信息。

例如,如果提交具有ID 24,那么我是否可以检索ID为23的提交以获得没有修复的项目版本?

3 个答案:

答案 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