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


1324

「最新の」ブランチが一番上にあるGitリポジトリのすべてのブランチのリストを取得したいのですが、「最新の」ブランチは最近コミットされたブランチであり、したがって、1つである可能性が高くなります注目したい)。

Gitを使用して、(a)ブランチのリストを最新のコミットでソートする方法、または(b)ブランチのリストをそれぞれの最終コミット日付と一緒に、何らかの機械可読形式で取得できる方法はありますか?

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


2
stackoverflow.com/a/2514279/1804124より良い答えがあります。
Spundun 2013年

12
@Spundun、あなたは私をそこに失った。perlとsedを介してパイプされるものを含む複数のコマンドの組み合わせは、Gitがすでに持っているコマンドを使用するよりも「良い」のでしょうか。
ジョーホワイト

37
git for-each-refJakub Narbskiからの回答に関する@Spundun:refs/remotes/代わりにリモートブランチを渡すrefs/heads/ことができます(または空白で区切って両方を渡すことができます)。refs/tags/タグの場合、またはrefs/3種類すべての場合のみ。
jakub.g 2013年

4
git 2.7(2015年第4四半期)以降、これ以上はありませんfor-each-ref!直接使用しますgit branch --sort=-committerdate以下の私の回答を
VonC、2015年

1
おそらく、stackoverflow.com
questions

回答:


1874

--sort=-committerdateオプションを使用しますgit 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

結果:

結果

高度な使用法:

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))'

結果:

結果


15
パーフェクト!追加することで、出力を参照名のみに制限することもでき--format=%(refname)ます。
ジョーホワイト

35
これは私のために優れている:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius:なぜ使用しないの:shortnameですか?
JakubNarębski、2012

37
@ilius:@BeauSmithが書いたように:git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/。git-for-each-ref(1)のマンページには次のように書かれています:明確なrefの短い名前の場合:short
JakubNarębski、2012

76
これは、ハッシュ、メッセージ、コミット日付に基づいて昇順、各ブランチでの最後のコミットの相対経過時間を含むカラーバージョンです。上記の皆さんからアイデアをすべて盗みました。[alias]セクションの.gitconfigにあり、とても気に入っています。br = 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))'
マイケルパーシー

124

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

Jakubの答えJoeのヒントを展開すると、次のように「refs / heads /」が取り除かれ、出力にはブランチ名のみが表示されます。


コマンド:

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

結果:

最近のGitブランチ


4
--format=%(refname:short)に依存する代わりにを使用することもできcutます。
Chaitanya Gupta

3
REMOTEリポジトリに対してこれを行う方法はありますか?
Allan Bowe 2014年

10
aah-@ jakub.gはすでに説明されています:refs / heads /の代わりにrefs / remotes /を渡すリモートブランチを取得できます。パーフェクト!!
アランボウ2014年

私がして、やったIこのような、あなたはエイリアスにそれをしようとしている場合は、git rb引用符でコマンドを囲むように覚えている:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
マイケルDiscenza

2
そして今git branch、これを使ってこれを行うことができるので、ローカル、リモート、またはすべてのブランチの取得はgit-branch(つまり-r、-a)のように機能します。git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
phord

89

他の2つの答えを組み合わせた最適なコードを次に示します。

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

10
表形式の出力を取得するために最適化された少しのgit for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
モルでも

2
なんらかの理由で、ウィンドウで二重引用符を使用する必要がありましたが、それ以外の場合は問題なく機能します:)
amenthes

1
@schoetbiそのコードはニコライのコードとまったく同じように見えますが、表形式にするために何を変更しましたか?
Enrico

@Enricoなど、同じことを不思議に思うかもしれません。ニコライはschoetbisの提案を使用して彼の答えを変更しました。常に同じ長さの日付を最初に移動すると、結果はより表に見えるようになります。
ジョニー

83

以下は、最新のコミットですべてのブランチを一覧表示する簡単なコマンドです。

git branch -v

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

git branch -v --sort=committerdate

出典:http : //git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -av非ローカルブランチも見たい場合。
スコットスタッフォード

