मैं कैसे देख सकता हूं कि कौन सी Git शाखाएं दूरस्थ / अपस्ट्रीम शाखा को ट्रैक कर रही हैं?


824

मुझे पता है कि मैं कर सकता हूं git branch --all, और यह मुझे स्थानीय और दूरस्थ दोनों शाखाओं को दिखाता है, लेकिन यह मेरे बीच के रिश्तों को दिखाने में उपयोगी नहीं है।

मैं किस तरह से शाखाओं को सूचीबद्ध करता हूं जिससे पता चलता है कि कौन सी स्थानीय शाखा किस रिमोट को ट्रैक कर रही है?

जवाबों:


1142

यदि आप स्क्रिप्टिंग के लिए यह चाहते हैं तो बहुत कम चीनी मिट्टी के बरतन आदेश, अच्छा नहीं है:

git branch -vv   # doubly verbose!

ध्यान दें कि git 1.8.3 के साथ, उस अपस्ट्रीम शाखा को नीले रंग में प्रदर्शित किया जाता है (देखें " यह शाखा ट्रैकिंग क्या है (यदि git में कुछ भी? ")


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


3
ऊपर पहला तरीका मेरे लिए वांछित जानकारी प्रदान नहीं करता है। दूसरा ... लगता है कि कुबली के जवाब से काम खत्म हो गया। क्या मैं कुछ भूल रहा हूँ?
garyp

3
@ गैरीप आप सवाल पूछने वाले नहीं हैं। पहला प्रदान करता है कि ओपी को क्या चाहिए, और दूसरा प्रदान करता है कि उसे वास्तव में क्या चाहिए, अगर वह इसे स्क्रिप्टिंग के लिए एक साफ रूप में चाहता था, या इसे केवल एक उपनाम के रूप में सहेजना चाहता था। ("ओवरकिल" ठीक है अगर यह आपको मिलता है जो आप चाहते हैं और आपको इसे दोहराना नहीं है।) इस प्रश्न के दृष्टिकोण से, कुबी का जवाब कुछ बाहरी जानकारी प्रदान करता है, और अगर एक से अधिक दूरस्थ हैं, तो यह नहीं होता है सब कुछ नहीं दिखा, लेकिन अगर यह आपकी जरूरतों को पूरा करता है, तो हर तरह से इसका उपयोग करें।
Cascabel

2
मैं माफी मांगता हूं। जब मैंने मूल रूप से पहली विधि चलाई, तो मुझे क्या पटरियों के बारे में कोई जानकारी नहीं मिली , और मुझे यह स्पष्ट रूप से बताना चाहिए था। लेकिन अब मैं ट्रैकिंग जानकारी देख रहा हूं, इसलिए मुझे अपने सेटअप में कुछ गड़बड़ लगी होगी। तो मुझे कुछ याद आ रहा था
garyp

2
FWIW मैं उलझन में था क्योंकि -v और -vv ऐसे ही आउटपुट दिखाते हैं। ट्रैक की गई शाखा को हैश के बाद और सबसे हाल के कमिट (मेरे डिफ़ॉल्ट OSX होमब्रेव इंस्टॉल पर) से पहले चौकोर कोष्ठक में दिखाया गया है।
जर्कलार्के

3
मेरे लिए यह सब अंतिम प्रतिबद्ध हैश का प्रिंट आउट है और प्रत्येक शाखा के लिए टिप्पणी करता है।
काप्यबर्लेट

263

git remote show origin

जो भी आपके रिमोट का नाम है, उसके साथ 'मूल' को बदलें।


11
हालांकि यह चीनी मिट्टी के बरतन कमांड थोड़े मानव के लिए काम करता है (एक स्क्रिप्ट के लिए इतना नहीं, क्योंकि यह चीनी मिट्टी के बरतन उत्पादन को पार्स करना होगा), मुझे इस दृष्टिकोण के बारे में क्या पसंद नहीं है कि git remote showकमांड वास्तव में रिमोट रेपो से जोड़ता है ... और इसलिए यह विफल हो जाता है यदि आप ऑफ-लाइन हो या किसी भी कारण से रेपो से जुड़ने में असमर्थ हों ...
pvandenberk

