web-dev-qa-db-ja.com

最新のコミット順に並べられたGitブランチのリストを取得するにはどうすればいいですか?

私はGitレポジトリ内のすべてのブランチのリストを一番上に「新鮮な」ブランチがあるリストを取得したいと思います。ここで、「新鮮な」ブランチは最も最近コミットされたものです(したがって、1つになりやすい)私は注意を払いたいです。

Gitを使って(a)最新のコミットでブランチのリストをソートする、あるいは(b)ブランチのリストをそれぞれの最後のコミット日とともに、何らかの機械可読形式で取得する方法はありますか。

最悪の場合、git branchを実行してすべてのブランチのリストを取得し、その出力を解析してから、各ブランチのgit log -n 1 branchname --format=format:%ciを実行して、各ブランチのコミット日を取得することができます。しかしこれは、新しいプロセスを起動するのが比較的高価なWindowsボックス上で実行されるので、Git実行可能ファイルをブランチごとに1回起動すると、ブランチが多数あると遅くなる可能性があります。単一のコマンドでこれらすべてを実行する方法はありますか?

1049
Joe White

--sort=-committerdategit for-each-refオプションを使用します。

Git 2.7.0以降git branch にも: -

基本的な使い方

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

結果:

Result

高度な使い方

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

結果:

Result

1491
Jakub Narębski

最新のコミット順に並べられたgitブランチ名のリスト

Jakubの回答とJoeの助言を拡張して、以下は "refs/heads /"を削除するので、出力にはブランチ名のみが表示されます。


コマンド:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

結果:

recent git branches

114
Beau Smith

これが最適なコードで、他の2つの答えを組み合わせたものです。

git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
79
nikolay

これは最新のコミットを持つすべてのブランチをリストする簡単なコマンドです:

git branch -v

最新のコミットで注文するには、

git branch -v --sort=committerdate

ソース: http://git-scm.com/book/en/Git-Branching-Branch-Management

71
user1682406

私は次のエイリアスを使います。

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:Magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

これが生成されます: result

編集: '|'を使用 @BjörnLindqvist のおかげで分離する

更新: @elhadi のおかげで*現在のブランチの前に*を追加
編集:現在の枝が別の枝の部分文字列である場合を修正しました

編集: @Joshua Skrzypek のおかげで、現在のブランチに対してより単純な構文を使用する

44
dimid

また、色、タグ、そしてリモート参照が重複することなく必要でした。

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

引用は難しいので、ここではbashのエイリアスです。

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"
36
estani
28
Andy

他の答えは冗長な出力を得るために-vvを渡すことを許可していないようです。

ですから、git branch -vvをコミット日順に並べ替え、色を保持するようなワンライナーがあります。

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | Perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

さらにコミット日を印刷したい場合は、代わりにこのバージョンを使用できます。

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | Perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

出力例:

2013-09-15   master                  da39a3e [Origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

おそらくもっと読みやすくなり、複数の行に分かれています。

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The Perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | Perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

これはgit branchへの他の引数、例えば上でも動作するはずです。リモートトラッキングブランチを一覧表示する場合は-vvr、リモートトラッキングブランチとローカルブランチを一覧表示する場合は-vva

23
John Mellor

git 2.7(2015年第4四半期)では、直接git branchを使用したブランチソートが導入されます。
commit aa3bc55commit aedcb7dcommit 1511b22commit f65f139 、...(23 Sep 2015)を参照してください。 、 commit aedcb7dcommit 1511b22commit ca41799 (2015年9月24日)、および commit f65f139 、...(2015年9月23日) ) Karthik Nayak(KarthikNayak によって。
(2015年10月15日、 commit 7f11b48 内の Junio C Hamano - gitster - によるマージ)

特に、 commit aedcb7d

branch.c: 'ref-filter' APIを使う

参照のソートを繰り返すために、 'branch.c'に 'ref-filter' APIを使用するようにします。これにより、 'branch.c'で使用されているコードの大部分が削除され、 'ref-filter'ライブラリの呼び出しに置き換えられます。

それは オプション--sort=<key>を追加します

与えられたキーに基づいてソートします。
値の降順でソートするには、-を前に付けます。

--sort=<key>オプションを複数回使用することができます。その場合、最後のキーが主キーになります。

サポートされているキーは git for-each-refと同じ です。
ソート順のデフォルトは、完全なrefname(refs/...プレフィックスを含む)に基づくソートです。これは最初に切り離されたHEAD(もし存在すれば)をリストし、次にローカルブランチ、そして最後にリモートトラッキングブランチをリストします。

ここに:

git branch --sort=-committerdate 

または(Git 2.19では以下を参照)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

Karthik Nayak(KarthikNayak による commit 9e46833 (2015年10月30日)も参照してください。
手助け: Junio C Hamano(gitster
(2015年11月3日、 commit 415095fJunio C Hamano - gitster - にマージされました。)

数値(例:--sort=objectsize)に従ってソートする場合、両方の参照が同じ値を保持しているときはフォールバック比較はありません。 Johannes Sixt( $ gmane/280117 )が指摘するように、これは予期しない結果を引き起こす可能性があります(すなわち、等しい値を持つ参照をリストする順序は事前に決定できません)。

したがって、 他の基準が等しい場合は常にrefnameに基づくアルファベット比較にフォールバックします

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

Git 2.19では、ソート順はデフォルトで設定できます。
git branchは、すでにbranch.sortという設定があるgit tagのような設定tag.sortをサポートします。
commit 560ae1c (2018年8月16日)by Samuel Maftoul( ``) を参照してください。
commit d89db6f 内の Junio C Hamano - gitster - によってマージされた、2018年8月27日)

branch.sort:

この変数はgit-branchで表示されたときのブランチのソート順を制御します。
"--sort=<value>"オプションが指定されていないと、この変数の値がデフォルトとして使用されます。


リモートブランチを一覧表示するには、git branch -r --sort=objectsizeを使用します。 -rフラグは、ローカルブランチの代わりにリモートブランチをリストするようにします。

22
VonC

相対日付を使用してブランチ名を短くするのが好きです。

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

これはあなたに出力を与える:

21 minutes ago  nathan/a_recent_branch
6 hours ago     master
27 hours ago    nathan/some_other_branch
29 hours ago    branch_c
6 days ago      branch_d

お気に入りのエイリアスをすべて追加してからスクリプトをチームに共有するためのbashファイルを作成することをお勧めします。これを追加する例を示します。

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

それからあなたはちょうどうまくフォーマットされソートされたローカルブランチリストを得るためにこれをすることができます:

git branches

更新:あなたが着色したい場合はこれを行います。

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
19
n8tr

色を追加します(pretty-formatは使用できないため)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"
11
epylinkn

Git 2.19以降では、次のことが簡単にできます。

git branch --sort=-committerdate

あなたもすることができます:

git config branch.sort -committerdate

そのため、現在のリポジトリでブランチを一覧表示するときはいつでも、それはcommitterdateによってソートされて表示されます。

ブランチを一覧表示するときはいつでも、それらをcomitterdateでソートしたい場合があります。

git config --global branch.sort -committerdate

免責事項:私はgitでこの機能の作者です。この質問を見たときに実装しました。

9
user801247

私は同じ問題を抱えていたので、 Twig というRuby gemを書きました。それは年代順(最新のものから順に)に枝をリストします、そしてあなたが(あなたがそれらをたくさん持っているなら)あなたがすべての枝をリストしないように最大年齢を設定させることもできます。例えば:

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

また、チケットID、ステータス、仕事など、各ブランチのカスタムプロパティを保存したり、これらのプロパティに従ってブランチのリストをフィルタしたりすることもできます。より多くの情報: http://rondevera.github.io/twig/

8
Ron DeVera

私は次のコマンドを思い付きました(Git 2.13以降の場合)。

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

columnを持っていない場合は、最後の行を次のように置き換えます。

    | sed -e "s/;/\t/g"

出力は次のようになります

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-Ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

私は ブログ記事 さまざまな部分がどのように機能するかについて/を書きました。

8
bdesham

参考までに、(最近コミットされたものではなく)最近の チェックアウトされた ブランチのリストを取得したい場合は、gitのreflogを使用できます。

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

参照: 最近チェックアウトしたgitブランチのリストを取得するにはどうすればいいですか?

7
Jordan Brough

これは他のすべてのスクリプトがすることをする別のスクリプトです。実際、それはあなたのシェルに機能を提供します。

その貢献はあなたのgit設定からいくつかの色を引き出すことです(またはデフォルトを使用します)。

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/Origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}
4
joeytwiddle

これが最近のブランチを切り替えるために使用する小さなスクリプトです。

#!/bin/bash
# Sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branchs="$(git recent | tail -n $lines | nl)"
branchs_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branchs"

# Prompt which server to connect to
max="$(echo "$branchs" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: " 
    read index
done

branch="$( echo "$branchs_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

これら2つのエイリアスを使う

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

それをgitリポジトリで呼び出すだけで、最後のN個のブランチ(デフォルトは10個)とそれぞれの横の数字が表示されます。ブランチの番号を入力するとチェックアウトします。

enter image description here

3
Agus Arias

イリウスのバージョンに基づいていますが、現在のブランチは星と色で表示されており、「月」または「年」として記述されていないものだけを表示しています。

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done
3
Mark Lodato

スクリプトとしての私の最高の結果:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done
2
saeedgnu

通常私達は最近遠隔枝を考慮する。だからこれを試してみてください

git fetch
git for-each-ref --sort=-committerdate refs/remotes/Origin
1
Victor Choy

ここパーティーに遅れた。受け入れられているCMLの答えは揺らいでいますが、GUIのようにもっときれいにしたいのなら、Origin === "github"が必要です。

レポの中の "Branches"をクリックすることができます。またはURLに直接アクセスしてください。 https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
jahrichie

git branch --sort=-committerdate | head -5

コミッターの日付に基づいてソートされた上位5つのブランチ名だけを取得したいという方に。

1
vardin

これが私が探していたバリエーションです。

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

そのtail -rはリストを逆にするので、最新のcommiterdateは最後です。

1
Ben

私はすでにたくさんの答えがあることを知っています、しかしここに単純なエイリアスのための私の2セントがあります(私は一番下に私の最新のブランチを持っているのが好きです):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

これにより、現在のブランチが強調表示された状態で(およびアスタリスクが付いて)、最新の15のブランチの概要がカラーで表示されます。

1
Tom

私は、受け入れられた答えからの出力をdialogにパイプして、対話的なリストを与えます。

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

~/bin/git_recent_branches.shおよびchmod +xとして保存します。それからgit config --global alias.rb '!git_recent_branches.sh'で私に新しいgit rbコマンドをくれ。

1
John Delaney

Git v2.19branch.sort設定オプションを導入しました( branch.sort を参照)。

それでgit branchはデフォルトでコミッタ日付(desc)でソートします。

# gitconfig
[branch]
    sort = -committerdate     # desc

スクリプト:

$ git config --global branch.sort -committerdate

更新:

そう、

$ git branch
* dev
  master
  _

そして

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
0
hIpPy

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'これはあなたが必要としていることです

0
ChunkCoder