繁体   English   中英

以编程方式获取git将使用`git checkout -`跳转到的修订版

[英]Programmatically get the revision that git will jump to with `git checkout -`

如果我使用git checkout - ,git将跳回到之前的修订版。 如果它是一个分离的HEAD(在这种情况下HEAD将在同一版本中分离)或一个分支(在这种情况下HEAD将返回到该分支上),则这是真的。

我希望能够知道我刚刚进行的修订,如果我运行它,那么一个git会跳转到理想情况下,而不会实际更改HEAD。

所以如果HEAD是分支的最后一个,我想得到那个分支的名字; 如果不是,我想获得该提交的SHA。

@{-1}对应于感兴趣的修订版。 git-checkout手册页:

您可以使用@{-N}语法来引用使用git checkout操作签出的第N个最后一个分支/提交。 您也可以指定-这与@{-1}同义

(强调我的)

但是,您是否可以恢复上次检出的分支(如果有)的名称对我来说不清楚。 git-reflog手册页提到了这一点

HEAD reflog记录分支切换

但是Git似乎没有提供任何功能来利用这些信息......

如果你的意思是你想要能够读取一些输出,以便你作为用户知道git checkout -会做什么,那么你可以做

git reflog

通常会告诉你正确的事情。 它将显示HEAD reflog,输出类似

c5d4ede HEAD@{0}: checkout: moving from master to branch
38c594f HEAD@{1}: checkout: moving from branch to master
c5d4ede HEAD@{2}: checkout: moving from 
c5d4ede3ffa2633bd7b8b0f19a100832a3b3ac86 to branch
c5d4ede HEAD@{3}: checkout: moving from master to HEAD^
38c594f HEAD@{4}: commit: 2
c5d4ede HEAD@{5}: commit (initial): 1

您可以看到HEAD@{1}是最后检出的,提交的缩写哈希值是38c594f ,并且根据描述,必须检查master

但是有一个小问题。 在这种情况下,输出不会显示自从您在master上以来master是否已移动。 没有很多方法可以实现,但如果你必须确定,并且HEAD reflog显示分支将被检出,那么你会跟进

git reflog master

看看master现在在哪里; 因为git checkout -在这种情况下会检查分支,而不是特定的提交。

(如果HEAD@{1}显示您处于分离状态,则不必担心可能的分支移动,并且您知道chekcout -会将您带到日志中标识的提交。)

如果你想要一些脚本的消费,这是一个更难的问题。 您可以获取您使用的提交ID

git rev-parse HEAD@{1}

但是知道你所在的分支并不那么容易(因为提交可能有零个,一个或多个分支指向它),并且不知道你所在的分支,你不知道分支是否可能已经移动。

看来git能够在执行checkout时解决这个问题,但就“如何”而言,我们已经达到了我的知识边缘。 显而易见的答案是它使用reflog,但我没有在reflog文件中看到任何看起来足够结构化的内容,这是正确的。

对于它的价值,如果改变HEAD的位置不是取消资格,这里是如何做到的。

get_last_head() { 
  local REV; 
  git checkout -q -; 
  REV=$(git symbolic-ref --short -q HEAD) || 
  REV=$(git rev-parse HEAD); 
  git checkout -q -; 
  echo $REV; 
}; 
get_last_head

另一种可能性是使用rev-parse --symbolic-full-name ,虽然这意味着操纵输出以删除最初的refs/head/

get_last_head() {
    local REV=$(
        git rev-parse --symbolic-full-name @{-1} |
        sed -re 's%^refs/heads/%%' # Not sure how safe this is
    );
    if [ -z "$REV" ]; then REV=$(git rev-parse HEAD); fi
    echo $REV;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM