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

标签 git branch git-branch

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

 *  branch-1
 |
 o
 |
 o  master
 |
 o 

这相当于

   *  branch-1
   |
   o
  /
 o  master
 |
 o 

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

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

在 branch-1 上,git log --graph --decorate 将只显示我:

 *  branch-1
 |
 o
 |
 o
 |
 o 

如果我知道我是从哪个分支开始的,我可以调用 git merge-base master branch-1,但是如果我不知道我是从哪个分支开始的呢?


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

最佳答案

的确,git 不会永久存储这些信息,但您还是可以找到的。 Git 有 reflogs!

git reflog show <branch>

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

我在这里假设您想知道的是创建分支的提交,而不是它从哪个分支 fork 出来的。这将是一个很多更难找到的 - 我最好的猜测是,对于每个分支,在创建目标分支时占据它的位置,并查看它是否包括目标分支的起点.

这个故事的寓意是,您应该采用一种工作流程,在该工作流程中您知道您从哪个分支 fork 了您的分支。新功能和错误修复可能会从主分支上的某个稳定点开始,子主题分支可以命名为 <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]只是为了看一张漂亮的照片。

关于git - 如何获取分支开始的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4477765/

相关文章:

git - 如何使用 git 查看所有文件自初始创建以来的更改?

git svn 和 rebase 分支 rebase master

git - 如何将我的项目导出为 git 存储库的 .zip 文件?

database - 使用 git/gerrit 迭代数据库迁移

git - 为什么 git pull origin master 不起作用,而 git pull 却起作用?

git - `git branch --list` 返回文件?

git - 如何对一系列提交进行 git rebase -i?

git - git push.default=current 和 push.default=upstream 有什么区别?

git - 如何解决 VSTS 中 pull 请求中的 merge 冲突?