例如,如果在git上有4个分支:
branch1
branch2* (current branch)
branch3 (newest commits here)
master (oldest)
我的问题是:
如何从git命令行检查我当前的分支是否是最新的权限?如果没有,哪个分支是最新的?我的意思是哪个分支包含最新的提交?
如何在没有切换当前分支的情况下列出比我的分支更新的git存储库(在任何分支中)中的所有提交?
答案 0 :(得分:5)
修改:您可以在我的GitHub repo找到相关的shell脚本。
[...]哪个分支是最新的?我的意思是哪个分支包含最新的提交?
我将此解释为
在所有本地分支机构中,找到最近的分支(在某种意义上,例如在提交者日期方面)。
git for-each-ref
为此付出了代价;这个瑞士军刀指挥非常值得通过其man page。
让我们逐步构建我们需要的命令......
第一个命令打印所有本地分支的(短)名称列表。
git for-each-ref --format='%(refname:short)' \
refs/heads
下一个命令执行相同的操作,但按提交日期按降序对结果进行排序(请注意-
):
git for-each-ref --sort='-committerdate' \
--format='%(refname:short)' \
refs/heads
下一个命令与前一个命令相同,但将输出限制为只有一个条目:
git for-each-ref --count=1 \
--sort='-committerdate' \
--format='%(refname:short)' \
refs/heads
总之,我们现在有一个命令可以打印最近(在提交者日期方面)分支引用的(简短)名称:正是我们想要的。太好了!
为方便起见,让我们根据它定义一个别名(下面称为newest-branch
):
git config --global alias.newest-branch "for-each-ref --count=1 --sort='-committerdate' --format='%(refname:short)' refs/heads"
现在,让我们在Git-project repo中运行一些测试:
$ git branch
maint
* master
next
pu
$ git newest-branch
pu
# Now print the list of all branches and the committer date of their tips
$ git for-each-ref --sort='-committerdate' \
--format="%(refname:short)%09%(committerdate)"
refs/heads
pu Tue Mar 17 16:26:47 2015 -0700
next Tue Mar 17 16:14:11 2015 -0700
master Tue Mar 17 16:05:12 2015 -0700
maint Fri Mar 13 22:57:25 2015 -0700
pu
确实是最近的分支。耶!
这很容易,因为我们有newest-branch
别名;我们所要做的就是将当前分支的名称与最新分支的名称进行比较。 (为了更加健壮,您可能希望使用完整的refname而不是short。)
当前分支的(简短)名称由
给出$ git symbolic-ref --short HEAD
master
让我们将其与最新分支进行比较,然后如果当前分支是最新分支则打印yes
,否则打印no
。
if [ $(git newest-branch) = $(git symbolic-ref --short HEAD) ]; then
printf "yes\n"
else
printf "no\n"
fi
大!为方便起见,我们也为此定义一个别名(下面称为isnewest
):
git config --global alias.isnewest '! if [ $(git newest-branch) = $(git rev-parse --abbrev-ref HEAD) ]; then printf "yes\n"; else printf "no\n"; fi'
(我们已经知道,从之前的健全性检查中,pu
是最新的分支。)
$ git branch
maint
* master
next
pu
$ git isnewest
no
$ git checkout pu
Switched to branch 'pu'
Your branch is up-to-date with 'origin/pu'.
$ git isnewest
yes
$ git checkout maint
Switched to branch 'maint'
Your branch is up-to-date with 'origin/maint'.
$ git is-newest-branch
no
似乎工作(•_•)
( •_•)>⌐■-■
(⌐■_■)
如何在没有切换当前分支的情况下列出这个比我的分支更新的git存储库(在任何分支中)的所有提交?
如果你的意思是某个日期更新,这是一个难题。在最糟糕的情况下,你必须探索整个DAG,因为Git并不禁止父母拥有比他们的孩子更近的日期。如果你的意思是拓扑顺序,那就更容易了:
git log --branches HEAD..
(--branches
标志将输出限制为至少可以从refs/heads
之一到达的提交。)当然,您可以通过添加{{{}这样的装饰标志来调整该命令的输出。 {1}},--oneline
等
答案 1 :(得分:3)
您可以使用:
git log --decorate --all --oneline --graph
来自:man git log
--decorate
:打印出所有提交的引用名称。--all
:假设refs /中的所有引用都在命令行中列为<commit>
。--oneline
:这是--pretty=oneline --abbrev-commit
一起使用的简写。--graph
:在输出的左侧绘制提交历史的基于文本的图形表示。如果要从远程存储库下载最新对象和引用,请先执行git fetch
:
git fetch origin
另外,命令:
gitk
可以帮助您在简单的图形界面中查看所有提交和引用。