34
これは、質問のようにコミット日付でソートされません。
Cas 14

1
git branch -vリストされている各コミットの日付を含めるのは簡単ですか?
ダンブルダッド

1
<pre> git branch -v --sort = committerdate </ pre>はどうですか?
iraj jelodari 16

2
これは素晴らしいです。git branch -va --sort=-committerdate最近変更されたブランチを一番上にして、ローカルでないブランチを表示するのが好きです。
クリントンブラックモア

61

次のエイリアスを使用します。

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"

生成されるもの:

結果

'|'を使用 分離するために。


1
素晴らしいエイリアス!column -ts'|'ロケールの相対タイムスタンプ内でコンマ文字が発生する可能性がある場合は、文字をパイプして提案します。
ビョルンLindqvist

1
素晴らしいエイリアス、ありがとうございました。現在のブランチを別の色または最初に*で表示するように改善できますか?
elhadi dpıpɐɥןǝ2015

2
少なくとも最新バージョンのgit '%(HEAD) ...'では、フォーマット文字列の先頭に追加するだけで、sedコマンドをパイプ処理せずに同じ効果を得ることができます
Joshua Skrzypek

5
これをgitエイリアスとして動作させるためにgitを実行できませんでした。私は使用しなければなりませんでした[alias] recent = !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'|'
Wesley Smith

11
色を取得するには、-color = alwaysを追加する必要がありました。 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)' --color=always|column -ts'|'}
user3342930

40

前の例を参考にして、自分に最適なものを作成することができました。

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

出力のスクリーンショット


1
これは、私がstackoverflow.com/a/33163401/6309で提案したように、直接gitブランチを使用するよりも、よりカラフルに見えます。+1
VonC 2017年

2
これは他のいくつかとは異なり、私のためにすぐに機能しましたので、私はそれに投票しました。
ケーシー

1
本当にうまくいきました!ありがとう!:-)
FrozenTarzan 2017年

1
同上-私が試した他の多くとは異なり、これはそのまま使用できました。ありがとう。
Dan Nissenbaum 2017年

2
これはきれいで端正です。いつか私はこのようにリモートと作者名を追加します: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
ywu

38

重複のない色、タグ、リモート参照も必要でした。

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'"]++'"

$ <your command here> awk:1行目付近の構文エラーawk:1行目付近で救済
Jamie Mason

@GotNoSugarBaby例のように一重引用符を使用していますよね?どのシェルを使用していますか?それ以外の場合、bashはその文字に特別な意味を与えます。
estani 2013年

こんにちは、これを/ bin / bash(GNU bash、バージョン4.0.28(1)-release(i386-pc-solaris2.11))で実行し、例をそのままコピーして貼り付けました—それ以来、私は実行していますそれは/ bin / bash(GNU bash、バージョン3.2.48(1)-release(x86_64-apple-darwin12))にあり、機能するので、反対票を削除します。エスタニさん、ありがとうございました。
ジェイミーメイソン

@GotNoSugarBaby 4.2.25(1)-release(x86_64-pc-linux-gnu)を使用しました。3.xで試してみましたが、うまくいきました。どのような問題だったのかはわかりませんが、bashではなくgitバージョンに関連する問題である可能性があります。とにかく、それがあなたのために働くのはうれしいです!
estani 2013年

1
@MichaelDiscenzaはすべてをパイプで頭に送っています。| head -n20最後に追加することになります。エイリアスを使用している場合、これは行くことを確認し以内に引用符。
エスタニ2015

24

他の回答は-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を一覧表示したり、リモートトラッキングブランチとローカルブランチの両方を一覧表示したりするために、他の引数でも機能するはずです。


-vv本当に感謝します。ただし、このソリューションでは、各ブランチに対して新しいプロセスがまだ生成されているため、OPはこれを回避したいと考えていました。
musiphil '19年

実際にgit branchはの意味を具体的に定義していませんが、の意味-vvのみを定義している-vため-vv、と同じである必要があり-vます。
musiphil

