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

Saya ingin mendapatkan daftar semua cabang di repositori Git dengan cabang "paling segar" di atas, di mana cabang "paling segar" adalah yang diperbaiki baru-baru ini (dan karena itu kemungkinan besar akan menjadi salah satu dari saya ingin menarik perhatian) .

Apakah ada cara saya dapat menggunakan Git untuk: (a) mengurutkan daftar cabang berdasarkan komit terakhir atau (b) mendapatkan daftar cabang bersama dengan setiap tanggal perbaikan terakhir dalam beberapa jenis format yang dapat dibaca mesin?

Dalam kasus terburuk, saya selalu bisa menjalankan git branch untuk mendapatkan daftar semua cabang, menganalisis outputnya, dan kemudian git log -n 1 branchname --format=format:%ci untuk masing-masing dari mereka untuk mendapatkan setiap tanggal perbaikan cabang. Tapi ini akan bekerja di kotak Windows, di mana mengembangkan proses baru akan relatif mahal, sehingga menjalankan file yang dapat dieksekusi Git sekali per cabang dapat diperlambat jika ada banyak cabang. Apakah ada cara untuk melakukan semua ini dengan satu perintah?

977
04 марта '11 в 3:26 2011-03-04 03:26 Joe White bertanya pada 04 Maret 2011 pukul 3:26 2011-03-04 03:26
@ 26 jawaban

Gunakan --sort=-committerdate di git for-each-ref ;

Juga tersedia dari Git 2.7.0 untuk git branch :

Penggunaan utama:

Penggunaan diperpanjang:

1379
04 марта '11 в 3:33 2011-03-04 03:33 jawabannya diberikan oleh Jakub Narębski pada 04 Maret '11 di 3:33 2011-03-04 03:33

Daftar nama cabang git yang dipesan oleh komit terbaru ...

Beralih ke jawaban Jakubs dan Joes mengisyaratkan, berikut ini akan mencoret "ref / head /", sehingga nama cabang akan ditampilkan di output:


Tim:

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

Hasil:

2019

Berikut adalah kode optimal yang menggabungkan dua jawaban lain:

 git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)' 
78
22 мая '12 в 2:22 2012-05-22 02:22 jawabannya diberikan nikolay 22 Mei '12 pada 2:22 2012-05-22 02:22

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

 git branch -v 

Untuk memesan pengikut terakhir, gunakan

 git branch -v --sort=committerdate 

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

68
13 марта '13 в 14:54 2013-03-13 14:54 jawabannya diberikan oleh user1682406 13 Maret 13 di 14:54 2013-03-13 14:54

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: 2019

38
06 мая '15 в 15:05 2015-05-06 15:05 jawabannya diberikan dimid 06 Mei '15 pukul 15:05 2015-05-06 15:05

Saya juga membutuhkan warna, tag, dan tautan yang dihapus 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, berikut ini 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'"]++'" 
36
19 авг. jawabannya diberikan oleh estani 19 Agustus. 2013-08-19 12:27 '13 pada 12:27 2013-08-19 12:27

Saya dapat merujuk pada contoh di atas untuk menciptakan sesuatu yang terbaik bagi saya.

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

2019

Jawaban lain tampaknya tidak mengizinkan -vv untuk keluaran terperinci.

Jadi, inilah font baris tunggal yang mengurutkan git branch -vv dengan menetapkan tanggal, menjaga warnanya, dll.:

 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- 

Contoh output:

 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 perpecahan yang lebih mudah dibaca menjadi beberapa baris:

23
12 сент. Balas diberikan oleh John Mellor 12 Sep 2013-09-12 18:06 '13 pada 18:06 2013-09-12 18:06

git 2.7 (Q4 2015) akan memasuki penyortiran cabang menggunakan git branch > Lihat Komit aa3bc55 , komit aedcb7d , komit 1511b22 , komit f65f139 , ... (23 Sep 2015), komit aedcb7d , komit 1511b22 , koma ca41799 (24 September 2015) dan komit f65f139 , ... (23 September 2015) dari Karthik Nayak ( KarthikNayak ) .
(Penggabungan dengan Yunio S gitster - gitster - berkomitmen 7f11b48 , 15 Oktober 2015)

Secara khusus, perbaiki aedcb7d :

branch.c : gunakan API ref-filter

Buat ' branch.c ' menggunakan API ' ref-filter ' untuk beralih menggunakan referensi pengurutan. Ini menghapus sebagian besar kode yang digunakan di " branch.c ", menggantikannya dengan panggilan ke perpustakaan " ref-filter ".

