Bagaimana saya bisa mendapatkan daftar cabang Git, yang dipesan oleh komit terbaru?


1324

Saya ingin mendapatkan daftar semua cabang di repositori Git dengan cabang "paling segar" di atas, di mana cabang "paling segar" adalah yang telah berkomitmen untuk yang terbaru (dan, karenanya, lebih cenderung menjadi satu Saya ingin memperhatikan).

Apakah ada cara saya bisa menggunakan Git untuk (a) mengurutkan daftar cabang berdasarkan komit terbaru, atau (b) mendapatkan daftar cabang bersama dengan tanggal komit terakhir masing-masing, dalam beberapa jenis format yang dapat dibaca mesin?

Kasus terburuk, saya selalu bisa menjalankan git branchuntuk mendapatkan daftar semua cabang, parsing hasilnya, dan kemudian git log -n 1 branchname --format=format:%ciuntuk masing-masing, untuk mendapatkan tanggal komit masing-masing cabang. Tetapi ini akan berjalan pada kotak Windows, di mana memintal proses baru relatif mahal, jadi meluncurkan Git yang dapat dieksekusi sekali per cabang bisa menjadi lambat jika ada banyak cabang. Apakah ada cara untuk melakukan semua ini dengan satu perintah?


2
stackoverflow.com/a/2514279/1804124 Memiliki jawaban yang lebih baik.
Spundun

12
@Spunun, Anda kehilangan saya di sana. Bagaimana kombinasi beberapa perintah, termasuk hal-hal yang disalurkan melalui perl dan sed, "lebih baik" daripada menggunakan perintah yang sudah dimiliki Git?
Joe White

37
@Spundun mengenai jawaban dengan git for-each-refdari Jakub Narębski: Anda bisa mendapatkan cabang jauh yang lewat refs/remotes/alih-alih refs/heads/(atau Anda bisa melewati keduanya, dipisahkan spasi-putih); refs/tags/untuk tag, atau hanya refs/untuk ketiga jenis.
jakub.g

4
Mulai git 2.7 (Q4 2015), tidak lebih for-each-ref! Anda akan langsung menggunakan git branch --sort=-committerdate: lihat jawaban saya di bawah ini
VonC

1
Kemungkinan merupakan duplikat dari stackoverflow.com/questions/9236219/…
Ondra Žižka

Jawaban:


1874

Gunakan --sort=-committerdateopsi git for-each-ref;

Juga tersedia sejak Git 2.7.0 untuk git branch:

Penggunaan Dasar:

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

Hasil:

Hasil

Penggunaan Lanjutan:

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

Hasil:

Hasil


15
Sempurna! Saya bahkan dapat membatasi output hanya nama ref dengan menambahkan --format=%(refname).
Joe White

35
Ini lebih baik untuk saya:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: mengapa tidak digunakan :shortname?
Jakub Narębski

37
@ilius: Sebagai @BeauSmith menulis: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. git-untuk-masing-masing ref (1) manpage mengatakan: Untuk nama pendek yang tidak ambigu dari append :short.
Jakub Narębski

76
Ini adalah versi berwarna termasuk hash, pesan, dipesan naik berdasarkan tanggal komit, dengan usia relatif komit terakhir di setiap cabang. Saya mencuri semua ide dari kalian di atas. Ada di .gitconfig saya di [alias]bagian ini dan saya menyukainya. 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))'
Michael Percy

124

Daftar nama cabang Git, dipesan oleh komit terbaru ...

Memperluas pada jawaban Jakub dan tip Joe , berikut ini akan menghapus "referensi / kepala /" sehingga output hanya menampilkan nama cabang:


Perintah:

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

Hasil:

Cabang Git terbaru


4
Anda juga bisa menggunakan --format=%(refname:short)alih-alih mengandalkan cut.
Chaitanya Gupta

3
Apakah ada cara untuk melakukan ini untuk repositori REMOTE?
Allan Bowe

10
aah - @ jakub.g sudah menjelaskan: Anda bisa mendapatkan cabang jarak jauh lewat ref / remote / bukannya ref / head /. Sempurna!!
Allan Bowe