2
これが一番。また、-avvを追加すると、リモートブランチも考慮に入れられます。これをありがとう!
Gopherkhan 2015

マイ@musiphil gitのブランチ manページ、セクションには、-v, -vv, --verbose以下が含まれています:If given twice, print the name of the upstream branch, as well
Perleone

@Perleone:どうやってその情報を得たのかわかりませんが、あなたは正しいです。ありがとう!
ムシフィル

23

gitの2.7(Q4 2015)を直接使用してソートブランチをご紹介しますgit branch
参照はaa3bc55をコミットしaedcb7dをコミットし1511b22をコミットしf65f139をコミットし、...(2015年9月23日)、aedcb7dコミット1511b22をコミットしca41799コミット(2015年9月24日)を、そしてコミットf65f139、...(2015年9月23日)by Karthik Nayak(KarthikNayak
(合併によりJunio C浜野- gitster-7f11b48コミットし、2015年10月15日)を

特に、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()によるcommit 9e46833(2015年10月30日)も参照してください。 協力者:ジュニオC浜野((による合併Junio C浜野- -415095fコミット 2015年11月、03)KarthikNayak
gitster
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 branchbranch.sortような構成をサポートしgit tagていtag.sortます。Samuel Maftoul( ``)によるcommit 560ae1c(2018年8月16日)を
参照してください。(による合併Junio C浜野- -d89db6fをコミットし、2018年8月27日)
gitster

branch.sort:

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


リモートブランチを一覧表示するには、を使用しますgit branch -r --sort=objectsize。この-rフラグにより​​、ローカルブランチではなくリモートブランチがリストされます。


Git 2.27(2020年第2四半期)では、「git branch」およびその他の「for-each-ref」バリアントは複数の--sort=<key>オプションを優先順位の高い順に受け入れましたが、「--ignore-case」の処理とrefnameとのタイブレークにいくつかの破損がありましたが、修正されました。

Jeff King()によるcommit 7c5045fcommit 76f9e56(2020年5月3日)を参照してください。(による合併Junio C浜野- -6de1630コミット、2020年5月8日)をpeff
gitster

ref-filter:すべてのユーザーがソートした後にのみ、フォールバック参照名ソートを適用します

サインオフ:Jeff King

コミット9e468334b4( " ref-filter:アルファベット順比較のフォールバック"、2015-10-30、Git v2.7.0-rc0- バッチ#10にリストされたマージ)は、refnameの比較にフォールバックするref-filterのソートを教えました。 しかし、それは誤ったレベルで行われ、すべてのソートキーが使い果たされた後ではなく、ユーザーからの単一の「」キーの比較結果を上書きしました。
--sort

これは、単一の " --sort"オプションでは正しく機能しましたが、複数のオプションでは機能しませんでした。
最初のキーとrefnameとの関連付けを解除し、2番目のキーはまったく評価しません。

問題をさらに面白くするために、このフォールバックを時々のみ適用しました!文字列の比較が必要
な " taggeremail"のようなフィールドのstrcmp()場合、0であってもの結果を本当に返します。
しかし、 " value"のような数値の " "フィールドのtaggerdate場合は、フォールバックを適用しました。そして、それが私たちのマルチソートテストがこれを逃した理由です:それはtaggeremail主な比較として使用します。

それでは、より厳密なテストを追加することから始めましょう。2つのタガーメール、日付、および参照名のすべての組み合わせを表す一連のコミットがあります。次に、正しい優先順位で並べ替えが適用されていることを確認できます。文字列と値の両方のコンパレーターがヒットします。

これはバグを示しており、修正は簡単です。compare_refs()すべてのref_sortingキーを使い果たした後、フォールバックを外部関数に移動します。

外側の関数には"ignore_case"個々のref_sorting要素の一部であるため、フラグがないことに注意してください。一致させるためにユーザーのキーを使用しなかったので、そのようなフォールバックが何をすべきかは議論の余地があります。
しかし、これまで私たちはそのフラグを尊重することを試みてきたので、最も侵襲性の低いことはそうすることを続けることを試みることです。
現在のコードのすべての呼び出し元がすべてのキーにフラグを設定するか、またはフラグを設定しないため、最初のキーからフラグをプルすることができます。ユーザーがキーの大文字と小文字の区別を個別に反転できる仮想世界では、コードを拡張して、そのケースをブランケット " --ignore-case" と区別することができます。


このオプションを使用してリモコンを一覧表示するには、以下を追加します-r
Troy Daniels

@TroyDaniels同意する。回答を編集できます。編集内容を確認します。
VonC 2018年

19

相対日付を使用し、次のようにブランチ名を短くするのが好きです。

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)$|$"

これは私に与えるfatal: unknown field name: '-authordate:iso8601'
Factor Mystic

1
派手な色の出力は派手ですが、これは単純で、まさに私が探していたものです。に置き換えrefs/headsrefs/remotes、リモートブランチを確認してください。
Lambart 2017

コマンド自体は素敵ですが、別名は、エラーがスローされます:expansion of alias 'branches' failed; 'echo' is not a git command
フィリップ・カーン

私のために働く。これをターミナルにコピーして貼り付けた場合はどうなりますか?(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)$|$"
n8tr

17

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

git branch --sort=-committerdate

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

git config branch.sort -committerdate

したがって、現在のリポジトリでブランチをリストするときはいつでも、committerdateでソートされてリストされます。

ブランチをリストするときはいつでも、comitterdateでソートする必要があります。

git config --global branch.sort -committerdate

免責事項:私はGitでこの機能の作成者であり、この質問を見たときに実装しました。


2
最新の複雑なスクリプトやエイリアスを使用するよりもはるかに簡単な答え、👌
mtefi

注意して使用してください!これはブランチを一覧表示するコマンドではありません。これはGitの設定を変更するコマンドであり、永続的なグローバルな影響があります。
Jazimov

1
@Jazimovあなたは正しい、私はそれがより明確になるように答えを編集しました
user801247

11

いくつかの色を追加します(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"

9

私も同じ問題を抱えていたので、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/


5
同じ名前のソフトウェアがいくつかあるので、その名前は役に立たないかもしれません。
thoroc

8

私は次のコマンドを思いつきました(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

私は、さまざまな部分がどのように機能するかについてブログ投稿を書きまし


いいね。+1。git branch --sort私はstackoverflow.com/a/33163401/6309で言及したIを使用します。
VonC 2017

@DanNissenbaum Git 2.13(2017年5月リリース)以降を使用していることを確認してください。
bdesham

7

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

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

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


5

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

#!/bin/bash
# sudo bash

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

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

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

branch="$( echo "$branches_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個)とそれぞれの横にある数が表示されます。ブランチの番号を入力すると、チェックアウトされます:

ここに画像の説明を入力してください


4

通常、私たちは最近リモートブランチを検討します。だからこれを試してください

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

以下は、他のすべてのスクリプトが行うことを実行する別のスクリプトです。実際、シェルに機能を提供します。

その貢献は、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}"
}

3

これは、saeedgnuのバージョンに基づいていますが、現在のブランチは星と色で示され、「月」または「年」前と記述されていないもののみを示しています。

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

2

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

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

1
どんなスクリプト?バッシュ?
Peter Mortensen

2

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

コミッターの日付に基づいてソートされた上位5つのブランチ名のみを取得することに関心のある人のために。



1

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

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

これtail -rによりリストが反転し、最新のものcommiterdateが最後になります。


3
これを行うには、-sort = -committerdateを--sort = committerdateに変更することもできます。
rephorm

どっち tail持っていますか-r
ChristofferHammarström2014年

1

受け入れられた回答の出力をにパイプし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

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

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

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


1

Macでエイリアスを設定しようとすると、bash_profileで単一引用符を処理するときに問題が発生しました。この回答はそれを解決するのに役立ちました " 単一引用符で囲まれた文字列内の単一引用符をエスケープする方法

実用的なソリューション:

alias gb='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))'"'"''

PS私の評判のためコメントできませんでした


0

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

Git v2.19には構成branch.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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.