如何获取分支开始的信息?

noi*_*isy 6 git branch git-branch

据我所知,commit对象只包含有关父母的信息,所以如果我遇到类似这样的情况:

 *  branch-1
 |
 o
 |
 o  master
 |
 o 
Run Code Online (Sandbox Code Playgroud)

这是某种等价的

   *  branch-1
   |
   o
  /
 o  master
 |
 o 
Run Code Online (Sandbox Code Playgroud)

但如果我的主人会前进呢?

 o master
 |
 o *  branch-1
 | |
 o o
 |/
 o
 |
 o 
Run Code Online (Sandbox Code Playgroud)

在分支-1上,git log --graph --decorate只会告诉我:

 *  branch-1
 |
 o
 |
 o
 |
 o 
Run Code Online (Sandbox Code Playgroud)

如果我知道我从哪个分支开始,我可以打电话git merge-base master branch-1,但如果我不知道我从哪个分支开始怎么办?


PS.我还在学英语,但有时候我犯的是愚蠢的错误.我正在尽我所能,用英语写问题和答案,但如果你在任何错误的情况下编辑我的帖子,我会很高兴.我保证,你的努力不会浪费.

Cas*_*bel 12

确实,git不会永久存储这些信息,但无论如何你都可能会发现.Git有reflogs!

git reflog show <branch>
Run Code Online (Sandbox Code Playgroud)

如果分支是在过去90天内创建的(默认情况下;用于gc.reflogExpire更改此分支),则该reflog中的最后一行将是分支的创建.

我在这里假设你想要知道的是创建分支的提交,而不是它分支的分支.这会是一个很大很难找到-我最好的猜测将是,每个分支,采取其位置在目标分支的创建时间,看看它是否包含目标分支的起点.

这里的故事的寓意是你应该采用一个工作流程,你知道你从哪个分支分支你的分支.可能会在主分支上的某个稳定点开始新功能和错误修正,并且可以将子主题分支命名<topic>-<subtopic>为提醒.

编辑:

好的,所以让我们说你知道一个提交和一个时间(在这种情况下,提交和创建分支的时间).您正在寻找当时提交的分支.

git for-each-ref --format='%(refname)' refs/heads/* | while read b; do
    if [ "$(git rev-parse $b@{$date_time})" = "$target_commit" ]; then
        echo "branch $b contained commit $target_commit at $date_time"
    fi
done
Run Code Online (Sandbox Code Playgroud)

我认为这应该作为一个bash脚本/单行.想法:对于每个分支,在给定的日期和时间采取其位置,并查看它是否是目标提交.如果您想要更灵活,可以测试是否$(git merge-base $(git-rev-parse $b@{$date_time}))是目标提交; 也就是说,目标提交是否是当时给定分支的祖先.

当然,如果您的历史相对干净,您可以随时使用gitk --branchesgit log --graph --branches [--oneline]只看到漂亮的图片.


Ara*_*ion 1

Git 并没有真正的概念,如果你想添加这个,你需要添加一个启发式,因为 git 真正关心的是为树中的给定提交附加一个标签。