如何快速查看哪个 Git 分支是最新的?

How can I quickly check which Git branch is the newest?

例如,如果 git 上有 4 个分支,如下所示:

branch1
branch2* (current branch)
branch3 (newest commits here)
master (oldest)

我的问题是:

您可以使用:

git log --decorate --all --oneline --graph

来自:人git日志

  • --decorate:打印出显示的任何提交的引用名称。
  • --all:假装 refs/ 中的所有引用都在命令行中列为 <commit>.
  • --oneline: 这是shorthand for --pretty=oneline --abbrev-commit一起使用的。
  • --graph:在输出的左侧绘制提交历史的基于文本的图形表示。

如果你想从远程仓库下载最新的对象和引用,之前执行git fetch:

git fetch origin

另外,命令:

gitk

可以帮助您在一个简单的图形界面中查看所有提交和引用。

编辑:你会在我的GitHub repo中找到相关的shell脚本。

哪个分支是最新的?

[...] which branch is the most up-to-date? I mean which branch contains the latest commits?

我解读为

Of all the local branches, find the one whose tip is the most recent (in some sense, e.g. in terms of committer date).

git for-each-ref 派上用场了;这个 Swiss-Army-knife 命令非常值得花时间浏览它的 man page.

命令

让我们逐步构建我们需要的命令...

  1. 第一个命令打印所有本地分支的(短)名称列表。

    git for-each-ref --format='%(refname:short)' \
                     refs/heads
    
  2. 下一个命令做同样的事情,但按提交者日期降序排列结果(注意 -):

    git for-each-ref --sort='-committerdate'     \
                     --format='%(refname:short)' \
                     refs/heads
    
  3. 下一个命令与上一个命令的作用相同,但将输出限制为仅一个条目:

    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 别名;我们所要做的就是将当前分支的名称与最新分支的名称进行比较。 (为了更稳健,您可能希望使用完整的引用名称而不是短引用名称)。

命令

当前分支的(短)名称由

给出
$ 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

似乎有效 (•_•) ( •_•)>⌐■-■ (⌐■_■)


How can I list all the commits in this git repository (in any branches) which are newer than my branch without switching away from the current branch?

如果你指的是某个日期的更新,那是个难题。在最坏的情况下,您必须探索整个 DAG,因为 Git 并不禁止 parents 拥有比 children 更近的日期。如果你的意思是拓扑顺序,那就简单多了:

git log --branches HEAD..

--branches 标志将输出限制为至少可从 refs/heads 之一访问的提交。)当然,您可以通过添加此类修饰标志来调整该命令的输出如 --oneline--decorate