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

时间:2015-03-20 14:40:22

标签: git git-branch

例如,如果在git上有4个分支:

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

我的问题是:

  • 如何从git命令行检查我当前的分支是否是最新的权限?如果没有,哪个分支是最新的?我的意思是哪个分支包含最新的提交?

  • 如何在没有切换当前分支的情况下列出比我的分支更新的git存储库(在任何分支中)中的所有提交?

2 个答案:

答案 0 :(得分:5)

修改:您可以在我的GitHub repo找到相关的shell脚本。

哪个分支是最新的?

  

[...]哪个分支是最新的?我的意思是哪个分支包含最新的提交?

我将此解释为

  

在所有本地分支机构中,找到最近的分支(在某种意义上,例如在提交者日期方面)。

git for-each-ref为此付出了代价;这个瑞士军刀指挥非常值得通过其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
    
  4. 总之,我们现在有一个命令可以打印最近(在提交者日期方面)分支引用的(简短)名称:正是我们想要的。太好了!

    将其设为别名

    为方便起见,让我们根据它定义一个别名(下面称为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

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