Ini menambahkan opsi --sort=<key> :

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

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

Kunci yang didukung sama dengan di git for-each-ref .
Urutan penyortiran default diurutkan berdasarkan nama lengkap (termasuk awalan refs/... ). Ini daftar bab individu (jika ada), kemudian cabang lokal dan, akhirnya, cabang pelacakan jarak jauh.

Ini adalah:

 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 komisi 9e46833 (30 Oktober 2015) KarthikNayak ( KarthikNayak ) .
Asisten: Junio ​​S Hamano ( gitster ) .
(Penggabungan dengan Unio S Hamano - gitster - berkomitmen 415095f , 03 November 2015)

Saat mengurutkan berdasarkan nilai numerik (misalnya, --sort=objectsize ), tidak ada perbandingan perbandingan ketika kedua referensi menyimpan nilai yang sama. Ini dapat menyebabkan hasil yang tidak terduga (mis. Urutan daftar tautan dengan nilai yang sama tidak dapat ditentukan sebelumnya), seperti yang ditunjukkan oleh Johannes Sixt ( $ gmane / 280117 ).

Akibatnya, kembali ke perbandingan alfabet berdasarkan nama ketika 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 branch mendukung konfigurasi branch.sort , misalnya git tag , yang sudah memiliki tag.sort .
Lihat Fiksasi 560ae1c (16 Agustus 2018) oleh Samuel Maftoul ('') .
(Penggabungan dengan Junio ​​S Hamano - gitster - dalam pelaksanaan d89db6f , 27 Agustus 2018)

 branch.sort: 

Variabel ini mengontrol urutan penyortiran cabang saat menampilkan git-branch .
Tanpa --sort=<value> " --sort=<value> " nilai variabel ini akan digunakan secara default.


Untuk menentukan cabang jarak jauh, gunakan git branch -r --sort=objectsize . Bendera -r menyebabkan -r -nya cabang jauh bukan cabang lokal.

21
16 окт. jawabannya diberikan VonC 16 Oktober. 2015-10-16 08:53 '15 pada 8:53 2015-10-16 08:53

Saya suka menggunakan tanggal relatif dan menyingkat nama cabang sebagai berikut:

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

Apa yang memberi hasil:

 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 meneruskan skrip ke perintah Anda. Berikut ini contoh menambahkan ini saja:

 #!/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)$|$" 
19
30 мая '14 в 1:30 2014-05-30 01:30 jawabannya diberikan n8tr 30 Mei '14 pada 1:30 2014-05-30 01:30

