मैं हाल ही में किए गए आदेश के अनुसार, Git शाखाओं की सूची कैसे प्राप्त कर सकता हूं?


1322

मैं सबसे ऊपर "सबसे ताज़ी" शाखाओं के साथ एक गिट रिपॉजिटरी में सभी शाखाओं की एक सूची प्राप्त करना चाहता हूं, जहां "सबसे ताजी" शाखा वह है जो हाल ही में प्रतिबद्ध है (और इसलिए, एक होने की अधिक संभावना है मैं) पर ध्यान देना चाहता हूं।

क्या कोई ऐसा तरीका है जिससे मैं या तो (ए) नवीनतम प्रतिबद्ध द्वारा शाखाओं की सूची को सॉर्ट कर सकता हूं, या (बी) किसी एक तरह की मशीन-पठनीय प्रारूप में, प्रत्येक की अंतिम-प्रतिबद्ध तारीख के साथ शाखाओं की सूची प्राप्त कर सकता हूं?

सबसे खराब स्थिति, मैं हमेशा git branchसभी शाखाओं की एक सूची प्राप्त करने के लिए चला सकता हूं , इसके उत्पादन को पार्स कर सकता हूं , और फिर git log -n 1 branchname --format=format:%ciप्रत्येक के लिए, प्रत्येक शाखा की प्रतिबद्ध तिथि प्राप्त कर सकता हूं । लेकिन यह एक विंडोज बॉक्स पर चलेगा, जहां एक नई प्रक्रिया को स्पिन करना अपेक्षाकृत महंगा है, इसलिए प्रति शाखा एक बार Git निष्पादन योग्य लॉन्च करने से बहुत सारी शाखाएं होने पर धीमी हो सकती हैं। वहाँ एक ही आदेश के साथ यह सब करने के लिए एक रास्ता है?


2
stackoverflow.com/a/2514279/1804124 का बेहतर उत्तर है।
स्पंदुन

12
@ शुंदुन, तुमने मुझे वहीं खो दिया। पर्ल और सेड के माध्यम से पाइप किए गए सामान सहित कई कमांड का संयोजन कैसे होता है, जो पहले से मौजूद Git के कमांड का उपयोग करने से "बेहतर" है?
जो व्हाइट

36
@ git for-each-refजैकब नरundबस्की से जवाब के बारे में : आप refs/remotes/इसके बजाय refs/heads/(या आप दोनों को पास कर सकते हैं, व्हॉट्सएप-अलग हो सकते हैं); refs/tags/टैग्स के लिए, या केवल refs/तीनों प्रकारों के लिए।
jakub.g

4
शुरू 2.7 git (Q4 2015), अब और नहीं for-each-ref! आप सीधे उपयोग करेंगे git branch --sort=-committerdate: नीचे मेरा उत्तर देखें
VonC

जवाबों:


1873

के --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
@ सिलसिला: क्यों नहीं इस्तेमाल करते :shortname?
जकुब नारबस्की

37
@ हिलस: जैसा @BeauSmith ने लिखा है git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/:। git-for-प्रत्येक-रेफरी (1) मैनपेज कहता है: रेफ एपेंड के गैर-अस्पष्ट लघु नाम के लिए :short
जैकब नार

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 for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

परिणाम:

हाल की गिट शाखाएँ


4
आप --format=%(refname:short)भरोसा करने के बजाय भी इस्तेमाल कर सकते हैं cut
चैतन्य गुप्त

3
क्या REMOTE रिपॉजिटरी के लिए ऐसा करने का कोई तरीका है?
एलन बोव

10
aah - @ jakub.g पहले से ही समझाया गया है: आप दूरस्थ शाखाएँ पास कर सकते हैं refs / remotes / बजाय refs / heads /। उत्तम!!
एलन बोवे

मुझे यह पसंद है, अगर आप इसे उर्फ ​​करने की कोशिश कर रहे हैं, जो मैंने किया था, git rbउद्धरणों में कमांड को घेरने के लिए याद करने के लिए:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
माइकल डिस्जेनिया

