如何在Git中的分支上获取更改


264

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

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 --- HEAD

我想获取包含提交x,y,z的日志。

  • git diff HEAD...branch 给出这些承诺
  • 但是,git log HEAD...branch给出x,y,z,c,d,e。

从我所看到的来看,您出于目的不正确地使用了“ git log”。我在下面添加了我的答案。
PlagueHammer 2012年

Answers:


186

在修订列表的上下文中,A...B是如何git-rev-parse定义它的。git-log获取修订列表。git-diff不包含修订版本列表-包含一个或两个修订版本,并且已定义A...B语法以表示其在手册git-diff页中的定义方式。如果git-diff未明确定义A...B,则该语法无效。请注意,该手册git-rev-parseA...B在“指定范围”部分中进行了描述,并且该部分中的所有内容仅在修订范围有效的情况下(即,当需要修订列表时)才有效。

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


31
哇,真令人困惑。事实证明,使用“ git diff HEAD..branch”显示所有提交(x,y,z,c,d,e),但是“ git log HEAD..branch”完全符合我的要求,并且仅显示x,y ,z!这与使用“ ...”完全相反。
格雷格(Greg Hewgill)

22
git diff HEAD..branch与相同git diff HEAD branch。这里要记住的关键是日志需要列出修订的列表/范围,而diff则不需要。这就是为什么他们对待arg的方式有所不同的原因。
莉莉·巴拉德

4
似乎git diff HEAD...branch(三个点)对应于git log HEAD..branch
jchook

72
git cherry branch [newbranch]

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

我也很喜欢:

git diff --name-status branch [newbranch]

这并不是您要问的,但在相同情况下仍然非常有用。


8
'git cherry'输出一个提交ID列表。我可以将每个提交中的所有更改合并为单个差异吗?
乔纳森·哈特利

1
git cherry确实非常有用。谢谢:)
jkp 2011年

2
@JonathanHartley以提交ID 的第一个最后一个为例,并将它们扔到gif-diff:上git diff x..z,或者以我自己的示例为例git diff 13bc4d..8eda3a
towi

3
很难理解必须在命令中替换哪个代码,因为哪个分支或newbranch是关键字,哪个应该替换为自定义分支名称
pal4life 2014年

37

您要查看的是外发提交列表。您可以使用

git log master..branchName 

要么

git log master..branchName --oneline

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

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

git log branchName..master

1
@ABB,如果省略branchName,则默认为“ head”,在上面的示例中实际上是branchName。
PlagueHammer 2013年

25

这类似于我发布的答案:预览Git推送

将这些功能拖放到您的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
}

16

与Alex V和NDavis之类的几个答案相似,但它们都不尽相同。

当已经在相关分支中时

使用:

git diff master...

结合了以下几个功能:

  • 超级短
  • 显示实际变化

更新:

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


1
如果您已经git co master; git pull创建了分支,git diff master那么用它来获取仅由指定分支中的提交引入的差异将不会有太大用处。
吉瓦尔

1
或明确指定分支:git diff <branch1>...<branch2>将显示引入的更改branch2
亚历克斯(Alex)

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

6

要查看自从master分支以来的当前分支日志:

git log master...

如果您当前在master上,请查看另一个分支的日志,因为它是从master分支出来的:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3点),但有时它显示为“ +”而不是“ =”


3点显示两次在分支上的第一次提交,而两次则没有。
TJ Biddle

2

我发现

git diff <branch_with_changes> <branch_to_compare_to>

更加有用,因为您不仅获得提交消息,而且获得整个差异。如果您已经在分支上,想要查看的更改并且(例如)想要查看对主数据库所做的更改,则可以使用:

git diff HEAD master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.