Menambahkan beberapa warna (karena pretty-format tidak 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" 
11
27 янв. jawabannya diberikan epylinkn 27 Jan 2014-01-27 22:23 '14 pukul 10:23 2014-01-27 22:23

Dengan git 2.19 Anda cukup:

 git branch --sort=-committerdate 

Anda juga bisa:

 git config branch.sort -committerdate 

Oleh karena itu, setiap kali Anda menentukan cabang dalam repositori saat ini, cabang akan disortir berdasarkan perintah committerdate.

Jika setiap kali Anda menentukan cabang, Anda ingin mereka diurutkan berdasarkan perintah comitterdate:

 git config --global branch.sort -committerdate 

Penafian: Saya adalah penulis fungsi ini di git, saya menerapkannya ketika saya melihat pertanyaan ini.

9
12 сент. Jawabannya diberikan oleh user801247 12 Sep 2018-09-12 16:05 '18 jam 16:05 2018-09-12 16:05

Saya memiliki masalah yang sama, jadi saya menulis mutiara Ruby yang disebut Twig . Ini daftar cabang dalam urutan kronologis (yang terbaru pertama), dan juga memungkinkan Anda untuk mengatur usia maksimum sehingga Anda tidak mencantumkan semua cabang (jika Anda memiliki banyak dari mereka). 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 untuk menyimpan properti khusus untuk setiap cabang, misalnya, ID tiket, status, todos, dan memfilter daftar cabang sesuai dengan properti ini. Informasi lebih lanjut: http://rondevera.github.io/twig/

8
08 июня '13 в 8:40 2013-06-08 08:40 jawabannya diberikan oleh Ron DeVera 08 Juni '13 pada 8:40 2013-06-08 08:40

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 Anda tidak memiliki column , Anda dapat mengganti baris terakhir.

  | 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 cara kerja yang berbeda.

8
01 авг. jawabannya diberikan bdesham 01 Agustus. 2017-08-01 03:26 '17 pada 3:26 2017-08-01 03:26

FYI, jika Anda ingin mendapatkan daftar cabang yang baru ditulis (bukan yang baru dibuat), Anda dapat menggunakan git reflog:

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

Lihat juga: Bagaimana cara mendapatkan daftar cabang git yang baru-baru ini saya periksa?

7
02 авг. Jawaban diberikan oleh Jordan Brough 02 Agustus 2014-08-02 15:42 '14 pada 15:42 2014-08-02 15:42

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

Kontribusinya adalah ia menarik beberapa warna dari konfigurasi git Anda (atau menggunakan nilai 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}" } 
4
09 апр. jawaban yang diberikan oleh joeytwiddle 09 Apr. 2014-04-09 22:46 '14 pukul 10:46 2014-04-09 22:46

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

Menggunakan dua alias ini

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

Cukup beri nama di git repo, dan ia akan menunjukkan kepada Anda cabang N terakhir (10 secara default) dan angka di arah masing-masing. Masukkan nomor cabang dan cek:

2019

30 нояб. Jawabannya diberikan oleh Agus Arias 30 November 2016-11-30 01:09 '16 pada 1:09 2016-11-30 01:09

Berdasarkan versi ilius, tetapi dengan cabang saat ini, ditunjukkan oleh bintang dan warna, dan hanya menunjukkan sesuatu yang tidak digambarkan sebagai "bulan" atau "tahun" yang lalu:

3
13 авг. balasan yang diberikan oleh Mark Lodato 13 Agustus. 2013-08-13 18:44 '13 pada 18:44 2013-08-13 18:44

Skor 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 
2
01 июля '13 в 16:10 2013-07-01 16:10 jawabannya diberikan oleh saeedgnu 01 Juli '13 pada 16:10 2013-07-01 16:10

Terlambat untuk pesta di sini. Jawaban yang diterima adalah CML yang bertanggung jawab, tetapi jika Anda membutuhkan sesuatu yang indah, seperti GUI, dan asal Anda === "github".

Anda dapat mengklik "Cabang" di repo. atau klik URL >https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
11 июня '14 в 17:36 2014-06-11 17:36 jawabannya diberikan oleh jahrichie 11 Juni '14 pukul 17:36 2014-06-11 17:36

Saya membawa output dari respons yang diterima dalam dialog untuk memberi saya daftar interaktif:

1
14 янв. Balas diberikan oleh John Delaney pada 14 Januari 2016-01-14 17:59 '16 jam 5:59 sore 2016-01-14 17:59

Berikut variasi yang saya cari:

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

tail -r ini tail -r membatalkan daftar, jadi commiterdate terakhir adalah yang terakhir.

1
14 мая '14 в 20:36 2014-05-14 20:36 jawabannya diberikan oleh Ben pada 14 Mei '14 pukul 20:36 2014-05-14 20:36

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

Bagi siapa pun yang tertarik memilah hanya 5 nama cabang teratas berdasarkan tanggal committer.

1
18 янв. jawabannya diberikan oleh vardin pada 18 Januari 2019-01-18 14:02 '19 pada 14:02 2019-01-18 14:02

Git v2.19 mewakili konfigurasi branch.sort dari branch.sort (lihat Branch.sort ).

Dengan demikian, git branch akan mengurutkan secara default committer (desc) dengan

 # gitconfig [branch] sort = -committerdate # desc 

skrip:

 $ git config --global branch.sort -committerdate 

Segarkan:

Jadi

 $ git branch * dev master _ 

dan juga

 $ git branch -v * dev 0afecf5 Merge branch 'oc' into dev master 652428a Merge branch 'dev' _ 7159cf9 Merge branch 'bashrc' into dev 
0
18 сент. jawabannya diberikan 18 September . 2018-09-18 07:53 '18 pada 7:53 2018-09-18 07:53

Saya tahu bahwa sudah ada banyak jawaban, tetapi inilah dua sen saya untuk nama samaran sederhana (saya suka kalau cabang terakhir saya ada di bawah):

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

Ini akan memberi Anda gambaran yang baik tentang 15 cabang berwarna terakhir Anda, dengan cabang saat ini disorot (ditandai dengan tanda bintang).

0
07 февр. Jawab Tom 07 Feb 2019-02-07 03:42 '19 pada 3:42 2019-02-07 03:42

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))' inilah yang Anda butuhkan

0
10 апр. Jawabannya diberikan ChunkCoder 10 April. 2018-04-10 22:32 '18 jam 10:32 malam 2018-04-10 22:32

Pertanyaan lain tentang tag atau Ajukan Pertanyaan