如何在git log图表中显示相对提交编号?

4

我是一个使用Mercurial的用户,现在正在探索从一个Git仓库中获取的一些代码。在Mercurial中,我喜欢沿着提交记录图向上或向下移动,通过检出和运行代码来测试随着我移动到更旧或更新的提交时代码行为如何改变。由于Mercurial具有本地相对修订号,这些号码是纯粹的整数,因此它们会随着我在日志图中向上或向下移动而递增/递减。我可以在hg log中快速查看这些修订号。

我需要在Git中执行这种上下爬升日志图的操作。目前,我通过调用git checkout master~1git checkout master~2git checkout master~3等命令来完成这个操作。

这对于靠近主分支的提交来说还好,但当我在主分支下面20或100个提交时,就会变得复杂。如果我能够让git loggit log --graph显示相对提交号(一个提交距离主分支有多远),并附带修订哈希值,那么就会更容易了。

就像这样(请注意下面的m~1m~2等数字):

$ git log --graph --oneline

*   7d49b65 2015-12-01 Merge pull request #538 from erwincoumans/master
|\  
| * 5da9e37 2015-11-26 add BT_DECLARE_ALIGNED_ALLOCATOR()
* |   0f8d94b (m~1) 2015-11-26 Merge pull request #536
|\ \  
| |/  
| * 4c88681 2015-11-26 joint trajectory curves use different colors
|/  
*   3463081 (m~2) 2015-11-24 Merge pull request #535
|\  
| * 0e24726 2015-11-24 use BT_ID_MAX as std::max is not portable
| * e387baf 2015-11-24 add collision and inverse dynamics
* |   a14a695 (m~3) 2015-11-24 Merge pull request
|\ \  
| |/  
| * 4205e97 2015-11-24 another fix for dynamic libs
* |   22e8dc9 (m~4) 2015-11-24 Merge pull request #533
|\ \  
| |/  
| * 5f97a56 2015-11-24 portability issues
* |   af142de (m~5) 2015-11-24 Merge pull request #532

git log中是否可以获得此显示?如何实现此目标?

3个回答

1
如果您使用的是带有“nl”和“sed”命令的计算机,请尝试以下操作:
git log --first-parent --pretty="%s - %ae" -50 |
        nl -v 0 |
        sed 's/\([0-9].*$\)/HEAD~\1/'

以下是针对PHP Git仓库运行时的前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

1
我不知道如何在git日志中使用相对HEAD版本进行修饰。
但是,一旦您在git log --graph中看到要检出的提交,则可以使用其SHA1值作为替代方法。
git checkout af142de # which is m~5

从那里,您可以相对于该SHA1进行其他的结帐:

git checkout af142de~1 # which is m~6

Git用户有没有什么技巧可以在不使用鼠标复制粘贴的情况下输入SHA1?Mercurial提交整数很容易在shell中看到并输入。 - Ashwin Nanjappa
@Ash 不是真的。唯一的诀窍就是你不必输入Sha1的全部42位:只需输入前5到7个字符即可。 - VonC
@AshwinNanjappa 是的,如果你使用tmux,你可以轻松地用键盘复制/粘贴任何控制台输出(使用emacs-mode或vi-mode),而不需要鼠标或任何扭曲手指的快捷键。 - bloody

1

对于可能会发现有用的Bash用户,这里有一个简单的脚本,它显示相对于HEAD提交号在git log中的默认(完整)格式以及支持--graph变体的--oneline格式:

#!/bin/bash

fp="--first-parent"
if [[ "$*" =~ --graph ]]; then
    unset fp  # if --graph is among parameters '${fp:+$fp}' below yields nothing (no --first-parent to git log)
fi

n=0
git log --decorate=short --color=always ${fp:+$fp} "$@" |
while IFS="\n" read line; do
    if [[ "$line" =~ ^(\*.+)?.\[33m(commit|[0-9a-f]{7}) ]]; then
        line="$line HEAD~$n"  # append relative number at the end of line
        ((n+=1))              # increment number by 1
    fi
    echo "$line"   # print (either modified or untouched) line from git log to the output       
done

这个脚本可以放置在例如$HOME目录中,我称之为:logn.sh。保存后(使用chmod +x),可以在~/.gitconfig中声明一个git别名来引用它:

...
[alias]
    logn = "!logn() { ~/logn.sh \"$@\" | less -r; }; logn"

| less -r 是给喜欢在分页器中查看 git log 的用户准备的(-r 用于保留颜色)。这可以被删除。

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

\[33m 是确保我们处理每个提交条目中的标题(提交 SHA)行的技巧,因为 git 通过此颜色指定符提供了该行(因此脚本中使用了 --color=always),而模式的其余部分只是来自同一行的 'commit' 单词或代表 --oneline 格式的直接短 SHA。

如果不使用 --graph,则脚本会强制使用 --first-parent 选项,因为对于非第一个父级提交(来自合并的分支)而言,顺序 HEAD 计数将是不正确的/毫无意义的。

这个别名 ("$@") 和脚本 ("$@") 都将位置参数传递给 git log 命令,因此它可以与其他可能被输入的参数一起使用,例如 -p-<n> (显示提交数),--name-only,提到的 --oneline--graph 等。

如果我们对格式进行过多更改,则正则表达式模式可能会停止匹配,并且相对编号将不会被附加。当然,如果我们传递一个非 HEAD 修订版本以开始 (例如 git logn HEAD^^git logn <non-HEAD-SHA1> 等),相对编号将无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接