17
@pvandenberk आप git remote show -n originऑफ़लाइन होने पर भी कुछ जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं । से Git दूरस्थ प्रलेखन : "-n विकल्प के साथ, दूरदराज के सिर Git ls-दूरदराज के साथ पहली बार पूछे नहीं कर रहे हैं <name>; कैश की गई जानकारी के बजाय प्रयोग किया जाता है।"
सेर्रन

5
इस आदेश के बारे में एक अजीब बात है: यह दूरस्थ शाखाओं को "ट्रैक" के रूप में सूचीबद्ध करता है, भले ही पुल / पुश के लिए कोई स्थानीय शाखा कॉन्फ़िगर न हो। मुझे हमेशा यह भ्रामक लगता है। मैं वास्तव में इस बात पर स्पष्ट नहीं हूँ कि इस आउटपुट में "ट्रैक" का क्या अर्थ है। विषय पर git डॉक्स इसे एक दूरस्थ शाखा की तरह ध्वनि देता है "ट्रैक किया जाता है" केवल जब यह जुड़ा हुआ है / धक्का / खींचने के लिए एक स्थानीय शाखा से जुड़ा हुआ है ...
Hawkeye पार्कर

समस्या यह है कि मुझे इसे सभी दूरस्थ नामों के लिए कॉल करने की आवश्यकता है जब तक कि मैं यह नहीं देखता कि मैं वास्तव में क्या देख रहा हूं।
जोलवी २०'१६

2
@jolvi आप सभी रीमोट के git remote show | xargs git remote show -nलिए संयुक्त ट्रैकिंग जानकारी देखने के लिए दौड़ सकते हैं ।
सिणोली

107

यदि आप इसके लिए मैन पेज git-rev-parseदेखते हैं, तो आप देखेंगे कि निम्नलिखित सिंटैक्स का वर्णन किया गया है:

<branchname>@{upstream}, जैसे master@{upstream},@{u}

@{upstream}एक शाखा (संक्षिप्त रूप <branchname>@{u}) का प्रत्यय उस शाखा को संदर्भित करता है जिसे शाखा शाखा द्वारा निर्दिष्ट शाखा के शीर्ष पर निर्मित किया जाता है। एक लापता ब्रांचनाम वर्तमान में चूक करता है।

इसलिए शाखा के अपस्ट्रीम को खोजने के लिए master, आप यह करेंगे:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

प्रत्येक शाखा के लिए जानकारी प्रिंट करने के लिए, आप कुछ ऐसा कर सकते हैं:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

यह पार्सिंग रेफरी और मैन्युअल रूप से कॉन्फ़िगर करने की तुलना में क्लीनर है।


मैं इसे समझने के बावजूद रि-पार्स में उस बिट को समझ नहीं सका, इसलिए स्पष्ट स्पष्टीकरण के लिए धन्यवाद!
ऐलिस परसेल

3
हम में से उन लोगों के लिए, जो "फ़ीचर / ब्लाब्लह" नामक शाखाओं के साथ-प्रवाह का उपयोग कर रहे हैं, जबकि लूप का समापन विवरण पढ़ना चाहिए: ग्लोब पैटर्न के अंत में दो तारांकन done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)नोट करें ।
markeissler

2
git rev-parse --abbrev-ref HEAD@{upstream}वर्तमान शाखा के लिए अच्छी तरह से काम करने लगता है। यह एक अच्छे git उर्फ ​​के लिए भी बनाता है।
दिगिक्ता

whileपाश वाक्य रचना थोड़ा मुझे अजीब लग रहा है। आप बस उपयोग कर सकते हैं git for-each-ref ... | while read branch; do ...जिसे फीफो की आवश्यकता नहीं है और उसी क्रम में चलता है जैसे कि लिखे गए आदेश।
डैनियल बोहमर

कम से कम git 2.5.1 के बाद, आपके पास एक-लाइनर हैgit for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M

81

कुबी के उत्तर का एक विकल्प उस .git/configफाइल पर एक नज़र रखना है जो स्थानीय रिपॉजिटरी कॉन्फ़िगरेशन को दिखाता है:

