使用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