如何在合并前找到最后一个git提交



使用git从工作分支合并到主分支后,有时我想查找合并发生前在主分支上的最后一次提交。我该怎么做?

发生合并后确定提交的快速方法是使用reflog。

假设上次发生的操作是合并,则:

git log HEAD@{1} -1

HEAD@{1}是指上一次操作之前的前一个HEAD,因此可以使用log和reflog对其进行寻址。

git log将向您显示当前分支中的提交序列,所以在合并之后,它总是一个合并提交,而就在它之前,它将从合并的分支进行提交。git reflog显示了存储库中的操作序列(例如合并、重基础)。如文件所述:

引用日志或"reflogs"记录分支和其他引用的提示何时在本地存储库中更新。反射在各种Git命令中都很有用,用来指定引用的旧值。

一个快速的方法是键入

git log --pretty=format:'%h : %s' --graph

然后沿着右边的图往下走,直到找到合并点。你也可以做

git log --pretty=format:'%h : %s' --graph > temp.txt

它将输出放入一个文件temp.txt中,您可以在编辑器中打开该文件,并使用搜索工具来查找类似merge的文本。

这种方法对于回答关于最近提交的沿袭的许多其他问题很有用,所以请将

alias git_graph="git log --pretty=format:'%h : %s' --graph"

在我的.bash_profile文件中,这样我就可以使用``git_log`来查看这些信息。

如果您已经将branch合并到master中,这里有一种方法可以找到合并提交:

#   With the ancestry-path option, 'git rev-list branch..master' (or git log)
#   will only list commits which are parents of 'master'
#   *and* children of 'branch'
#
#   If 'branch' was merged into 'master', the last commit in this list
#   is the merge commit :
$ git rev-list --ancestry-path branch..master | tail -1

合并前master的状态是此提交的第一个父级:

$ h=`git rev-list --ancestry-path branch..master | tail -1`
$ git log $h^

这里有一个编程解决方案。我们查询以下内容以获得合并发生前上一次主提交的哈希:

git merge-base master master~1

如果最后一个PR是合并,则master~1属于PR。由于PR的结构,merge-base获得公共祖先的SHA,该SHA将是上一个主提交。

如果最后一个PR是壁球,那么master~1在master上,这就是我们想要的。由于master~1这次是master的父提交,git merge-base master master~1得到了公共祖先,因此正确地返回了master~1的SHA。

有了SHA,我们可以用git log等获得提交的其他细节

注意,如果有许多PR合并而没有首先重新基础到最新的主,这可能不会给我们最后一次主提交。然而,这与OP想要的一致,即合并前的最后一次主提交。

只获取合并点提交id:

git rev-list origin..HEAD --max-parents=1 --max-count=1

git log -1

另请参阅git log --help或https://git-scm.com/docs/git-log

虽然您已经选择了一个答案(并且可能在提出这个问题后的5年里对git更加熟悉),但我想我应该添加一个尚未出现的答案。

如果只是合并,快速而肮脏的方法是git show,答案将是Merge: abcdefg 1234567中的第一个(abcdefg)值。

查找当前头的父级的规范方法是git rev-parse HEAD^(^=^1,第一个父级),当前头是合并的分支的子级。例如,如果您是git checkout master,然后是git merge other-branch,那么git rev-parse HEAD^将是master的前一个HEAD。(其中git rev-parse HEAD^git show HEAD^git log HEAD^ -1在使用上下文HEAD^时是等效的)。

这是可以扩展的~也就是说,如果你只想查看主分支的历史,逻辑扩展是HEAD^HEAD^^HEAD^^^。。。,这可以通过将--first-parent添加到git log中来实现~所以如果你只是想查看master的前一个HEAD的顺序,那么你可以

git log master --oneline --first-parent --pretty=format:'%H : %s'

我个人觉得这些作为别名很有用

alias mainline="git log master --oneline --first-parent --pretty=format:'%H : %T'"
alias maindiff="git diff $(git rev-parse master^1)..$(git rev-parse master) --stat"

如果您知道合并提交的顺序,您可以使用以下命令:

$ git log -n 1 --pretty | grep Merge | head -1 | awk '{print $2}'

https://git-scm.com/docs/git-log

如果提交是合并,并且漂亮的格式不是单行、电子邮件或原始格式,则在Author:行之前插入一行。这一行以"Merge:"开头,并打印祖先提交的sha1,用空格分隔。

我也在研究这个问题,下面是我的想法:

git log --merges -1 --format='%p' | awk '{print $2}'

说明:

  • --merges–仅显示合并提交(具有2的最小父级的提交)
  • -1–仅显示最后一条日志行
  • --format='%p'–显示缩写的父提交哈希

合并到当前分支的最后一次提交SHA:

git rev-list HEAD^1..HEAD --max-parents=1 --max-count=1

最新更新