278

自分支从当前分支分支以来,获取分支提交日志的最佳方法是什么?到目前为止,我的解决方案是:

git log $(git merge-base HEAD branch)..branch

git-diff的文档表明它git diff A...B等同于git diff $(git-merge-base A B) B. 另一方面,git-rev-parse的文档表明它r1...r2被定义为r1 r2 --not $(git merge-base --all r1 r2).

为什么这些不同?请注意,这git diff HEAD...branch给了我想要的差异,但相应的 git log 命令给了我比我想要的更多的东西。

在图片中,假设:

         x---y---z---分支
        /
---a---b---c---d---e---头

我想获得一个包含提交 x、y、z 的日志。

  • git diff HEAD...branch给出这些提交
  • 但是,git log HEAD...branch给出 x、y、z、c、d、e。
4

10 回答 10

195

在修订列表的上下文中,A...B是如何git-rev-parse定义它的。git-log 需要一个修订列表。git-diff不需要修订列表 - 它需要一个或两个修订,并且已经定义了A...B语法来表示它在git-diff手册页中的定义方式。如果git-diff没有明确定义A...B,那么该语法将是无效的。请注意,git-rev-parse联机帮助页A...B在“指定范围”部分中进行了描述,并且该部分中的所有内容仅在修订范围有效的情况下(即需要修订列表时)有效。

要获取仅包含 x、y 和 z 的日志,请尝试git log HEAD..branch(两个点,而不是三个点)。这与 相同git log branch --not HEAD,表示分支上的所有提交不在 HEAD 上。

于 2008-09-10T07:50:41.173 回答
73
git cherry branch [newbranch]

master当您在分支机构时,完全按照您的要求进行操作。

我也很喜欢:

git diff --name-status branch [newbranch]

这不是您要问的,但在相同的上下文中仍然非常有用。

于 2008-11-07T21:24:08.743 回答
39

你想看到的是传出提交的列表。您可以使用

git log master..branchName 

或者

git log master..branchName --oneline

我假设“branchName”是作为“master”的跟踪分支创建的。

同样,要查看传入的更改,您可以使用:

git log branchName..master
于 2012-11-20T02:37:38.860 回答
25

这类似于我发布的答案:Preview a Git push

将这些函数放入您的 Bash 配置文件中:

  • gbout - git 分支传出
  • gbin - git 分支传入

您可以像这样使用它:

  • 如果在 master 上:gbin branch1 <-- 这将显示 branch1 中的内容而不是 master 中的内容
  • 如果在 master 上:gbout branch1 <-- 这将向您显示 master 中不在分支 1 中的内容

这适用于任何分支。

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
于 2010-05-14T00:41:36.710 回答
20

类似于 Alex V 和 NDavis 等几个答案,但它们都不完全相同。

当已经在相关分支中时

使用:

git diff master...

它结合了几个特点:

  • 超级短
  • 显示实际变化

更新:

这可能应该是git diff master,但这也显示了差异,而不是指定问题的提交。

于 2016-05-09T12:03:54.447 回答
10

在那里输入 -p 以查看一些文件更改

git log -p master..branch

做一些别名:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

查看分支的独特提交:

gbl
于 2013-08-14T20:21:13.690 回答
6

查看从 master 分支后当前分支的日志:

git log master...

如果您当前在 master 上,要查看从 master 分支出来的不同分支的日志:

git log ...other-branch

于 2015-10-12T22:48:17.950 回答
4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) 但有时它显示 '+' 而不是 '='

于 2012-07-27T14:33:39.783 回答
2

我发现

git diff <branch_with_changes> <branch_to_compare_to>

更有用,因为您不仅可以获得提交消息,还可以获得整个差异。如果您已经在想要查看更改的分支上并且(例如)想要查看 master 的更改,您可以使用:

git diff HEAD master
于 2013-10-11T09:53:12.310 回答
0

在 Git 2.30(2021 年第一季度)中,“git diff A...B(man)”学习了“git diff --merge-base AB(man),这是一个更长的简写方式来表达同样的事情。

因此,您可以使用git diff --merge-base <branch> HEAD. 这应该等同于git diff <branch>...HEAD但不会混淆在 diff 中必须使用范围表示法。

于 2020-12-02T23:43:56.593 回答