Saya suka yang ini, jika Anda mencoba alias, yang saya lakukan, git rbingat untuk mengelilingi perintah dalam tanda kutip:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza

2
Dan sekarang Anda dapat melakukan ini dengan git branch, jadi mendapatkan cabang lokal, jarak jauh atau semua berfungsi seperti pada git-branch (yaitu -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

Berikut kode optimal, yang menggabungkan dua jawaban lainnya:

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

10
Bahkan sedikit mor dioptimalkan untuk mendapatkan output tabel:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
untuk beberapa alasan saya harus menggunakan tanda kutip ganda pada windows, tetapi jika tidak, ini bekerja dengan baik :)
amenthes

1
@schoetbi Kode itu persis seperti yang ada di nikolay, apa yang Anda ubah untuk membuatnya tabular?
Enrico

@ Enrico dan lainnya yang mungkin bertanya-tanya tentang hal yang sama. nikolay mengubah jawabannya menggunakan saran schoetbis. Dengan memindahkan tanggal pertama yang selalu sama panjang hasilnya tampak lebih tabular.
johnny

83

Berikut adalah perintah sederhana yang mencantumkan semua cabang dengan komit terbaru:

git branch -v

Untuk memesan dengan komit terbaru, gunakan

git branch -v --sort=committerdate

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


11
git branch -avjika Anda ingin melihat cabang non-lokal juga.
Scott Stafford

34
Ini tidak mengurutkan berdasarkan tanggal komit sesuai pertanyaan.
Cas

1
Apakah mudah untuk git branch -vmemasukkan tanggal setiap komit yang terdaftar?
Dumbledad

1
bagaimana dengan <pre> git branch -v --sort = committerdate </pre>?
iraj jelodari

2
Ini luar biasa. Saya suka git branch -va --sort=-committerdatemenunjukkan cabang non-lokal, dengan cabang yang paling baru diubah di atas.
Clinton Blackmore

61

Saya menggunakan alias berikut:

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"

yang menghasilkan:

Hasil

Gunakan '|' untuk memisahkan.


1
Alias ​​hebat! Saya akan menyarankan column -ts'|'dan pipa karakter jika tanda koma dapat terjadi di dalam cap waktu relatif di lokal Anda.
Björn Lindqvist

1
alias hebat, terima kasih banyak. dapatkah Anda memperbaikinya untuk menampilkan cabang saat ini dengan warna lain atau dengan * di awal?
elhadi dp ıpɐɥ ן ǝ

2
Paling tidak di git versi terbaru, Anda bisa menambahkan '%(HEAD) ...'di awal string format untuk mendapatkan efek yang sama tanpa mem-pipkan sedperintah
Joshua Skrzypek

5
Saya tidak bisa git ini untuk bekerja sebagai alias git. Saya harus menggunakan[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
Saya harus menambahkan --color = selalu untuk mendapatkan warna. 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

Saya dapat merujuk contoh-contoh sebelumnya untuk menciptakan sesuatu yang paling cocok untuk saya.

git untuk-masing-masing ref --sort = -committerdate ref / head / --format = '% (authordate: pendek)% (warna: merah)% (nama objek: pendek)% (warna: kuning)% (refname: pendek )% (warna: reset) (% (warna: hijau)% (committerdate: relatif)% (warna: reset)) '

Cuplikan layar Output


1
Itu terlihat bagus, lebih berwarna daripada menggunakan cabang git langsung seperti yang saya sarankan di stackoverflow.com/a/33163401/6309 . +1
VonC

2
Yang ini berhasil bagi saya, tidak seperti yang lain, jadi saya memilihnya.
Casey

1
Bekerja dengan baik sekali! Terima kasih! :-)
FrozenTarzan

1
Ditto - yang ini bekerja di luar kotak, tidak seperti beberapa yang lain yang baru saja saya coba. Terima kasih.
Dan Nissenbaum

2
Yang ini bersih dan rapi. Kadang saya menambahkan remote dan authorname sebagai ini: 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

