不管我在哪个分支上,如何为未推送的提交创建别名?

5

我有一个Git别名,看起来像这样:

[alias]
        unpushed = log origin..HEAD --pretty=format:'%h %an %s'

这个命令在我在主分支上时可以很好地显示“未推送”的更改。但是,在我在一个分支上时,这个别名并不能很好地工作。

无论我是否在一个分支上,正确的命令是什么来显示未推送的更改?


在我的分支上似乎可以正常工作...你那边有什么问题? - Ethan Brown
它可以工作,但它显示了分支与主分支的分歧情况,而不是我本地副本与上游分支的分歧情况,这正是我想要的。 - slacy
3个回答

5

如果您只想查看当前分支的输出提交记录,可以使用以下命令:

git config alias.unpushed "log @{u}.. --pretty=format:'%h %an %s'"

这会导致 git log 显示所有从 HEAD 可达的提交,但不包括可达自上游分支的提交。参数 @{u}.. 等同于 @{u}..HEAD,而 @{u} 是当前分支上游提交的简写(例如,如果检出的分支是 foo,则为 origin/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


1

我使用git-wtf来解决这个和其他问题。


1

这样就可以了:

git config alias.unpushed "log $(git rev-parse --symbolic-full-name @{u})..HEAD --pretty=format:'%h %an %s'"

它将上游跟踪分支的完整名称(例如refs/remotes/origin/master)与HEAD进行比较。完整名称是您平均git操作的有效refspec。

如果您使用fetch而不是pull,并且希望在任一分支中但不是两者都使用提交,则在命令中使用...语法而不是..语法。


可以工作但实际上并不起作用——这会向已检出的树的.gitconfig添加一个别名,但如果我使用“git checkout”切换分支,则该别名仍然指向旧分支。你不能直接在~/.gitconfig中放置"$(git ...)"风格的shell扩展,这正是我想要的。 - slacy
@slacy 哦,我现在看到错误了。已经点赞Richard的答案了。 - Christopher

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