自上一个标签以来获取所有的git提交记录

187

当我要给一个提交打标签时,我需要知道自上次标记提交以来发生了什么变化。例如:

a87a6sdf87a6d4 Some new feature
a87a6sdf87a6d3 Some bug fix
a87a6sdf87a6d2 Some comments added
a87a6sdf87a6d1 Some merge <- v1.4.0
在这个例子中,我想知道最新的三个提交记录,或者能够像上面那样打印日志,显示它们的标签(如果有的话)。当我看到有新功能添加时,我会给它打上v1.5.0的标签。
你应该如何处理这个问题呢?这是我应该如何使用标签吗?在标签信息中应该写些什么?我总是将其留空:git tag -a v1.2.3 -m ''

我知道这是一个旧问题,但你对哪个操作系统感兴趣呢?有人在第一个回答中提到了Windows。你使用Linux吗?也许在问题中明确一下你想要一个与系统无关的解决方案之类的东西会更好。 - Valerio Bozz
4个回答

318
git log <yourlasttag>..HEAD

如果你想要它们像你的示例一样,在同一行上显示提交ID和消息,那么
git log <yourlasttag>..HEAD --oneline

如果你不知道最新的标签或者想要它是动态的,你可以在Linux/git bash/Windows bash上执行以下命令:
git log $(git describe --tags --abbrev=0)..HEAD --oneline

在Windows上:
for /f "delims=" %a in ('git describe --tags --abbrev^=0') do @set latesttag=%a
git log %latesttag%..HEAD --oneline

此外,如果您有一个情况,在该情况中您知道一个标签在历史记录中,并且想要打印从该标签到当前情况的所有内容,您可能还想添加--decorate,这样它将打印出之间的任何标签。

1
Linux版本也可以在Git for Windows Bash上运行。 - kwesolowski
--oneline 应该放在 <yourlasttag>..HEAD 之前。另外,@HEAD 的缩写。使用 $() 可能比使用反引号更好。 - Asclepius
@A-B-B,如果--oneline在前面或后面都没有区别。我更喜欢使用HEAD,即使有简写方式,因为它更容易理解并且更广为人知。 - eis
1
有没有一行简洁的代码可以处理分支上可能没有先前标签的情况?它应该默认输出分支的整个提交历史。 - Jonathan Ellis
4
在PowerShell中,将git log参数放在引号中:git log "$(git describe --tags --abbrev=0)..HEAD" --oneline - Joe Maffei
显示剩余9条评论

67

如果您当前的提交也是一个标签,并且您想动态获取自上一个标签以来的更改,而不知道最新标签或先前标签名称,可以执行以下操作:

git log --oneline $(git describe --tags --abbrev=0 @^)..@

请注意,@HEAD 的缩写。


2
很好!如果只想要提交信息文本的更改,请将--oneline更改为--pretty=format:"%s":git log --pretty=format:"%s" $(git describe --tags --abbrev=0 @^)..@ - JBarbosa

1

你可以使用sed轻松省略合并提交

git log $(git describe --tags --abbrev=0)..@ --oneline | sed '/Merge/d'

请注意,有一个专门的选项可以完成这个任务,它被称为 --no-merges - Valerio Bozz

1
作为对答案的补充,为了省略合并提交,可以使用以下方法:
git log <tag>..HEAD --oneline --no-merges

正如在这个答案中提到的那样


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