cat .git/config


6
इसके अलावा git config --get-regex branch
तामीर दानीली

6
या, और अधिक विशेष रूप से, 'Git config --get-regexp शाखा * मर्ज।'
yoyo

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

प्रत्येक स्थानीय शाखा के लिए एक लाइन दिखाएगा। एक ट्रैकिंग शाखा की तरह दिखेगा:

master <- origin/master

एक गैर-ट्रैकिंग वाला ऐसा दिखेगा:

test <- 

अच्छा, कुछ ऑर्डरिंग और TAB-
dimit

खूबसूरती से संक्षिप्त और आउटपुट वास्तव में स्वीकृत से अधिक पठनीय है git branch -vv। 🙏
Joki

केवल समस्या यह है कि मैं इस याद नहीं कर सकते, तो मैं प्रयोग किया जाता हैgit config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
Joki

38

के लिए वर्तमान शाखा, यहाँ दो अच्छे विकल्प हैं:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

या

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

यह उत्तर यहां भी है , एक अलग सवाल है जो (गलत) एक डुप्लिकेट के रूप में चिह्नित किया गया था।


5
उसके आधार पर, सभी शाखाओं को एक स्क्रिप्ट फ्रेंडली फैशन में सूचीबद्ध किया जा सकता है git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads:।
डैनियल जेम्स

15

वर्तमान शाखा के लिए, आप यह भी कह सकते हैं git checkout(w / o किसी भी शाखा)। यह वर्तमान शाखा के लिए, यदि मौजूद है, तो ट्रैकिंग जानकारी दिखाने के लिए साइड-इफ़ेक्ट वाला एक नो-ऑप है।

$ git checkout 
Your branch is up-to-date with 'origin/master'.

पर्याप्त रूप से उचित है, लेकिन आप गलती से टाइप कर सकते हैं git checkout ., जो कोई विकल्प नहीं है।
टॉमस गैंडर

6

मैं इस उपनाम का उपयोग करता हूं

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

फिर

git track

5
मुझे लगता है कि यह ध्यान देने योग्य है कि दो मापदंडों के साथ आपकी कमांड एक ट्रैक शाखा को कॉन्फ़िगर करती है।
एल्बफन

3

ओलिवियर रिफालो के जवाब के आधार पर

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

यह केवल ट्रैक कॉन्फ़िगर के साथ स्थानीय दिखाता है।

इसे एक स्क्रिप्ट पर लिखें जिसे git-track कहा जाता है अपने रास्ते पर आपको एक git track कमांड मिलेगी

Https://github.com/albfan/git-showupstream पर एक अधिक विस्तृत संस्करण


1

git config --get-regexp "branch\.$current_branch\.remote"

आपको उस रिमोट का नाम देगा जिसे ट्रैक किया जा रहा है

git config --get-regexp "branch\.$current_branch\.merge"

आपको ट्रैक की जाने वाली दूरस्थ शाखा का नाम देगा।

आपको अपनी वर्तमान शाखा के नाम के साथ $ current_branch को बदलना होगा। आप गतिशील रूप से प्राप्त कर सकते हैंgit rev-parse --abbrev-ref HEAD

निम्नलिखित मिनी-स्क्रिप्ट उन चीजों को जोड़ती है। नाम git-trackingवाली फ़ाइल में इसे चिपकाएं, इसे निष्पादन योग्य बनाएं और सुनिश्चित करें कि यह आपके रास्ते में है।

तब आप कह सकते हैं

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

ध्यान दें कि दूरस्थ शाखा का नाम आपके स्थानीय शाखा के नाम से भिन्न हो सकता है (हालाँकि यह आमतौर पर नहीं होता है)। उदाहरण के लिए:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

जैसा कि आप कोड में देख सकते हैं कि यह कुंजी git config से डेटा निकाल रही है। मैं सिर्फ बाहरी डेटा साफ़ करने के लिए sed का उपयोग करता हूं।

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

1

यहाँ एक साफ और सरल है। जांच कर सकते हैं git remote -v, जो आपको वर्तमान शाखा के सभी मूल और अपस्ट्रीम दिखाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.