如何获取一个分支的提交历史?

Posted

技术标签:

【中文标题】如何获取一个分支的提交历史?【英文标题】:How to get commit history for just one branch? 【发布时间】:2013-06-03 04:14:08 【问题描述】:

假设我从master 创建了一个新分支my_experiment,并多次提交到my_experiment。如果我在my_experiment 上执行git log,我会看到对该分支的提交,以及在创建my_experiments 分支之前对master 的提交。

我会发现查看所有提交到 my_experiments 分支的历史记录非常有用,直到它创建该分支 - 实际上是该分支的真实历史。否则,在查看日志时,我不清楚提交是否在 my_experiments 分支上。

有没有办法用 Git 做到这一点?

【问题讨论】:

【参考方案1】:

我认为适合您的选项是git log --oneline --decorate。这可以让您了解已检查的提交,以及您在故事情节中拥有的每个分支的顶部提交。通过这样做,您可以很好地了解 repo 的结构以及与特定分支关联的提交。我认为阅读this 可能会有所帮助。

【讨论】:

【参考方案2】:

我知道这个已经很晚了...但是这里有一个(不那么简单的)oneliner 可以得到你想要的东西:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk ' printf $2 ')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
我们使用git show-branch 列出带有分支名称和与实际分支状态的相对位置的提交(将警告发送到/dev/null)。 然后我们只保留那些带有我们分支名称的括号内的grep -E "\[$BRANCH_NAME"。 实际的$BRANCH_NAME 是通过git branch | grep -E '^\*' | awk ' printf $2 ' 获得的(带有星号的分支,没有星号的回声)。 根据我们的结果,我们删除了以 tail -n+2 开头的冗余行。 然后,我们通过删除 [$BRANCH_NAME]sed -E "s/^[^\[]*?\[/[/" 之前的所有内容来清理输出。

【讨论】:

如果分支已经被合并到master,这不起作用。它只将历史报告回合并点,而不是一路回溯到分支的创建。我相信不可能回到最近的合并点之外,因为 reflog 可以被 gc'd。 好吧,您可以随时使用来自Jan Engelhardt 的amazing perl script。我经常将它与--all --reverse 参数一起使用...【参考方案3】:

您只能使用git log --oneline

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。【参考方案4】:

您可以使用range 来执行此操作。

git log master..

如果您已签出您的 my_experiment 分支。这将比较 masterHEAD 的位置(my_experiment 的尖端)。

【讨论】:

好的,说得太早了。这就是我的简单示例。但是现在我正在查看其他人的真实仓库,我突然想到,为了正确使用这个命令,我需要知道我当前的分支是从哪个分支创建的。也许我应该能够从 gitk 中看出这一点,但这对我来说并不明显。有什么想法吗? @Marplesoft 弄清楚这一点可能很复杂。见this question。 您能简单解释一下它是如何工作的吗? git log master.. 告诉 Git 什么? @tonix 请点击答案中的链接以获取有关 range 工作原理(master..)部分的更多信息。 如果您当前的分支是从开发创建的,请使用 git log develop.. ;如果它是从 main 创建的,则使用 git log main..,依此类推。【参考方案5】:

注意:如果您将该日志限制为最后 n 次提交(例如,最后 3 次提交,git log -3),请确保在“n”和您的分支之间放置一个空格:

git log -3 master..

在 Git 2.1(2014 年 8 月)之前,这个错误:git log -3master.. 实际上会显示当前分支的最后 3 次提交(此处为 my_experiment),而忽略了 master 限制(意味着如果 my_experiment 仅包含1 个提交,3 个仍会列出,其中 2 个来自 master)

见commit e3fa568Junio C Hamano (gitster):

修订:更仔细地解析“git log -<count>

这个输入错误的命令行简单地忽略了“master”并最终显示了来自当前HEAD的两个提交:

$ git log -2master

因为我们将“2master”提供给atoi(),而没有确保将整个字符串解析为整数。

请改用 strtol_i() 辅助函数。

【讨论】:

【参考方案6】:

git merge-base 命令可用于查找共同祖先。因此,如果 my_experiment 尚未合并到 master 并且 my_experiment 是从 master 创建的,您可以:

git log --oneline `git merge-base my_experiment master`..my_experiment

【讨论】:

如果你想包含你的第一个提交的父级,添加 ^--first-parentgit log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent

以上是关于如何获取一个分支的提交历史?的主要内容,如果未能解决你的问题,请参考以下文章

创建分支时如何获取提交[重复]

如何使用 JGit 找到提交的分支?

如何使用git获取指定tag的代码

如何将我的 git 分支恢复到指定的提交?

如何获取按最近提交排序的 Git 分支列表?

pygithub如何获取特定分支的最新提交