【问题标题】: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 做到这一点?

【问题讨论】:

    标签: git git-log


    【解决方案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 Engelhardtamazing 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
        猜你喜欢
        • 2022-07-06
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 2017-09-11
        • 2015-04-17
        • 2014-11-01
        相关资源
        最近更新 更多