Saya juga membutuhkan warna, tag, dan referensi jarak jauh tanpa duplikat:

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

Karena mengutip bisa sulit, inilah alias untuk 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'"]++'"

$ <perintah Anda di sini> awk: kesalahan sintaks dekat baris 1 awk: bailing out dekat baris 1
Jamie Mason

@ GotNoSugarBaby Anda menggunakan tanda kutip tunggal seperti contohnya kan? shell mana yang Anda gunakan? Bash memberikan karakter itu arti khusus sebaliknya.
estani

hei, saya menjalankan ini di / bin / bash (GNU bash, versi 4.0.28 (1) -release (i386-pc-solaris2.11)) dengan copy dan paste contoh Anda - tetapi sejak itu saya sudah menjalankan pada / bin / bash (GNU bash, versi 3.2.48 (1) -release (x86_64-apple-darwin12)) dan berfungsi, jadi saya akan menghapus suara-turun. Terima kasih banyak estani.
Jamie Mason

@ GotNoSugarBaby Saya menggunakan 4.2.25 (1) -release (x86_64-pc-linux-gnu) nad mencoba pada 3.x dan bekerja. Saya tidak yakin masalah apa itu ... tapi mungkin ada masalah terkait versi git, bukan bash. Bagaimanapun, saya senang itu bekerja untuk Anda!
estani

1
@MichaelDiscenza hanya menyalurkan semuanya ke kepala. itu akan menambahkan | head -n20di akhir. Jika Anda menggunakan alias, pastikan ini sesuai dengan tanda kutip.
estani

24

Jawaban lain sepertinya tidak memungkinkan lewat -vvuntuk mendapatkan output verbose.

Jadi, ini adalah satu-liner yang mengurutkan git branch -vvberdasarkan tanggal komit, menjaga warna dll:

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

Jika Anda juga ingin mencetak tanggal komit, Anda dapat menggunakan versi ini sebagai gantinya:

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-

Output sampel:

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

Ini mungkin lebih mudah dibaca menjadi beberapa baris:

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-

Ini juga harus bekerja dengan argumen lain git branch, misalnya -vvruntuk membuat daftar cabang pelacakan jarak jauh, atau -vvauntuk mendaftar cabang pelacakan jarak jauh dan lokal.


-vvmemang bisa bermanfaat, terima kasih. Namun, solusi ini masih memunculkan proses baru untuk setiap cabang, yang ingin dihindari OP.
musiphil

Sebenarnya git branchtidak secara spesifik mendefinisikan arti -vv, tetapi hanya dari -v, jadi -vvharus memiliki yang sama -v.
musiphil

2
Ini yang terbaik. Dan menambahkan -avv membuatnya memperhitungkan cabang-cabang jarak jauh juga. Terima kasih untuk ini!
Gopherkhan

@musiphil Manpage cabang git saya , bagian -v, -vv, --verboseberisi yang berikut:If given twice, print the name of the upstream branch, as well
Perleone

@ Perleone: Saya tidak tahu bagaimana saya mendapatkan informasi itu, tetapi Anda benar, dan saya benar. Terima kasih!
musiphil

23

git 2.7 (Q4 2015) akan memperkenalkan pemilahan cabang menggunakan secara langsung git branch:
Lihat commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 Sep 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 Sep 2015), dan commit f65f139 , ... (23 Sep 2015) oleh Karthik Nayak ( KarthikNayak) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 7f11b48 , 15 Okt 2015)

Secara khusus, lakukan aedcb7d :

branch.c: gunakan ' ref-filter' API

Buatlah ' branch.c' gunakan ' ref-filter' API untuk iterasi melalui penyortiran referensi. Ini menghapus sebagian besar kode yang digunakan di ' branch.c' menggantikannya dengan panggilan ke ref-filterperpustakaan ' '.

Itu menambahkan opsi--sort=<key> :

Sortir berdasarkan kunci yang diberikan.
Awalan -untuk mengurutkan dalam urutan nilai.

Anda dapat menggunakan --sort=<key>opsi ini beberapa kali, dalam hal ini kunci terakhir menjadi kunci utama.

