我有一个看起来像这样的 git 别名:
[alias]
unpushed = log origin..HEAD --pretty=format:'%h %an %s'
当我在主人时,这非常适合显示“未推动”的变化。但是,当我在分支上时,这个别名并不能真正正常工作。
无论我是否在分支上,正确的命令是显示未推送的更改?
如果您只想查看当前分支的传出提交,可以使用以下命令:
git config alias.unpushed "log @{u}.. --pretty=format:'%h %an %s'"
这会导致git log
显示所有可访问的提交,HEAD
不包括可从上游分支访问的提交。该@{u}..
参数等价于@{u}..HEAD
, 并且@{u}
是当前分支的上游提交的简写(例如,origin/foo
如果签出的分支是foo
)。
如果您想查看所有分支的所有未推送提交,请执行以下操作:
git config alias.unpushed "log --all --not --remotes --tags --pretty=format:'%h %an %s'"
以上导致git log
遍历所有引用,但在(排除)远程引用(例如,origin/master
)和标签处停止。Git 不区分本地和远程标签,所以上面假设所有标签都是远程的(这并不总是正确的,所以--tags
有时你可能想省略这个参数)。
我个人使用以下别名来显示未推送的提交:
# unpushed: graph of everything excluding pushed/tag commits
# with boundary commits (see below for 'git g' alias)
git config alias.unpushed '!git g --not --remotes --tags'
# go: _G_raph of _O_utgoing commits with boundary commits
# (see below for 'git gb' alias)
git config alias.go '!git gb @{u}..'
# g: _G_raph of everything with boundary commits
git config alias.g '!git gb --all'
# gb: _G_raph of current _B_ranch (or arguments) with boundary commits
git config alias.gb '!git gbnb --boundary'
# gbnb: _G_raph of current _B_ranch (or arguments) with _N_o _B_oundary commits
git config alias.gbnb 'log --graph --date-order --pretty=tformat:"%C(yellow)%h%Creset %C(magenta)%aE %ai%Creset %C(green bold)%d%Creset%n %s"'
对于简单的存储库,我使用git g
别名作为探索提交的主要方法。对于复杂的存储库(数十个分支),我通常git gb
用来显示特定的分支或提交范围。当我想查看如何git push
更改远程引用(我push.default
的设置为upstream
)时,我使用git go
. 当我想查看本地存储库中是否有任何未推送的内容(例如,查看删除克隆是否会丢失工作)时,我使用git unpushed
.
我使用git-wtf来解决这个问题和其他问题。
这将做到:
git config alias.unpushed "log $(git rev-parse --symbolic-full-name @{u})..HEAD --pretty=format:'%h %an %s'"
它将上游跟踪分支的全名(例如refs/remotes/origin/master
)与 HEAD 进行比较。全名是您平均 git 操作的有效参考规范。
如果您使用fetch
而不是pull
,并且希望在任一分支中提交但不是同时提交,请在命令中使用...
语法而不是..
语法。