据我所知,commit对象只包含有关父母的信息,所以如果我遇到类似这样的情况:
* 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。 我还在学英语,但有时候我犯的是愚蠢的错误。我正在尽我所能,用英语写问题和答案,但如果你在任何错误的情况下编辑我的帖子,我会很高兴。我保证,你的努力不会浪费。
答案 0 :(得分:11)
确实git不会永久存储这些信息,但无论如何你都可能会发现。 Git有reflogs!
git reflog show <branch>
如果分支是在过去90天内创建的(默认情况下;使用gc.reflogExpire
来更改此分支),该reflog中的最后一行将是分支的创建。
我在这里假设您想知道的是创建分支的提交,而不是它分支的分支。这很难找到 lot - 我最好的猜测是,对于每个分支,在创建目标分支时占据其位置,并查看它是否包含目标分支的起点
这里的故事的寓意是你应该采用一个工作流程,你知道你从哪个分支分支你的分支。可能会在主分支上的某个稳定点开始新功能和错误修正,并且可以将子主题分支命名为<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 --branches
或git log --graph --branches [--oneline]
来看一张漂亮的照片。
答案 1 :(得分:1)
Git实际上没有这个概念,如果你想添加它,你需要添加一个启发式,因为所有git真正关心的是将标签附加到树中的给定提交。
答案 2 :(得分:1)