2
और अब आप ऐसा कर सकते हैं git branch, इसलिए स्थानीय, दूरस्थ या सभी शाखाओं को प्राप्त करना, जैसे- शाखा-शाखा (यानी -आर, -ए) पर काम करता है। 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))'
फोर्ड

89

यहाँ इष्टतम कोड है, जो अन्य दो उत्तरों को जोड़ता है:

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

2
किसी कारण से मुझे खिड़कियों पर दोहरे-उद्धरणों का उपयोग करना पड़ा, लेकिन अन्यथा ये ठीक काम करते हैं :)
amenthes

1
@schoetbi यह कोड बिल्कुल निकोल के समान दिखता है, आपने इसे सारणीबद्ध बनाने के लिए क्या परिवर्तन किया?
एनरिको

@ एनिको और अन्य जो एक ही चीज़ के बारे में आश्चर्यचकित कर सकते हैं। निकोले ने 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
यह प्रश्न के अनुसार प्रतिबद्ध तिथि के अनुसार नहीं है।
कैस

1
क्या git branch -vसूचीबद्ध प्रत्येक प्रतिबद्ध की तारीख को शामिल करना आसान है ?
dumbledad

1
कैसे के बारे में <pre> git Branch -v --sort = committerdate </ pre>?
इराज जेलोदरी

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'|'और अगर किरदार आपके लोकेल में रिश्तेदार टाइमस्टैम्प के अंदर हो सकता है तो उसे पाइप करें।
ब्योर्न लिंडक्विस्ट

1
महान उर्फ, बहुत बहुत धन्यवाद। क्या आप इसे चालू शाखा को दूसरे रंग के साथ या शुरुआत में * दिखाने के लिए सुधार सकते हैं?
elhadi dp ıpɐɥ had

2
कम से कम git के नवीनतम संस्करण में आप कमांड '%(HEAD) ...'स्ट्रिंग के बिना समान प्रभाव प्राप्त करने के लिए प्रारूप स्ट्रिंग की शुरुआत में जोड़ सकते हैंsed
जोशुआ Skrzypek

5
मैं इसे 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'|'
वेस्ले स्मिथ

11
मुझे रंग पाने के लिए --color = हमेशा जोड़ना था। 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-प्रत्येक- ref-sort = -committerdate refs / heads / --format = '% (परस् थान: संक्षिप्त)% (रंग: लाल)% (ऑब्जेक्टनाम: लघु)% (रंग: पीला)% (Refname: short )% (रंग: रीसेट) (% (रंग: हरा)% (कमिटेटर: रिश्तेदार)% (रंग: रीसेट)) ')

आउटपुट का स्क्रीनशॉट


1
जैसा कि मैंने सीधे तौर पर गिट ब्रांच का उपयोग करने की तुलना में अच्छा, अधिक रंगीन लगता है जैसा कि मैंने stackoverflow.com/a/33163401/6309 में सुझाया है । +1
वॉनसी

2
यह एक मेरे लिए बॉक्स से बाहर काम करता था, कुछ अन्य लोगों के विपरीत, इसलिए मैंने इसके लिए मतदान किया।
केसी

1
के रूप में वास्तव में अच्छी तरह से काम किया है! धन्यवाद! :-)
फ्रोजनटार्ज़न

1
डिट्टो - यह एक आउट-ऑफ-बॉक्स काम करता है, दूसरों की संख्या के विपरीत मैंने अभी-अभी कोशिश की है। धन्यवाद।
डैन निसेनबौम नोव

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

क्योंकि उद्धृत करना कठिन हो सकता है, यहाँ बैश के लिए उपनाम है:

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

$ <अपने यहाँ आदेश> awk: लाइन 1 के पास सिंटैक्स त्रुटि: awk: 1 लाइन के पास बाहर bailing
जेमी मेसन

@GotNoSugarBaby आप उदाहरण जैसे सही उद्धरण का उपयोग कर रहे हैं? आप किस खोल का उपयोग कर रहे हैं? बैश उस चरित्र को एक विशेष अर्थ देता है अन्यथा।
एस्टनी

