是否有用于引用分支历史记录中提交之后的提交的语法?
Is there a syntax for referring to the commit which followed a commit in branch history?
如果我有一个特定的散列,将其命名为 A
,我可以通过 A^
找到父级。但是有没有办法到达分支历史中 A
之后的提交?像 A+1
这样的东西 A
是 (A+1)^
?我想在我有哈希的那个之后检查提交,然后再检查那个之后的提交,依此类推,以检查它们。但他们真的被埋葬了。除了搜索 git 日志输出之外,还有什么简单的方法可以在给定参考散列的情况下检查它们?
没有内置命令来查找两次提交之间的线性路径;你将不得不为此编写一个外部脚本。
这是一个用 perl 编写的示例(来自 ):
# in file 'git-path.pl' :
#!/usr/bin/perl
use strict;
use warnings;
# This script implements a breadth first search, starting from $target,
# following the 'child -> parent' links, until $source is found or the
# complete history of $target is traversed.
my $source = $ARGV[0];
my $target = $ARGV[1];
my $srcsha = `git rev-parse -q --verify "$source"` || die "'$source' is not a valid source";
chomp($srcsha);
my $tgtsha = `git rev-parse -q --verify "$target"` || die "'$target' is not a valid target";
chomp($tgtsha);
# %seen stores the commits seen so far, linked to the child we are interested in
my %seen = ();
$seen{$tgtsha} = "";
# @stack lists the commits to visit
my @stack = ();
push @stack, $tgtsha;
# print_path : print the path from '$target' down to '$source'
sub print_path {
my ($source) = @_;
my @path = ();
my $sha = $source;
while ($sha) {
unshift @path, $sha;
$sha = $seen{$sha};
}
print "$_\n" for @path;
}
# main body :
# as long as there is something to scan, go for it,
# if $source is found along the way, print the path and exit with success
# otherwise, end the loop, and exit with failure
while( scalar(@stack) > 0 ) {
my $sha = shift @stack;
# extract parent lines from 'git cat-file -p commit'
my @parents = `git cat-file -p $sha | grep '^parent ' | cut -c8-`;
foreach my $p (@parents) {
chomp($p);
# for each parent, if not seen yet :
# * store it as a parent of $p
# * put it on the list of commits to explore next
if (!$seen{$p}) {
$seen{$p} = $sha;
push @stack, $p;
if ($p eq $srcsha) {
# if we reached the 'source' commit : stop here
print_path $p;
exit 0;
}
}
}
}
# no path found
exit 1;
示例用法:
$ perl git-path.pl A B
175015a5a00bbb9ad2ee4de23254ace4dbc645eb # commit B
bc03512e6082badab86a00cd320d89339741bb7b
077f584c10852cbadeef6c48886fd600cab61aa6
cec6734db31a1053b1b71674671512e1fe1592b1
b1dd3c71e42ca421f306640d4f0fdc69a00aa2c7
778a504c718f30d0dc2c72a30c885f10847f46a8 # commit A
I want to check out the commit after the one I have the hash for, and then the one after that, and so on, to inspect them
git rev-list --first-parent --reverse $thathash..mybranch
将按顺序列出您要签出的所有提交。如果您不仅想要线性历史记录,而且所有提交都来自分支提示历史记录中的该哈希,请将 --first-parent
替换为 --ancestry-path
并且您可以使用排序选项来决定访问它们的顺序。
如果我有一个特定的散列,将其命名为 A
,我可以通过 A^
找到父级。但是有没有办法到达分支历史中 A
之后的提交?像 A+1
这样的东西 A
是 (A+1)^
?我想在我有哈希的那个之后检查提交,然后再检查那个之后的提交,依此类推,以检查它们。但他们真的被埋葬了。除了搜索 git 日志输出之外,还有什么简单的方法可以在给定参考散列的情况下检查它们?
没有内置命令来查找两次提交之间的线性路径;你将不得不为此编写一个外部脚本。
这是一个用 perl 编写的示例(来自
# in file 'git-path.pl' :
#!/usr/bin/perl
use strict;
use warnings;
# This script implements a breadth first search, starting from $target,
# following the 'child -> parent' links, until $source is found or the
# complete history of $target is traversed.
my $source = $ARGV[0];
my $target = $ARGV[1];
my $srcsha = `git rev-parse -q --verify "$source"` || die "'$source' is not a valid source";
chomp($srcsha);
my $tgtsha = `git rev-parse -q --verify "$target"` || die "'$target' is not a valid target";
chomp($tgtsha);
# %seen stores the commits seen so far, linked to the child we are interested in
my %seen = ();
$seen{$tgtsha} = "";
# @stack lists the commits to visit
my @stack = ();
push @stack, $tgtsha;
# print_path : print the path from '$target' down to '$source'
sub print_path {
my ($source) = @_;
my @path = ();
my $sha = $source;
while ($sha) {
unshift @path, $sha;
$sha = $seen{$sha};
}
print "$_\n" for @path;
}
# main body :
# as long as there is something to scan, go for it,
# if $source is found along the way, print the path and exit with success
# otherwise, end the loop, and exit with failure
while( scalar(@stack) > 0 ) {
my $sha = shift @stack;
# extract parent lines from 'git cat-file -p commit'
my @parents = `git cat-file -p $sha | grep '^parent ' | cut -c8-`;
foreach my $p (@parents) {
chomp($p);
# for each parent, if not seen yet :
# * store it as a parent of $p
# * put it on the list of commits to explore next
if (!$seen{$p}) {
$seen{$p} = $sha;
push @stack, $p;
if ($p eq $srcsha) {
# if we reached the 'source' commit : stop here
print_path $p;
exit 0;
}
}
}
}
# no path found
exit 1;
示例用法:
$ perl git-path.pl A B
175015a5a00bbb9ad2ee4de23254ace4dbc645eb # commit B
bc03512e6082badab86a00cd320d89339741bb7b
077f584c10852cbadeef6c48886fd600cab61aa6
cec6734db31a1053b1b71674671512e1fe1592b1
b1dd3c71e42ca421f306640d4f0fdc69a00aa2c7
778a504c718f30d0dc2c72a30c885f10847f46a8 # commit A
I want to check out the commit after the one I have the hash for, and then the one after that, and so on, to inspect them
git rev-list --first-parent --reverse $thathash..mybranch
将按顺序列出您要签出的所有提交。如果您不仅想要线性历史记录,而且所有提交都来自分支提示历史记录中的该哈希,请将 --first-parent
替换为 --ancestry-path
并且您可以使用排序选项来决定访问它们的顺序。