Kunci yang didukung sama dengan yang ada digit for-each-ref .
Urutkan default pesanan ke pengurutan berdasarkan nama lengkap lengkap (termasuk refs/...awalan). Daftar ini memisahkan HEAD (jika ada) terlebih dahulu, kemudian cabang lokal dan akhirnya cabang pelacakan jarak jauh.

Sini:

git branch --sort=-committerdate 

Atau (lihat di bawah dengan Git 2.19)

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

Lihat juga komit 9e46833 (30 Okt 2015) oleh Karthik Nayak ( KarthikNayak) .
Dibantu-oleh: Junio ​​C Hamano ( gitster) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 415095f , 03 Nov 2015)

Ketika menyortir sesuai nilai numerik (mis. --sort=objectsize) Tidak ada perbandingan mundur ketika kedua referensi memegang nilai yang sama. Ini dapat menyebabkan hasil yang tidak terduga (yaitu urutan daftar ref dengan nilai yang sama tidak dapat ditentukan sebelumnya) seperti yang ditunjukkan oleh Johannes Sixt ( $ gmane / 280117 ).

Oleh karena itu, mundur ke perbandingan alfabet berdasarkan refname setiap kali kriteria lainnya sama .

$ git branch --sort=objectsize

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

Dengan Git 2.19, urutan pengurutan dapat diatur secara default.
git branchmendukung konfigurasi branch.sort, seperti git tag, yang sudah memiliki konfigurasi tag.sort.
Lihat commit 560ae1c (16 Agustus 2018) oleh Samuel Maftoul (``) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit d89db6f , 27 Agu 2018)

branch.sort:

Variabel ini mengontrol pengurutan cabang-cabang ketika ditampilkan oleh git-branch.
Tanpa opsi " --sort=<value>" yang disediakan, nilai variabel ini akan digunakan sebagai default.


Untuk membuat daftar cabang jarak jauh, gunakan git branch -r --sort=objectsize. The -rflag menyebabkan untuk daftar cabang terpencil bukan cabang lokal.


Dengan Git 2.27 (Q2 2020), varian " git branch" dan " for-each-ref" lainnya menerima banyak --sort=<key>opsi dalam urutan prioritas yang lebih tinggi, tetapi ada beberapa kerusakan di sekitar "--ignore-case penanganan ", dan pemecahan ikatan dengan refname, yang telah diperbaiki.

Lihat komit 7c5045f , komit 76f9e56 (03 Mei 2020) oleh Jeff King ( peff) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 6de1630 , 08 Mei 2020)

ref-filter: terapkan sortir refname balik hanya setelah semua jenis pengguna

Ditandatangani oleh: Jeff King