हे, मैंने इसे / बिन / बैश (GNU बैश, संस्करण 4.0.28 (1) -release (i386-pc-Solaris2.11)) पर अपने उदाहरण की एक सीधी कॉपी और पेस्ट के साथ चलाया - लेकिन तब से मैं चला हूँ यह / बिन / बैश (GNU बैश, संस्करण 3.2.48 (1) -release (x86_64-apple-darwin12) पर है और यह काम करता है, इसलिए मैं डाउन-वोट को हटा दूंगा। बहुत बहुत धन्यवाद।
जेमी मेसन

@GotNoSugarBaby I का उपयोग 4.2.25 (1) -release (x86_64-pc-linux-gnu) nad ने 3.x पर किया और काम किया। मुझे यकीन नहीं है कि यह क्या मुद्दा था ... लेकिन इसमें बैश के बजाय एक git संस्करण संबंधित मुद्दा हो सकता है। किसी भी मामले में, मुझे खुशी है कि यह आपके लिए काम करता है!
एस्टानी

1
@MichaelDiscenza बस सब कुछ सिर पर लगा देता है। यह | head -n20अंत में जोड़ना होगा । यदि आप उपनाम का उपयोग कर रहे हैं, तो सुनिश्चित करें कि यह उद्धरण के भीतर जाता है ।
एस्टानी

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वास्तव में उपयोगी हो सकता है, धन्यवाद। हालांकि, यह समाधान अभी भी प्रत्येक शाखा के लिए नई प्रक्रियाओं को जन्म देता है, जिससे ओपी बचना चाहता था।
मुसिली

वास्तव में git branchविशेष रूप से के अर्थ को परिभाषित नहीं करता -vvहै, लेकिन केवल की -vहै, तो -vvके रूप में ही होना चाहिए -v
मुशफिल

2
यह सबसे अच्छा है। और -avv को जोड़ने से यह दूरस्थ शाखाओं को भी ध्यान में रखता है। इसके लिए धन्यवाद!
गोपुरखान

@musiphil मेरा git ब्रांच मैनपेज, सेक्शन -v, -vv, --verboseमें निम्नलिखित शामिल हैं:If given twice, print the name of the upstream branch, as well
Perleone

@Perleone: मुझे नहीं पता कि मुझे वह जानकारी कैसे मिली, लेकिन आप सही हैं, और मैं सही हूं। धन्यवाद!
मुशीफिल

23

git २. g (Q4 २०१५) सीधे उपयोग करके शाखा छँटाई पेश करेगा git branch: कमिट
देखें a3bc55 , कमिट aedcb7d , कमिट १५११ b२२ , कमिट F65f139 , ... (23 सितं, 2015), aedcb7d प्रतिबद्ध , प्रतिबद्ध 1511b22 , ca41799 प्रतिबद्ध , (24 सितं, 2015) और प्रतिबद्ध f65f139 , ... (23 सितंबर 2015) कार्तिक नायक ( KarthikNayak) द्वारा
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 7f11b48 , 15 अक्टू 2015)

विशेष रूप से, प्रतिबद्ध aedcb7d :

branch.c: ' ref-filter' एपीआई का उपयोग करें

Refs छँटाई के माध्यम से पुनरावृत्ति के लिए ' branch.c' उपयोग ' ref-filter' एपीआई बनाओ । यह ' branch.c' में प्रयुक्त अधिकांश कोड को ' ref-filter' पुस्‍तकालय में कॉल के साथ प्रतिस्थापित करता है ।

यह विकल्प जोड़ता है--sort=<key> :

दिए गए कुंजी के आधार पर क्रमबद्ध करें। मूल्य के अवरोही क्रम में सॉर्ट करने के लिए
उपसर्ग -

आप --sort=<key>कई बार विकल्प का उपयोग कर सकते हैं , जिस स्थिति में अंतिम कुंजी प्राथमिक कुंजी बन जाती है।

