我如何查看我所做的任何尚未推送到远程存储库的本地提交?有时,git状态会显示我的分支是在origin/master之前提交的X,但并不总是这样。
这是我安装Git的bug,还是我遗漏了什么?
我如何查看我所做的任何尚未推送到远程存储库的本地提交?有时,git状态会显示我的分支是在origin/master之前提交的X,但并不总是这样。
这是我安装Git的bug,还是我遗漏了什么?
当前回答
这给出了origin/master和HEAD之间所有提交的日志:
git log origin/master..HEAD
当HEAD位于主分支上时,这将提供未推送提交的日志。
同样,要查看差异:
git diff origin/master..HEAD
其他回答
我以前做过一次提交,没有推送到任何分支,也没有远程或本地。只是承诺。其他答案对我没有任何作用,但有:
git reflog
在那里我找到了我的承诺。
显示本地但非上游的所有提交:
git log @{u}..
@{u} 或@{upstream}表示当前分支的上游分支(有关详细信息,请参阅git-rev-parse-help或git-help修订版)。
我认为最典型的方法是运行以下内容:
git cherry --abbrev=7 -v @{upstream}
然而,我个人更喜欢跑步:
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
它显示了所有未在上游合并的分支的提交,加上上游的最后一次提交(它显示为所有其他提交的根节点)。我经常使用它,所以我为它创建了别名noup。
git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
这不是一个bug。您可能看到的是自动合并失败后的git状态,其中从远程获取更改但尚未合并。
要查看本地回购和远程回购之间的提交,请执行以下操作:
git fetch
这是100%安全的,不会模拟您的工作副本。如果有更改,git状态将显示X在原始/主之前提交。
现在,您可以显示远程而非本地的提交日志:
git log HEAD..origin
如果你有git子模块。。。
无论您是使用gitcherry-v还是gitlogs@{u}-p、 不要忘记通过git子模块foreach--递归“gitlogs@{u}..”。
我使用以下bash脚本来检查所有这些:
unpushedCommitsCmd="git log @{u}.."; # Source: https://stackoverflow.com/a/8182309
# check if there are unpushed changes
if [ -n "$($getGitUnpushedCommits)" ]; then # Check Source: https://stackoverflow.com/a/12137501
echo "You have unpushed changes. Push them first!"
$getGitUnpushedCommits;
exit 2
fi
unpushedInSubmodules="git submodule foreach --recursive --quiet ${unpushedCommitsCmd}"; # Source: https://stackoverflow.com/a/24548122
# check if there are unpushed changes in submodules
if [ -n "$($unpushedInSubmodules)" ]; then
echo "You have unpushed changes in submodules. Push them first!"
git submodule foreach --recursive ${unpushedCommitsCmd} # not "--quiet" this time, to display details
exit 2
fi