如何列出未推送的Git提交(本地但不在远程仓库)

如何列出未推送的Git提交(本地但不在远程仓库)

技术背景

在使用Git进行代码管理时,我们经常会在本地仓库进行多次提交,然后再将这些提交推送到远程仓库。有时候,我们需要查看哪些提交还没有被推送到远程仓库,以便及时同步代码。

实现步骤

查看当前分支未推送的提交

  • 使用 git log origin/master..HEAD 命令可以查看 origin/masterHEAD 之间的所有提交日志。当 HEADmaster 分支上时,此命令会列出未推送的提交。
1
git log origin/master..HEAD
  • 使用 git diff origin/master..HEAD 命令可以查看 origin/masterHEAD 之间的差异。
1
git diff origin/master..HEAD

查看所有分支未推送的提交

  • 使用 git log --branches --not --remotes 命令可以查看所有分支上尚未推送的提交。
1
git log --branches --not --remotes
  • 使用 git log --branches --not --remotes --simplify-by-decoration --decorate --oneline 命令可以查看每个分支上的最新提交以及分支名称。
1
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

查看当前分支相对于上游分支未推送的提交

  • 使用 git log @{u}.. 命令可以查看本地有但上游没有的所有提交。@{u}@{upstream} 表示当前分支的上游分支。
1
git log @{u}..

查看未推送提交的另一种方式

  • 使用 git cherry -v 命令可以列出本地未推送的提交历史及相应的消息。
1
git cherry -v

Git 2.5+ 的快捷方式

从 Git 2.5+ 开始,引入了新的快捷方式 <branch>@{push}

  • 使用 git log @{push}.. 命令可以查看尚未推送的提交。
1
git log @{push}..
  • 使用 git rebase @{push} 命令可以将提交集成到推送目标分支,而不是上游分支。
1
git rebase @{push}

查看本地分支相对于推送目标分支的超前/落后情况

使用 git for-each-ref --format="%(refname:short) %(push:track)" refs/heads 命令可以查看每个本地分支相对于推送目标分支的超前/落后情况。

1
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads

查找之前未推送的提交

如果之前有一个提交既没有推送到任何分支,也没有推送到远程仓库,可以使用 git reflog 命令查找该提交。

1
git reflog

创建查看当前分支未推送提交的别名

可以创建一个别名来方便查看当前分支的未推送提交。

1
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

使用图形化工具查看未推送提交

可以使用 gitk 工具来查看未推送的提交。

1
gitk

查看本地分支是否超前

使用 git branch -v 命令可以查看每个本地分支是否超前。

1
git branch -v

获取已提交但未推送的文件列表

可以创建一个别名来获取已提交但未推送的文件列表。

1
git config --global alias.unpushed "diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

使用时只需执行:

1
git unpushed

查看所有分支未合并到上游的提交

使用 git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^.. 命令可以查看所有分支未合并到上游的提交,以及上游的最后一个提交。

1
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

可以创建一个别名来方便使用:

1
git config --global alias.noup 'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

查看本地仓库与远程仓库之间的提交

使用 git fetch 命令可以安全地获取远程仓库的更新,然后使用 git log HEAD..origin 命令查看远程有但本地没有的提交。

1
2
git fetch
git log HEAD..origin

使用第三方工具查看未推送提交

可以使用 unpushed 工具来扫描指定工作目录下的所有 Git、Mercurial 和 Subversion 仓库,并显示未提交的文件和未推送的提交列表。
安装命令:

1
$ easy_install --user unpushed

1
$ sudo easy_install unpushed

使用命令:

1
$ unpushed ~/workspace

列出所有分支的未推送提交

使用 git log --branches @{u}.. 命令可以轻松列出所有分支的未推送提交。

1
git log --branches  @{u}..

查看未合并的分支

使用 git branch --all --no-merged 命令可以查看未合并的分支。

1
git branch --all --no-merged

核心代码

以下是一些常用的核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 查看当前分支未推送的提交日志
git log origin/master..HEAD

# 查看当前分支未推送的差异
git diff origin/master..HEAD

# 查看所有分支未推送的提交日志
git log --branches --not --remotes

# 查看当前分支相对于上游分支未推送的提交日志
git log @{u}..

# 查看未推送提交的另一种方式
git cherry -v

# Git 2.5+ 查看尚未推送的提交
git log @{push}..

# 查看本地分支相对于推送目标分支的超前/落后情况
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads

# 查找之前未推送的提交
git reflog

# 创建查看当前分支未推送提交的别名
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

# 获取已提交但未推送的文件列表
git config --global alias.unpushed "diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

# 查看所有分支未合并到上游的提交
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

# 创建查看所有分支未合并到上游提交的别名
git config --global alias.noup 'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

# 查看本地仓库与远程仓库之间的提交
git fetch
git log HEAD..origin

# 列出所有分支的未推送提交
git log --branches @{u}..

# 查看未合并的分支
git branch --all --no-merged

最佳实践

  • 定期查看未推送的提交,及时将本地的更改同步到远程仓库,避免代码丢失或冲突。
  • 使用别名来简化常用命令,提高工作效率。
  • 结合图形化工具(如 gitk)来直观地查看提交历史和差异。

常见问题

为什么 git status 显示有提交未推送,但使用 git log origin/master..HEAD 却没有输出?

可能是因为本地分支的上游分支设置不正确,或者远程仓库的 master 分支已经更新。可以使用 git branch -vv 命令查看本地分支的上游分支设置,并使用 git fetch 命令更新远程仓库信息。

使用 git log @{u}.. 命令时,@{u} 代表什么?

@{u}@{upstream} 表示当前分支的上游分支。可以使用 git rev-parse --abbrev-ref --symbolic-full-name @{u} 命令查看当前分支的上游分支名称。

如何设置本地分支的推送目标分支?

可以使用 git branch --set-upstream-to=<remote>/<branch> 命令来设置本地分支的上游分支和推送目标分支。例如,将本地的 master 分支的推送目标设置为 origin/xxx

1
git branch --set-upstream-to=origin/xxx master

如何列出未推送的Git提交(本地但不在远程仓库)
https://119291.xyz/posts/2025-05-16.how-to-list-unpushed-git-commits/
作者
ww
发布于
2025年5月16日
许可协议