समर्थित कुंजी उन लोगोंgit for-each-ref के समान है
पूर्ण refname ( refs/...उपसर्ग सहित ) के आधार पर सॉर्ट करने के लिए क्रम डिफॉल्ट को सॉर्ट करें । इस सूचियों ने पहले (फिर वर्तमान) एचएएडी को अलग किया, फिर स्थानीय शाखाओं और अंत में रिमोट-ट्रैकिंग शाखाओं को।

यहाँ:

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

कार्तिक नायक ( ) द्वारा 9e46833 (30 अक्टूबर 2015) भी देखें । हेल्प-बाय: जूनियो सी हमानो ( )KarthikNayak
gitster
( जूनियो सी gitsterहमानो द्वारा विलय - - में ४१५० ९ ५ एफ , ०३ नवंबर २०१५)

जब संख्यात्मक मानों (जैसे --sort=objectsize) के अनुसार छंटनी की जाती है, तो दोनों मूल्य एक ही मूल्य रखने पर कोई कमबैक तुलना नहीं होती है। यह अनपेक्षित परिणाम पैदा कर सकता है (यानी समान मूल्यों के साथ लिस्टिंग के क्रम पूर्व निर्धारित नहीं किए जा सकते हैं) जैसा कि जोहान्स सिक्सट ( $ gmane / 280117 ) द्वारा बताया गया है ।

इसलिये, जब भी अन्य मानदंड बराबर होते हैं, रिफाइनरी के आधार पर वर्णमाला की तुलना में गिरावट

$ git branch --sort=objectsize

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

Git 2.19 के साथ, क्रम क्रम डिफ़ॉल्ट रूप से सेट किया जा सकता है।
git branchएक विन्यास का समर्थन करता है branch.sort, जैसे git tag, जिसमें पहले से ही एक विन्यास था tag.sortशमूएल मफ़तउल (``) द्वारा 560ae1c (16 अगस्त 2018)
के लिए प्रतिबद्ध देखें । ( जूनियो सी हमानो द्वारा विलय -
gitster में d89db6f प्रतिबद्ध , 27 अगस्त 2018)

branch.sort:

यह चर प्रदर्शित होने पर शाखाओं के क्रम क्रम को नियंत्रित करता है git-branch । प्रदान किए
गए " --sort=<value>" विकल्प के बिना , इस चर का मान डिफ़ॉल्ट के रूप में उपयोग किया जाएगा।


दूरस्थ शाखाओं को सूचीबद्ध करने के लिए, उपयोग करें git branch -r --sort=objectsize-rझंडा यह स्थानीय शाखाओं के बजाय दूरस्थ शाखाओं सूची का कारण बनता है।


Git 2.27 (Q2 2020) के साथ, " git branch" और अन्य " for-each-ref" वेरिएंट ने --sort=<key>पूर्ववर्तीता के बढ़ते क्रम में कई विकल्पों को स्वीकार किया , लेकिन इसके पास कुछ टूटने थे, " --ignore-case" हैंडलिंग, और refname के साथ टाई-ब्रेकिंग, जो तय हो गए हैं।

जेफ किंग ( ) द्वारा 7c5045f , 76f9e56 (03 मई 2020) के लिए प्रतिबद्ध देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 6de1630 , 08 मई 2020)peff
gitster

ref-filter: सभी उपयोगकर्ता प्रकारों के बाद ही फ़ॉलबैक रीफ़ाइन सॉर्ट लागू करें

साइन-ऑफ-बाय: जेफ किंग

