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

186
假设我从主分支master创建了一个新的分支my_experiment,并对my_experiment进行了几次提交。如果我在my_experiment上执行git log命令,我将看到该分支的提交记录以及在创建my_experiments分支之前对master分支进行的提交记录。
我希望能够查看所有提交记录直到创建该分支为止的my_experiments分支的历史记录 - 实际上只是该分支的真实历史记录。否则,在查看日志时,我无法确定提交是否属于my_experiments分支。
在Git中,有没有一种方法可以做到这一点?
7个回答

222
你可以使用范围来实现这一点。
git log master..
如果您已经查看了您的my_experiment分支。这将比较master的位置与HEAD(即my_experiment的末端)。

3
好的,我说得太早了。这对于我的简单示例来说足够了。但现在我正在查看别人的真实存储库,我意识到为了正确使用此命令,我需要知道我的当前分支是从哪个分支创建的。也许我应该能够从gitk中知道这一点,但对我来说并不明显。有什么想法吗? - Marplesoft
@Marplesoft 这可能很复杂,可以参考这个问题 - alex
1
你能简要解释一下它是如何工作的吗?git log master.. 告诉 Git 什么? - tonix
2
@ tonix请点击答案中的链接了解有关range如何工作(master..)的更多信息。 - alex
如果您的当前分支是从develop创建的,请使用git log develop..;如果它是从main创建的,请使用git log main..,以此类推。 - kotchwane

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

在 Git 2.1 之前(2014年8月),这个错误:git log -3master.. 实际上会显示当前分支(这里是 my_experiment)最后的 3 次提交,忽略了 master 的限制(也就是说如果 my_experiment 只包含一个提交,则仍将列出 3 次提交中的 2 次来自于 master)。

参见 Junio C Hamano (gitster) 的提交 e3fa568

revision: parse "git log -<count>" more carefully

这个输错的命令行简单地忽略了 "master",最终显示了来自当前 HEAD 的两次提交:

$ git log -2master
因为我们将"2master"传递给atoi()函数时未确保整个字符串被解析为整数。 应该使用strtol_i()辅助函数代替。

最后一个命令显示“致命错误: '2master': 不是非负整数”,所以我认为没有必要再提它了。 - Bersan
@Bersan 我提到这个是因为在 Git 2.1 之前的版本中是这样的情况。 - VonC

10

git merge-base 命令可用于查找公共祖先。因此,如果我的实验尚未合并到主分支,并且我的实验是从主分支创建的,则可以执行以下操作:

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` - Eric Lavoie
快速说明:除非有太多的提交并且您想要在输出中压缩总行数,否则您实际上不需要 --oneline - Tapa Dipti Sitaula

3

我认为一个适合你的选择是git log --oneline --decorate。这让你知道了检查的提交,以及您故事线中每个分支的顶部提交。通过这样做,您可以很好地查看您的存储库结构和与特定分支关联的提交。我认为阅读这篇文章可能会有所帮助。


3
你可以只使用 git log --oneline 命令来查看最初的回答。

2
尽管这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加背景信息将有助于提高答案的长期价值。 - undetected Selenium

0

我知道这个有点晚了...但是这里有一个(不是很简单的)一行代码可以得到你想要的结果:

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删除开头多余的行。
  • 最后,我们使用sed -E "s/^[^\[]*?\[/[/"删除[$BRANCH_NAME]之前的所有内容,以清理输出。

如果分支已合并到主分支,则此方法无效。它仅向后报告历史记录到合并点,而不是一直返回到分支创建时。我认为在最接近的合并点之前无法返回,因为引用日志可能会被垃圾回收。 - user98761
好的,你总可以使用Jan Engelhardt的这个神奇的Perl脚本。我经常使用它配合--all --reverse参数... - MensSana

0

您可以使用此命令查看分支日志:

命令结构:

git log <branch_name>

示例: 如果您的分支名称为develop,则您的命令应该是这样的...

git log develop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接