找出是否在给定哈希值的另一次提交之前或之后签入了git提交

时间:2013-01-08 19:23:05

标签: git

我想念使用svn的一件事是修订号的简单编号。我可以很容易地看到在测试环境中部署的版本是在某次提交之前还是之后。

使用git为其提交使用哈希,有什么方法可以判断是否在另一次提交之前或之后提交了提交?

7 个答案:

答案 0 :(得分:8)

正如你所注意到的,在Git中,事情并非如此简单。特别是,“之前”和“之后”的定义需要更多的澄清。

如果您信任提交到您的存储库的人不要弄乱时间戳,并且您已经知道两个提交都在同一个分支上,那么您可以比较提交的时间戳,并查看哪个更早。对每个提交使用以下命令,并比较结果。

git log -1 --format='%ci' <commit>

使用Git,您不一定信任时间戳,但是,与Subversion不同,没有一个中央存储库可以生成它们。你也不能确定两个提交是在同一个分支上(尽管Subversion也存在这个问题)。

为了避免这些问题,请讨论一个提交是否是另一个提交的祖先,而不是它是在它之前还是之后。在下面的提交图中,B和C是A的祖先,而B不是C的祖先,反之亦然:

B    (master)
| C  (branch)
|/
A    (root)

要确定提交A是否是提交B的祖先,请使用以下命令(基于an article at git ready):

git rev-list <commitA> | grep $(git rev-parse <commitB>)

第一部分列出了作为提交A的祖先的所有提交;第二部分获取提交B的完整哈希值,然后在祖先列表中搜索该提交。如果您看到任何输出,则提交A是提交B的祖先。如果提交A是提交B的祖先,则交换参数以解决问题。

第二种形式较慢,但绝对确定一次提交是另一种提交的祖先。

答案 1 :(得分:4)

git rev-list --count可以提供帮助。假设110a1875d41af1之前提交了4次提交,那么:

 $ git rev-list --count 110a187..5d41af1
4
 $ git rev-list --count 5d41af1..110a187
0

因此像:

test $(git rev-list --count $a..$b) == 0 && \
       echo "$a is not an ancestor of $b"

答案 2 :(得分:2)

在每次提交时使用git show来查找提交日期。没有办法只看哈希来确定顺序,因为它只是一个哈希。

您可以使用自定义格式字符串来显示您想要的内容,请查看man pages以获取更多信息。

git show --format="%ci" <commit>

答案 3 :(得分:2)

您可以从日志中获取显示哈希,作者,日期和评论的所有提交信息:

git log

您可以从提交日志中提取特定提交的时间/日期。类似的东西:

git log -1 --format="%cd" <commit>

'%cd'为您提供日志格式的日期,您也可以这样做:

  • %cD:RFC2822样式
  • %cr:relative
  • %ct:UNIX时间戳
  • %ci:ISO 8601格式

从那里,如果你需要自动化,你可以与一些脚本进行一些比较。

答案 4 :(得分:1)

git merge-base有一个标志。它只是返回一个0/1退出代码。

git merge-base --is-ancestor <commit> <commit>

答案 5 :(得分:0)

如果您使用标签,则可以

git describe --tags

这将告诉您自上一个标记以来提交了多少次。

答案 6 :(得分:0)

使用@me_and提到的all the remarks,您还可以尝试:

Options +ExecCGI
    addhandler x-httpd-php5-cgi .php
    Options -MultiViews
    DirectoryIndex index.php
    <IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>
    RewriteEngine On
    RewriteBase /
    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    #RewriteRule ^ index.php [L]
    RewriteRule ^(.*)$ index.php?/$1 [L]
    </IfModule>

在输出中,您将看到提供的提交按照提交时间的倒序显示。因此,提供的提交顺序无关紧要(与@Douglas Bagnall的idea suggested矛盾)。