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

找出git提交是在给定哈希值的另一次提交之前还是之后签入的,git,Git,关于使用svn,我错过了一件事,那就是修订号的简单编号。我可以很容易地看到部署在测试环境中的版本是在某个提交之前还是之后 git在提交时使用哈希,如何判断提交是在另一次提交之前还是之后进行的?如果使用标记,您可以这样做 git describe --tags 这将告诉您自上次标记以来有多少次提交。在每次提交时使用以查找提交日期。不能仅仅通过查看散列来确定顺序,因为它只是一个散列 您可以使用自定义格式字符串来显示所需内容,有关详细信息,请查看 git show --format="%ci" &l

关于使用svn,我错过了一件事,那就是修订号的简单编号。我可以很容易地看到部署在测试环境中的版本是在某个提交之前还是之后


git在提交时使用哈希,如何判断提交是在另一次提交之前还是之后进行的?

如果使用标记,您可以这样做

git describe --tags
这将告诉您自上次标记以来有多少次提交。

在每次提交时使用以查找提交日期。不能仅仅通过查看散列来确定顺序,因为它只是一个散列

您可以使用自定义格式字符串来显示所需内容,有关详细信息,请查看

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

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

git log
您可以从提交日志中提取特定提交的时间/日期。比如:

git log -1 --format="%cd" <commit>
test $(git rev-list --count $a..$b) == 0 && \
       echo "$a is not an ancestor of $b"
git日志-1--format=“%cd”
“%cd”以日志格式提供日期,您还可以执行以下操作:

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

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

正如您所指出的,在Git中事情并不是那么简单。特别是,“之前”和“之后”的定义需要进一步澄清

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

git log -1 --format='%ci' <commit>
要确定提交A是否是提交B的祖先,请使用以下命令(基于):

git版本列表| grep$(git版本解析)
第一部分列出了作为提交的祖先的所有提交;第二部分获取提交B的完整哈希,然后在祖先列表中搜索该提交。如果您看到任何输出,commit A是commit B的祖先。交换参数以确定commit A是否是commit B的祖先

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

git rev list--count
会有所帮助。假设
110a187
5d41af1
之前有4个提交,那么:

 $ git rev-list --count 110a187..5d41af1
4
 $ git rev-list --count 5d41af1..110a187
0
因此类似于:

git log -1 --format="%cd" <commit>
test $(git rev-list --count $a..$b) == 0 && \
       echo "$a is not an ancestor of $b"

git merge base为此设置了一个标志。它只返回一个0/1退出代码

git merge-base --is-ancestor <commit> <commit>
git合并基——是祖先
对于@me\u和提到的,您也可以尝试:

git rev-list --no-walk commitA commitB

在输出中,您将看到所提供的提交按提交时间以相反的时间顺序显示。因此,提交的顺序并不重要(与@Douglas Bagnall的做法相反)。

那么,当我执行git log-1——format='%ci'时,时间戳代表什么?我只是想理解一个场景,当我不能信任时间戳时。@Glide:该时间戳表示提交的时间。但是,由于提交最初是在开发人员的本地存储库上进行的,如果他们的计算机上的时钟错误,或者他们使用了类似于玩
GIT\u COMMITTER\u DATE
的技巧,则时间戳可能不正确。嘿,该命令可以工作,但您所说的关于它如何工作的内容是不正确的。git rev list命令实际上确定commit B是否是commit A的祖先。您可以说“第一部分列出了commit A的祖先的所有提交”。从我刚刚做的一些测试来看,它显然是这样的。因此,如果您在该列表中搜索提交SHA,那么如果提交B在该祖先列表中,则grep将成功,即提交a的祖先,与您编写的相反。
git rev list | grep
返回0(true);如果提交B在B之后,则返回1(false)如果commitA在B之前。这是因为
git rev list
返回commitA的所有“祖先提交”。如果@Glide表示父级/子级,而不是临时的,那么在提交通过从不同分支合并进入分支的情况下,这个答案更准确。或者执行普通的
合并基
,如果结果是两次提交中的任何一次,那就是第一次提交,或者可能是第三次提交,这使他们成为表亲或兄弟姐妹,或者可能什么都不是,在这种情况下,他们来自无关的历史。对我来说似乎不起作用。如果我翻转提交,输出也会显示不同的顺序。也许你忘了一个拓扑标志?