如何获取一个分支的提交历史?
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
分支。这将比较 master
与 HEAD
的位置(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-parent :git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
以上是关于如何获取一个分支的提交历史?的主要内容,如果未能解决你的问题,请参考以下文章