6

据我所知,提交对象仅包含有关父母的信息,所以如果我遇到这样的情况:

 *  branch-1
 |
 o
 |
 o  master
 |
 o 

这是某种等价于

   *  branch-1
   |
   o
  /
 o  master
 |
 o 

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

 o master
 |
 o *  branch-1
 | |
 o o
 |/
 o
 |
 o 

在分支 1 上,git log --graph --decorate只会显示:

 *  branch-1
 |
 o
 |
 o
 |
 o 

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


PS。我仍在学习英语,但有时我会犯愚蠢的错误。我正在尽我所能,用英语写问题和答案,但是如果你能编辑我的帖子以防出现任何错误,我会非常高兴。我保证,你的努力不会白费。

4

3 回答 3

12

确实,git 不会永久存储这些信息,但无论如何你都可以找到。Git 有 reflogs!

git reflog show <branch>

如果分支是在过去 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

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

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

于 2010-12-19T01:23:18.720 回答
1

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

于 2010-12-18T14:47:38.487 回答
1

我猜你在找

git log --graph --oneline --all

查看此线程以获取更详细的说明。 堆栈溢出答案

于 2014-10-14T14:07:35.417 回答