1. ホーム
  2. git

[解決済み] Git のブランチの一覧を最新のコミット順に表示するにはどうしたらよいですか?

2022-03-20 21:27:19

質問

Git リポジトリ内のすべてのブランチのうち、"freshest" ブランチを先頭にした一覧を取得したいのですが、ここで "freshest" ブランチとは、直近にコミットされた (従って、私が注意を払いたい) ブランチということになります。

Git を使って、(a) ブランチの一覧を最新のコミット順に並べ替える、あるいは (b) ブランチの一覧とそれぞれの最終コミット時刻を機械的に読み取れるような形式で表示する方法はありますか?

最悪の場合、私はいつでも git branch を実行してすべてのブランチのリストを取得し、その出力をパースし、それから git log -n 1 branchname --format=format:%ci をそれぞれのブランチに対して実行し、各ブランチのコミット日を取得します。しかし、これは Windows 上で実行されます。新しいプロセスを立ち上げるには比較的コストがかかるので、ブランチがたくさんある場合はブランチごとに Git の実行ファイルを立ち上げると遅くなる可能性があります。これをひとつのコマンドで実行する方法はないでしょうか?

どのように解決するのですか?

を使用します。 --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))'

結果

Proの使い方(Unix)。

以下のスニペットをあなたの ~/.gitconfig . recentbのエイリアスは、2つの引数を受け付けます。

  • refbranch : どのブランチ 後ろ カラムに対して計算されます。デフォルト マスター
  • count : 最近のブランチをいくつ表示するか。デフォルト 20
[alias]
    # ATTENTION: All aliases prefixed with ! run in /bin/sh make sure you use sh syntax, not bash/zsh or whatever
    recentb = "!r() { refbranch=$1 count=$2; git for-each-ref --sort=-committerdate refs/heads --format='%(refname:short)|%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:-20} | while read line; do branch=$(echo \"$line\" | awk 'BEGIN { FS = \"|\" }; { print $1 }' | tr -d '*'); ahead=$(git rev-list --count \"${refbranch:-origin/master}..${branch}\"); behind=$(git rev-list --count \"${branch}..${refbranch:-origin/master}\"); colorline=$(echo \"$line\" | sed 's/^[^|]*|//'); echo \"$ahead|$behind|$colorline\" | awk -F'|' -vOFS='|' '{$5=substr($5,1,70)}1' ; done | ( echo \"ahead|behind||branch|lastcommit|message|author\\n\" && cat) | column -ts'|';}; r"

結果