9e468334b4 के लिए प्रतिबद्ध (" ref-filterवर्णमाला की तुलना में गिरावट", 2015-10-30, Git v2.7.0-rc0 - बैच # 10 में सूचीबद्ध मर्ज ) ने refnames की तुलना करने के लिए Refback के फ़िल्टर-अप को सिखाया। लेकिन यह गलत स्तर पर किया गया था , उपयोगकर्ता से एक एकल " " कुंजी के लिए तुलना परिणाम को ओवरराइड करने के बजाय सभी प्रकार की चाबियाँ समाप्त होने के बाद।
--sort

यह एकल " --sort" विकल्प के लिए सही तरीके से काम करता है , लेकिन कई लोगों के लिए नहीं।
हम पहली कुंजी में किसी भी संबंध को तोड़ देंगे और कभी भी दूसरी कुंजी का मूल्यांकन नहीं करेंगे।

मामलों को और भी दिलचस्प बनाने के लिए, हमने केवल कभी-कभी इस कमबैक को लागू किया है!
एक फ़ील्ड जैसे " taggeremail" जिसके लिए एक स्ट्रिंग तुलना की आवश्यकता होती है, हम वास्तव में परिणाम को वापस कर देंगे strcmp(), भले ही यह 0. था
लेकिन संख्यात्मक " value" जैसे फ़ील्ड के लिए "taggerdate " के लिए, हमने फॉलबैक लागू किया। और इसीलिए हमारे कई तरह के परीक्षण में चूक हुई: यह taggeremailमुख्य तुलना के रूप में उपयोग होता है ।

तो चलिए शुरू करते हैं और अधिक कठोर परीक्षा को जोड़कर। हमारे पास दो टैगर ईमेल, दिनांक, और Refnames के हर संयोजन को व्यक्त करने वाले कमिट का एक सेट होगा। तब हम पुष्टि कर सकते हैं कि हमारा क्रम सही पूर्वता के साथ लागू किया गया है, और हम स्ट्रिंग और मूल्य तुलनित्र दोनों को मारेंगे।

यह बग को दिखाता है, और फिक्स सरल है: बाहरी में गिरावट की ओर बढ़ रहा है compare_refs() सभी फ़ंक्शन ref_sortingसमाप्त हो जाने के बाद, फ़ंक्शन में ले जा रहा है।

ध्यान दें कि बाहरी फ़ंक्शन में हमारे पास "ignore_case"ध्वज नहीं है , क्योंकि यह प्रत्येक व्यक्तिगत ref_sortingतत्व का हिस्सा है । यह बहस करने योग्य है कि इस तरह की गिरावट क्या होनी चाहिए, क्योंकि हमने उपयोगकर्ता की कुंजी का उपयोग मैच के लिए नहीं किया था।
लेकिन अब तक हम उस झंडे का सम्मान करने की कोशिश कर रहे हैं, इसलिए सबसे कम-आक्रामक बात यह है कि ऐसा करने की कोशिश करते रहें।
चूंकि वर्तमान कोड के सभी कॉलर्स या तो सभी कुंजियों के लिए ध्वज सेट करते हैं या किसी के लिए नहीं, हम केवल पहली कुंजी से ध्वज को खींच सकते हैं। काल्पनिक दुनिया में जहां उपयोगकर्ता वास्तव में कुंजियों की असंवेदनशीलता को अलग से फ्लिप कर सकता है, हम उस मामले को एक कंबल से अलग करने के लिए कोड का विस्तार करना चाह सकते हैं --ignore-case


सूची इस विकल्प के साथ remotes के लिए, जोड़ने-r
ट्रॉय डेनियल

@ ट्रॉयडनील्स सहमत हुए। आप उत्तर संपादित कर सकते हैं। मैं आपके संपादन की समीक्षा करूंगा।
वॉनस

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

मैं आपके सभी पसंदीदा उपनाम जोड़ने और फिर आपकी टीम को स्क्रिप्ट साझा करने के लिए बैश फ़ाइल बनाने की सलाह देता हूं। यहाँ सिर्फ एक को जोड़ने के लिए एक उदाहरण दिया गया है:

#!/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'
फैक्टर मिस्टिक

1
फैंसी रंगीन आउटपुट फैंसी है, लेकिन यह सरल है और बस मैं जो देख रहा था। दूरस्थ शाखाओं पर एक नज़र रखने के refs/headsसाथ बदलें refs/remotes
लैम्बर्ट

आदेश ही प्यारा है, लेकिन उपनाम एक त्रुटि फेंकता है: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

इसलिए जब भी आप वर्तमान रिपॉजिटरी में शाखाओं को सूचीबद्ध करते हैं, तो इसे कमिटेट द्वारा क्रमबद्ध किया जाएगा।

जब भी आप शाखाओं को सूचीबद्ध करते हैं, तो आप चाहते हैं कि उन्हें कमिटेट द्वारा क्रमबद्ध किया जाए:

git config --global branch.sort -committerdate

डिस्क्लेमर: मैं गिट में इस फीचर का लेखक हूं, और जब मैंने यह प्रश्न देखा तो मैंने इसे लागू किया।


2
अधिकांश अप-टू-डेट उत्तर, जटिल लिपियों या उपनामों का उपयोग करने की तुलना में बहुत आसान
m

सावधानी से प्रयोग करें! सभी से सावधान रहें, यह शाखाओं को सूचीबद्ध करने के लिए एक कमांड नहीं है। यह गिट के विन्यास को बदलने के लिए एक आदेश है और इसमें स्थायी वैश्विक नतीजे होंगे।
जाजिमोव

1
@ जाजिमोव आप सही हैं, मैंने उत्तर को संपादित किया ताकि यह स्पष्ट हो
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

                              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

यह आपको प्रत्येक शाखा के लिए कस्टम गुण संग्रहीत करने देता है, जैसे, टिकट आईडी, स्थिति, टॉडोस, और इन गुणों के अनुसार शाखाओं की सूची को फ़िल्टर करना। अधिक जानकारी: http://rondevera.github.io/twig/


5
यह नाम शायद मदद न करे क्योंकि मुझे पूरा यकीन है कि एक ही नाम के साथ सॉफ्टवेयर के कुछ टुकड़े वहाँ हैं।
वक्रोच

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
VonC

@DanNissenbaum सुनिश्चित करें कि आप Git 2.13 (मई 2017 में रिलीज़) या बाद में उपयोग कर रहे हैं।
ब्रेडशाम

7

FYI करें, यदि आप हाल ही में जाँच की गई शाखाओं की सूची प्राप्त करना चाहते हैं (जैसा कि हाल ही में किए गए विरोध के अनुसार) तो आप Git के रिफ्लॉग का उपयोग कर सकते हैं:

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

यह भी देखें: मैं उन शाखाओं की सूची कैसे प्राप्त कर सकता हूं जिन्हें मैंने हाल ही में देखा है?


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

उन दो उपनामों का उपयोग करना:

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

बस एक गिट रिपॉजिटरी में कॉल करें, और यह आपको अंतिम एन शाखाओं (डिफ़ॉल्ट रूप से 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
किस तरह की स्क्रिप्ट? दे घुमा के?
पीटर मोर्टेंसन

2

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

केवल शीर्ष 5 शाखा नामों को प्राप्त करने में रुचि रखने वाले किसी भी व्यक्ति के लिए, कमिट डेट के आधार पर छांटा गया।


2

स्वीकृत कमांड-लाइन उत्तर चट्टानें हैं, लेकिन अगर आप GUI की तरह कुछ प्रिटियर चाहते हैं, और आपकी उत्पत्ति === "जीथब" है।

आप रिपॉजिटरी में "शाखाएँ" पर क्लिक कर सकते हैं। या सीधे URL को हिट करें: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches


1

यहाँ वह भिन्नता है जिसकी मुझे तलाश थी:

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

यह tail -rसूची को उलट देता है इसलिए सबसे हाल ही commiterdateमें अंतिम है।


3
आप इसे पूरा करने के लिए --sort = -commitdate to --sort = committerdate भी बदल सकते हैं।
रेफ़ॉर्म


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

मुझे पता है कि पहले से ही बहुत सारे उत्तर हैं, लेकिन यहाँ एक साधारण उपनाम के लिए मेरे दो सेंट हैं (मुझे सबसे नीचे हाल में अपनी शाखा देना पसंद है):

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

यह आपको आपकी नवीनतम 15 शाखाओं का एक अच्छा अवलोकन देगा, रंग में, आपकी वर्तमान शाखा को हाइलाइट करने के साथ (और इसमें एक तारांकन है)।


1

मैक को 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.sortconfig विकल्प (देखें 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.