如何在git日志图中显示相对提交数?

如何在git日志图中显示相对提交数?,git,logging,mercurial,Git,Logging,Mercurial,我是一个Mercurial用户,正在从Gitrepo探索一些代码。在Mercurial中,我喜欢在提交图中上下移动,执行签出并运行代码,以测试当我移动到较旧/较新的提交时,代码行为如何变化。这在Mercurial中很容易,因为它有局部相对修订号,这些是在日志图上下移动时递增/递减的纯整数。我可以在hg log中快速查看这些修订号 我需要在Git中进行这种类型的向上/向下的日志图。目前,我在Git中通过调用Git checkout master~1,Git checkout master~2,Gi

我是一个Mercurial用户,正在从Gitrepo探索一些代码。在Mercurial中,我喜欢在提交图中上下移动,执行签出并运行代码,以测试当我移动到较旧/较新的提交时,代码行为如何变化。这在Mercurial中很容易,因为它有局部相对修订号,这些是在日志图上下移动时递增/递减的纯整数。我可以在
hg log
中快速查看这些修订号

我需要在Git中进行这种类型的向上/向下的日志图。目前,我在Git中通过调用
Git checkout master~1
Git checkout master~2
Git checkout master~3
等等来实现这一点

这对于接近主控者的提交来说是很好的,但是当我在主控者之下20或100次提交时会变得复杂。我觉得如果我能得到
git log
git log--graph
来显示相对提交编号(提交到主文件的距离)以及修订哈希值,那就更容易了

类似这样的情况(注意
m~1
m~2
,下面的数字):


是否可以在git日志中获得此显示?关于如何实现这一点,有什么建议吗?

我不知道如何用相对头部修订来装饰git日志

但是,另一种选择是,一旦在
git log--graph
中看到要签出的提交,就使用它的SHA1

git checkout af142de # which is m~5
从那里,您可以进行与SHA1相关的其他签出:

git checkout af142de~1 # which is m~6

如果您的计算机上有“nl”和“sed”命令可用,请尝试以下操作:

git log --first-parent --pretty="%s - %ae" -50 |
        nl -v 0 |
        sed 's/\([0-9].*$\)/HEAD~\1/'
下面是针对PHP的git repo运行时的前15行输出:

 HEAD~0 Merge branch 'PHP-7.0' - ab@php.net
 HEAD~1 Merge branch 'PHP-7.0' - ab@php.net
 HEAD~2 Merge branch 'PHP-7.0' - ab@php.net
 HEAD~3 Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~4 Merge branch 'PHP-7.0' - ab@php.net
 HEAD~5 fix initializer for empty_fcall_info - ab@php.net
 HEAD~6 Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~7 Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~8 Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~9 Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~10    Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~11    Bump API numbers - nikic@php.net
 HEAD~12    Merge branch 'PHP-7.0' - nikic@php.net
 HEAD~13    unpack() function optional argument $offset. - dmitry@zend.com
 HEAD~14    Merge branch 'PHP-7.0' - ab@php.net
 HEAD~15    Removed zend_fcall_info.symbol_table - dmitry@zend.com

对于可能会觉得有用的Bash用户,这里有一个简单的脚本,它以默认(完整)格式以及支持
--graph
变量的
--oneline
格式显示相对于头提交的数字:

#/bin/bash
fp=“--第一父级”
如果[[“$*”=~--graph]];然后
unset fp#如果--graph在下面的参数“${fp:+$fp}”中,则不会产生任何结果(否--git log的第一个父级)
fi
n=0
git log--decoration=short--color=always${fp:+$fp}“$@”|
而IFS=“\n”读取行;做
如果[[“$line”=~^(\*.+)?.\[330M(提交[0-9a-f]{7})];那么
line=“$line HEAD~$n”#在行尾追加相对数
((n+=1))#将数字增加1
fi
将“$line”#打印(修改或未触及)行从git日志回显到输出
完成
这个脚本可以放在
$HOME
目录中,我称之为:logn.sh。保存时(使用
chmod+x
),可以在
~/.gitconfig
中声明引用它的git别名:

...
[alias]
    logn = "!logn() { ~/logn.sh \"$@\" | less -r; }; logn"
|less-r
适用于喜欢在寻呼机中查看git日志的用户(
-r
用于保留颜色)。此选项可以删除

该脚本依赖于以下正则表达式模式:
^(\*.+)?.\[33m(commit |[0-9a-f]{7})
。对于
(\*.+)?
格式,带有
的部分是“狡猾的”,因为每行都有一个主修订(第一个父级)以星号
*
开头,这样我们就可以利用它来匹配正确的版本

\[33m
是确保我们在每个提交条目中处理头(commit SHA)行的一个技巧,因为git将此颜色说明符馈送给它(因此脚本中
--color=always
)模式的其余部分只是来自同一行的“
commit
”字,或者代表
--oneline
格式的直接短SHA

在不使用
--graph
的情况下,脚本强制执行
--first parent
选项,因为顺序头计数对于非第一父提交(来自合并分支)是不正确的/没有意义的

别名(
\“$@\”
)和脚本(
“$@”
)都将位置参数转发到
git log
命令,以便它可以与任何其他可能放置的参数一起工作,例如
-p
-
(显示的提交次数),
--仅名称
,提到的
--单行
--图形
,等等


如果我们对格式做了太多的修改,正则表达式模式可能会停止匹配,并且不会附加相对数。当然,如果我们通过一个非HEAD修订开始,相对数将无效(例如,
git logn HEAD^^
git logn
,等等).

Git用户有没有什么诀窍可以不用鼠标复制粘贴就键入SHA1?Mercurial commit Integer很容易一次看到,然后在shell中键入。@Ash没有。唯一的诀窍是不必键入SHA1的所有42位:只需输入前5到7个字符enough@AshwinNanjappa是的,如果你使用tmux你就可以使用c使用键盘轻松复制/粘贴任何控制台输出短语(使用emacs模式或vi模式),无需使用鼠标或任何扭曲手指的快捷键。
...
[alias]
    logn = "!logn() { ~/logn.sh \"$@\" | less -r; }; logn"