Komit 9e468334b4 (" ref-filter: fallback on alphabetical comparison", 2015-10-30, Git v2.7.0-rc0 - gabung yang tercantum dalam batch # 10 ) mengajarkan jenis filter ref untuk mundur untuk membandingkan refnames.
Tetapi ia melakukannya pada level yang salah, mengesampingkan hasil perbandingan untuk --sortkunci " " tunggal dari pengguna, daripada setelah semua kunci sortir telah habis.

Ini bekerja dengan benar untuk satu " --sort" opsi, tetapi tidak untuk beberapa opsi.
Kami akan memutuskan ikatan apa pun di kunci pertama dengan refname dan tidak pernah mengevaluasi kunci kedua sama sekali.

Untuk membuat masalah lebih menarik, kami hanya menerapkan fallback ini kadang-kadang!
Untuk bidang seperti " taggeremail" yang membutuhkan perbandingan string, kami akan benar-benar mengembalikan hasil strcmp(), bahkan jika itu adalah 0.
Tapi untuk valuebidang " " numerik seperti " taggerdate", kami menerapkan fallback. Dan itulah mengapa uji multi-macam kami melewatkan ini: ini digunakan taggeremailsebagai perbandingan utama.

Jadi mari kita mulai dengan menambahkan tes yang jauh lebih ketat. Kami akan memiliki seperangkat komit yang mengekspresikan setiap kombinasi dari dua email tagger, tanggal, dan nama ulang. Kemudian kami dapat mengonfirmasi bahwa pengurutan kami diterapkan dengan prioritas yang benar, dan kami akan mengenai pembanding string dan nilai.

Itu memang menunjukkan bug, dan perbaikannya sederhana: memindahkan fallback ke compare_refs()fungsi luar , setelah semuaref_sorting kunci telah habis.

Perhatikan bahwa dalam fungsi luar kita tidak memiliki "ignore_case"bendera, karena itu adalah bagian dari setiap ref_sortingelemen individu . Masih bisa diperdebatkan apa yang harus dilakukan mundur tersebut, karena kami tidak menggunakan kunci pengguna untuk mencocokkan.
Tetapi sampai sekarang kami telah berusaha untuk menghormati bendera itu, jadi hal yang paling tidak invasif adalah mencoba untuk terus melakukannya.
Karena semua penelepon dalam kode saat ini baik mengatur bendera untuk semua kunci atau tidak, kami hanya dapat menarik bendera dari kunci pertama. Di dunia hipotetis di mana pengguna benar-benar dapat membalik case-insensitivity kunci secara terpisah, kami mungkin ingin memperluas kode untuk membedakan case itu dari selimut " --ignore-case".


Untuk membuat daftar remote dengan opsi ini, tambahkan-r
Troy Daniels

@TroyDaniels Setuju. Anda dapat mengedit jawabannya. Saya akan meninjau hasil edit Anda.
VonC

19

Saya suka menggunakan tanggal relatif dan memperpendek nama cabang seperti ini:

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

Yang memberi Anda output:

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

Saya sarankan membuat file Bash untuk menambahkan semua alias favorit Anda dan kemudian membagikan skrip ke tim Anda. Berikut ini contoh untuk menambahkan yang ini:

#!/bin/sh

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

Kemudian Anda bisa melakukan ini untuk mendapatkan daftar cabang lokal yang diformat dan diurutkan dengan baik:

git branches

Perbarui: Lakukan ini jika Anda ingin mewarnai:

#!/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)$|$"

Ini memberi sayafatal: unknown field name: '-authordate:iso8601'
Factor Mystic

1
Output berwarna mewah memang mewah, tapi ini sederhana dan hanya apa yang saya cari. Ganti refs/headsdengan refs/remotesuntuk melihat cabang jarak jauh.
Lambart

Perintah itu sendiri indah, tetapi alias melempar kesalahan: expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn

Bekerja untukku. Apa yang terjadi jika Anda hanya menyalin tempel ini ke terminal?(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

Pada Git 2.19, Anda cukup:

git branch --sort=-committerdate

Anda juga bisa:

git config branch.sort -committerdate

Jadi, setiap kali Anda mendaftar cabang di repositori saat ini, itu akan terdaftar diurutkan berdasarkan committerdate.

Jika setiap kali Anda daftar cabang, Anda ingin mereka diurutkan berdasarkan tanggal comitter:

git config --global branch.sort -committerdate

Penafian: Saya penulis fitur ini di Git, dan saya menerapkannya ketika saya melihat pertanyaan ini.


2
Jawaban terbanyak, jauh lebih mudah daripada menggunakan skrip atau alias kompleks 👌
mtefi

Gunakan dengan hati-hati! Hati-hati semua orang, ini bukan perintah untuk mendaftar cabang. Ini adalah perintah untuk mengubah konfigurasi Git dan akan memiliki dampak global permanen.
Jazimov

1
@Jazimov Anda benar, saya mengedit jawaban sehingga lebih jelas
user801247

11

Menambahkan beberapa warna (karena pretty-formattidak tersedia)

[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

Saya memiliki masalah yang sama, jadi saya menulis permata Ruby yang disebut Twig . Ini mencantumkan cabang dalam urutan kronologis (terbaru terlebih dahulu), dan juga dapat membiarkan Anda mengatur usia maksimal sehingga Anda tidak mencantumkan semua cabang (jika Anda memiliki banyak cabang). Sebagai contoh:

$ 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

Ini juga memungkinkan Anda menyimpan properti khusus untuk setiap cabang, misalnya, id tiket, status, todos, dan memfilter daftar cabang sesuai dengan properti ini. Info lebih lanjut: http://rondevera.github.io/twig/


5
Nama itu mungkin tidak membantu karena saya cukup yakin ada beberapa perangkat lunak di luar sana dengan nama yang sama.
thoroc

8

Saya datang dengan perintah berikut (untuk Git 2.13 dan yang lebih baru):

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

Jika tidak memiliki, columnAnda dapat mengganti baris terakhir dengan

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

Outputnya seperti

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

Saya menulis posting blog tentang bagaimana berbagai karya.


Bagus. +1. Itu tidak menggunakan yang git branch --sortsaya sebutkan di stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Pastikan Anda menggunakan Git 2.13 (dirilis pada Mei 2017) atau lebih baru.
bdesham


5

Berikut ini adalah skrip kecil yang saya gunakan untuk beralih di antara cabang-cabang terbaru:

#!/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

Menggunakan dua alias itu:

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

Sebut saja dalam repositori Git, dan itu akan menunjukkan kepada Anda cabang N terakhir (10 secara default) dan nomor masing-masing. Masukkan nomor cabang, dan periksa:

Masukkan deskripsi gambar di sini


4

Biasanya kami mempertimbangkan cabang terpencil baru-baru ini. Jadi coba ini

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

4

Berikut ini adalah skrip lain yang melakukan semua skrip lainnya. Bahkan, ia menyediakan fungsi untuk shell Anda.

Kontribusinya adalah ia menarik beberapa warna dari konfigurasi Git Anda (atau menggunakan default).

# 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

Ini didasarkan pada versi saeedgnu , tetapi dengan cabang saat ini ditampilkan dengan bintang dan warna, dan hanya menunjukkan apa pun yang tidak digambarkan sebagai "bulan" atau "tahun" yang lalu:

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

Hasil terbaik saya sebagai skrip:

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
Script apa? Pesta?
Peter Mortensen

2

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

Untuk siapa pun yang tertarik untuk mendapatkan hanya 5 nama cabang teratas yang diurutkan berdasarkan tanggal committer.



1

Berikut variasi yang saya cari:

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

Itu tail -rmembalik daftar sehingga yang terbaru commiterdateadalah yang terakhir.


3
Anda juga dapat mengubah --sort = -committerdate ke --sort = committerdate untuk melakukannya.
rephorm

Yang tailmemiliki -r?
Christoffer Hammarström

1

Saya menyalurkan output dari jawaban yang diterima ke dialog, untuk memberi saya daftar interaktif:

#!/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

Simpan sebagai (misalnya) ~/bin/git_recent_branches.shdan chmod +xitu. Lalu git config --global alias.rb '!git_recent_branches.sh'beri aku git rbperintah baru .


1

Saya tahu sudah ada banyak jawaban, tetapi inilah dua sen saya untuk alias sederhana (saya suka memiliki cabang terbaru saya di bagian bawah):

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

Ini akan memberi Anda gambaran bagus tentang 15 cabang terbaru Anda, berwarna, dengan cabang Anda saat ini disorot (dan memiliki tanda bintang).


1

Mengalami kesulitan menangani tanda kutip tunggal pada Mac di bash_profile ketika mencoba mengatur alias. Jawaban ini membantu mengatasinya " Bagaimana cara melepaskan tanda kutip tunggal dalam string yang dikutip tunggal

Solusi kerja:

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 Tidak dapat berkomentar karena reputasi saya


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))' ini yang kamu butuhkan


0

Git v2.19 memperkenalkan branch.sortopsi konfigurasi (lihat branch.sort ).

Jadi git branchakan mengurutkan berdasarkan tanggal committer (desc) secara default dengan

# gitconfig
[branch]
    sort = -committerdate     # desc

naskah:

$ git config --global branch.sort -committerdate

Memperbarui:

Begitu,

$ git branch
* dev
  master
  _

dan

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.