如何列出未推送的Git提交(本地但不在远程仓库)
技术背景
在使用Git进行代码管理时,我们经常会在本地仓库进行多次提交,然后再将这些提交推送到远程仓库。有时候,我们需要查看哪些提交还没有被推送到远程仓库,以便及时同步代码。
实现步骤
查看当前分支未推送的提交
- 使用
git log origin/master..HEAD
命令可以查看 origin/master
与 HEAD
之间的所有提交日志。当 HEAD
在 master
分支上时,此命令会列出未推送的提交。
1
| git log origin/master..HEAD
|
- 使用
git diff origin/master..HEAD
命令可以查看 origin/master
与 HEAD
之间的差异。
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}
表示当前分支的上游分支。
查看未推送提交的另一种方式
- 使用
git cherry -v
命令可以列出本地未推送的提交历史及相应的消息。
Git 2.5+ 的快捷方式
从 Git 2.5+ 开始,引入了新的快捷方式 <branch>@{push}
。
- 使用
git log @{push}..
命令可以查看尚未推送的提交。
- 使用
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
| alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline
|
使用图形化工具查看未推送提交
可以使用 gitk
工具来查看未推送的提交。
查看本地分支是否超前
使用 git branch -v
命令可以查看每个本地分支是否超前。
获取已提交但未推送的文件列表
可以创建一个别名来获取已提交但未推送的文件列表。
1
| 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}^..
命令可以查看所有分支未合并到上游的提交,以及上游的最后一个提交。
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
|
使用命令:
列出所有分支的未推送提交
使用 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 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
|