पता करें कि स्थानीय शाखा किस दूरस्थ शाखा पर नज़र रख रही है


842

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

मैं कैसे पता लगा सकता हूं कि स्थानीय शाखा किस दूरस्थ शाखा पर नज़र रख रही है?

क्या मुझे git configआउटपुट पार्स करने की आवश्यकता है , या क्या कोई कमांड है जो मेरे लिए ऐसा करेगी?


18
शीश। यह वह जगह है नहीं एक सटीक डुप्लिकेट। यह दूसरे का एक सबसेट है, लेकिन बाहर के सवाल करने के अन्य तरीके हैं, जैसे git remote show origin। अन्य प्रश्न में मुख्य उत्तर यहाँ सरल उत्तर के चारों ओर लिपटी हुई एक पटकथा है, जो कुछ के लिए उपयोगी हो सकती है। उम्मीद है कि यह सवाल पूरी तरह से बंद नहीं होगा।
cdunn2001

5
सहमत, यह निश्चित रूप से एक ठग नहीं होना चाहिए। यह लिंक किए गए सवाल से कुछ अलग तरह से पूछ रहा है
एडम बाटकिन

जवाबों:


1002

यहां एक कमांड है जो आपको सभी ट्रैकिंग शाखाएं ('पुल' के लिए कॉन्फ़िगर किया गया) देता है, देखें:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

आपको SHA और किसी भी लंबी-रैपिंग कमिट मैसेज के माध्यम से उतारा जाना है, लेकिन यह टाइप करने के लिए जल्दी है और मुझे 3 कॉलम में लंबवत रूप से संरेखित शाखाएं मिलती हैं।

यदि आपको प्रति शाखा 'पुल' और 'पुश' कॉन्फ़िगरेशन दोनों की जानकारी चाहिए, तो दूसरे उत्तर को देखें git remote show origin


अपडेट करें

जीआईटी संस्करण 1.8.5 से शुरू होकर आप अपस्ट्रीम शाखा के साथ git statusऔर दिखा सकते हैंgit status -sb


6
यह आउटपुट git branch -avया उससे अधिक प्रत्यक्ष है git remote show origin, जो आपको बहुत सारा डेटा देता है, न कि केवल ट्रैक किया हुआ रिमोट
SimpleGy

60
BTW, git (1.8.5.x) के नवीनतम संस्करण भी अब अपस्ट्रीम शाखा दिखाते हैं git statusऔर git status -sb- तो एक बार जब आप 1.8.5.x पर अपग्रेड करते हैं, तो यह प्रश्न (और उत्तर) अप्रासंगिक है।
jdsumsion

11
जबकि यह आपको ऐसी जानकारी देता है जो आप चाहते हैं, मैं इसका सही उत्तर होने पर असहमत हूं। यह उसी तरह से एक उत्तर है जैसे किसी को एक शब्दकोश देने का उत्तर "आप कैसे XYZ जादू करते हैं"। मामले में, आप कुछ ऑपरेशन के लिए परिणामी उत्तर (शाखा का नाम) का उपयोग करना चाहते हैं .. यह उत्तर केवल मुझे नेत्रहीन इसे देखने में मदद करता है ... आपको बाद के आदेश में कुछ भी उपयोगी नहीं देता है।
उपआदाम

इस कमांड का आउटपुट भ्रामक हो सकता है क्योंकि एक प्रतिबद्ध संदेश आसानी से उदाहरण के लिए "[मेरी सुविधा] ..." से शुरू हो सकता है। कृपया @ cdunn2001 का उत्तर देखें जो केवल अपस्ट्रीम शाखा को दिखाता है (यदि कोई हो) और कुछ नहीं।
जोनास बर्लिन

1
मैं @ jonas-berlin से सहमत हूं - cdunn2001 का उत्तर बेहतर है यदि आप परिणाम को पार्स करना चाहते हैं - मेरा उत्तर अच्छा है यदि आप एक साधारण कमांड की तलाश कर रहे हैं और आउटपुट को नेत्रहीन रूप से स्कैन करने के लिए तैयार हैं
jdsums-

372

दो विकल्प:

% 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

12
अच्छा! पहले एक बदसूरत त्रुटियों देता है मामले में कुछ भी नज़र नहीं है, जबकि दूसरा पटकथा के लिए विशेष रूप से उपयोगी है। BTW %(refname:short)वर्तमान रेफरी का नाम है --format
टीनो

9
git help revisions(डॉक्स के अल्पज्ञात लेकिन सबसे उपयोगी भागों में से एक) और खोज करें upstream
cdunn2001

15
यह उत्तर इसके ऊपर दिए गए दो उत्तरों से बहुत बेहतर है, खासकर यदि आप कुछ करना चाहते हैंgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
जियान

2
यह वास्तव में उपयोगी हैecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
अल्बफ़ान

6
यदि आप किसी अन्य शाखा के लिए अपस्ट्रीम का पता लगाना चाहते हैं, तो दूसरी पसंद का एक प्रकार है: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)शाखा नाम के साथ SORBRANCH की जगह, या वर्तमान शाखा के लिए "HEAD"
जोनास बर्लिन

220

मुझे लगता है कि git branch -avकेवल आपको बताता है कि आपके पास कौन सी शाखाएं हैं और वे किस पर प्रतिबद्ध हैं, आपको यह पता लगाने के लिए कि कौन सी दूरस्थ शाखाएं स्थानीय शाखाएं ट्रैक कर रही हैं।

git remote show originस्पष्ट रूप से आपको बताता है कि कौन सी शाखाएं ट्रैक कर रही हैं कौन सी दूरस्थ शाखाएं। यहाँ उदाहरण के लिए एकल प्रतिबद्ध और एक दूरस्थ शाखा के साथ भंडार से आउटपुट है abranch:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

बनाम

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

3
मुझे एक कमांड की आवश्यकता है जो अपस्ट्रीम शाखा को पता चलता है, इसलिए इनपुट के रूप में 'उत्पत्ति' का उपयोग एक धारणा बना रहा है, इसलिए यह मेरे लिए काम नहीं करता है
अलेक्जेंडर मिल्स

1
लेकिन यह ओईएस का जवाब नहीं देता है। कमांड git remote show originआपको स्थानीय शाखाएं दिखाती है और वे पुश और पुल दोनों के लिए क्या ट्रैक करते हैं।
ड्यूडेवड

1
@dewewad मुझे लगता है कि बिंदु यह था कि यह आदेश मानता है कि रिमोट को कहा जाता है origin, जबकि यह वास्तव में कुछ भी हो सकता है (उदाहरण के लिए कई रिमोट, अलग-अलग शाखाओं से अलग-अलग रिमोट से शाखाएं)।
रुस्लान

74

अद्यतन: ठीक है, मुझे यह पोस्ट किए कई साल हो गए हैं! HEAD को अपस्ट्रीम से तुलना करने के अपने विशिष्ट उद्देश्य के लिए, मैं अब उपयोग करता हूं @{u}, जो कि एक शॉर्टकट है जो अपग्रेड ट्रैकिंग शाखा के HEAD को संदर्भित करता है। (देखें https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem )।

मूल उत्तर: मैंने इस समस्या को भी हल किया है। मैं अक्सर एकल रिपॉजिटरी में कई रीमेक का उपयोग करता हूं, और यह भूल जाना आसान है कि आपकी वर्तमान शाखा किसके खिलाफ ट्रैकिंग कर रही है। और कभी-कभी यह जानना आसान होता है, जैसे कि जब आप अपने स्थानीय कमिट को देखना चाहते हैं git log remotename/branchname..HEAD

यह सब सामान git config वैरिएबल में संग्रहित है, लेकिन आपको git config आउटपुट को पार्स करने की आवश्यकता नहीं है। यदि आप किसी चर के नाम के बाद git कॉन्फिगर करते हैं, तो यह केवल उस वेरिएबल के मान को प्रिंट करेगा, जिसकी आवश्यकता नहीं है। इस बात को ध्यान में रखते हुए, यहां आपकी वर्तमान शाखा के ट्रैकिंग सेटअप के बारे में जानकारी प्राप्त करने के लिए कुछ कमांड हैं:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

मेरे मामले में, चूंकि मुझे केवल अपने वर्तमान रिमोट का नाम पता करने में दिलचस्पी है, इसलिए मैं यह करता हूं:

git config branch.`git name-rev --name-only HEAD`.remote

2
यह मेरी वर्तमान शाखा जो कुछ भी है, उसे वापस करने के लिए एक उपनाम बनाने में बहुत उपयोगी था। धन्यवाद!
जस्टिन स्पाहर-समर्स

इसी तरह हमारे 'फास्टफोरवर्ड' उर्फ ​​के लिए उपयोगी है जो स्थानीय ट्रैकिंग शाखा को तब तक आगे बढ़ाएगा जब तक ऑपरेशन तेज-फॉरवर्ड होता है।
Altreus

4
वास्तव में मुझे पता चला कि यह git name-rev --name-only HEADआपको नहीं बताएगा कि आप वास्तव में किस शाखा में हैं। उसके लिए मैंने सिर्फ इस्तेमाल किया थाgit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
धन्यवाद! इसी तरह के सवालों के अन्य जवाबों में @{u}उपनाम / शॉर्टकट का उल्लेख नहीं किया गया है और यह वही है जो मैं देख रहा था! मास्टर शाखा के साथ तुलना करने का कोई कारण नहीं है यदि आप केवल यह निर्धारित करना चाहते हैं कि आपको खींचने की आवश्यकता है या नहीं।
डैन एम।

1
@{u}बम है। और 1.7.0 के आसपास से रहा है, जिसका अर्थ है कि अगर यह 2018 में किसी व्यक्ति द्वारा उपयोग किए जाने वाले गिट में उपलब्ध नहीं है, तो वे संभवतः एक उन्नयन के कारण हैं।
क्रिस क्लेलैंड

48

स्थानीय शाखाएं और उनके उपाय।

git branch -vv 

सभी शाखाएँ और ट्रैकिंग रिमोट।

git branch -a -vv

देखें कि पुश और पुल के लिए स्थानीय शाखाएँ स्पष्ट रूप से कहाँ कॉन्फ़िगर की गई हैं।

git remote show {remote_name}

21

यह आपको उस शाखा को दिखाएगा जिस पर आप हैं:

$ git branch -vv

यह केवल उस वर्तमान शाखा को दिखाएगा जिस पर आप हैं:

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

उदाहरण के लिए:

myremote/mybranch

आप उस दूरस्थ शाखा का URL पता कर सकते हैं जिसका उपयोग वर्तमान शाखा द्वारा किया जाता है :

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

उदाहरण के लिए:

https://github.com/someone/somerepo.git

19

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

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

17

मुझे नहीं पता कि क्या यह गिट कॉन्फिग के आउटपुट को पार्स करने के रूप में गिना जाता है, लेकिन यह रिमोट के URL को निर्धारित करेगा जो मास्टर है:

$ git config Remote। $ (git config branch.master.remote) .url

या git config branch.$(git symbolic-ref -q HEAD).remoteयदि आप अभी चाहते हैं तो रिमोट का नाम वर्तमान शाखा से ट्रैक किया जाना चाहिए- git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlURL के लिए।
उत्तराखंड

मुझे --shortविकल्प जोड़ने की जरूरत थी इसलिए यह काम करता है। इसलिए वर्तमान शाखा का रिमोट नाम git config branch.$(git symbolic-ref -q --short HEAD).remoteपाने के लिए : और वर्तमान शाखा के रिमोट का URL प्राप्त करने के लिए:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
नेल्सन

13

फिर भी एक और तरीका

git status -b --porcelain

यह आपको देगा

## BRANCH(...REMOTE)
modified and untracked files

10

एक और सरल तरीका उपयोग करना है

cat .git/config एक git रेपो में

यह स्थानीय शाखाओं के लिए विवरण सूचीबद्ध करेगा


लिनक्स पर अच्छी तरह से काम करता है। विंडोज पर तब तक काम नहीं करेगा जब तक कि यूनिक्स जैसा प्रॉम्प्ट (जैसे साइबरविन या गिट बैश) न हो।
कंटैंगो

विंडोज में सादे कमांड लाइन पर पाठ्यक्रम के type .git/configबजाय बस का उपयोग करें cat .git/config..
khmarbaise

9

एक और तरीका (धन्यवाद ओसे), अगर आप जानना चाहते हैं कि यह मौजूद है या नहीं:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

क्या भाषा? यह एक लिनक्स शेल स्क्रिप्ट की तरह दिखता है, लेकिन कोई अन्य जानकारी या संदर्भ नहीं देता है।
सनकैट २२

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : यह हिस्सा सभी स्थानीय शाखाओं के साथ-साथ उनकी अपस्ट्रीम शाखा को दिखाएगा।

grep 'BRANCH_NAME' : यह ब्रांच लिस्ट से करंट ब्रांच को फिल्टर करेगा।



5

स्थानीय और दूरस्थ दोनों शाखाओं को सूचीबद्ध करता है:

$ git branch -ra

आउटपुट:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

git-status पोर्सिलेन (मशीन-पठनीय) v2 आउटपुट इस तरह दिखता है:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

और शाखा को केवल ऊपर की ओर प्राप्त करने के लिए:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

यदि शाखा में कोई अपस्ट्रीम नहीं है, तो उपरोक्त कमांड एक खाली आउटपुट (या साथ विफल set -o pipefail) पैदा करेगा।


2

यदि आप किसी शाखा के लिए अपस्ट्रीम ढूंढना चाहते हैं (जैसा कि आप जिस पर हैं, उसके विपरीत), तो यहाँ @ cdunn2001 के उत्तर में थोड़ा सा संशोधन किया गया है:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

यह आपको स्थानीय शाखा के नाम की दूरस्थ शाखा का नाम देगा YOUR_LOCAL_BRANCH_NAME


2

आप यह कोशिश कर सकते हैं:

git remote show origin | grep "branch_name"

branch_name अपनी शाखा से प्रतिस्थापित करने की आवश्यकता है


यदि आपकी शाखा का नाम अन्य शाखाओं से मेल खाता है तो क्या होगा? क्या होता है git remote show origin- यदि आपके शाखा का नाम आउटपुट में किसी अन्य पाठ से मेल खाता है - यदि इसे कहा जाता है mergesया configure?
टॉम स्विरली

आप नहीं मिले क्या आपका मतलब है एक ही नाम वाली कई शाखाएँ
xpioneer

1

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

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

फिर

git track

ध्यान दें कि स्क्रिप्ट का उपयोग सेटअप ट्रैकिंग के लिए भी किया जा सकता है।

Https://github.com/orefalo/bash-profiles पर अधिक महान उपनाम


0

मैं EasyGit (उर्फ "उदा") का उपयोग Git के शीर्ष पर (या साथ में) एक सुपर हल्के आवरण के रूप में करता हूं । ईज़ीगिट में एक "जानकारी" उपकमांड है जो आपको वर्तमान शाखाओं के दूरस्थ ट्रैकिंग शाखा सहित सभी प्रकार की सुपर उपयोगी जानकारी प्रदान करता है। यहां एक उदाहरण है (जहां वर्तमान शाखा का नाम "फू" है):

pknotz @ s883422: (फू) ~ / कार्यक्षेत्र / बी.डी.
$ उदा जानकारी
कुल कमीशन: 175
स्थानीय भंडार: .it
नामित रिमोट रिपॉजिटरी: (नाम -> स्थान)
  मूल -> git: //sahp7577/home/pknotz/bd.git
वर्तमान शाखा: फू
  क्रिप्टोग्राफिक चेकसम (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  डिफ़ॉल्ट पुल / पुश रिपॉजिटरी: मूल
  डिफ़ॉल्ट पुल / पुश विकल्प:
    शाखा।फू।मोटे = उत्पत्ति
    Branch.foo.merge = refs / heads / aal_devel_1
  योगदानकर्ताओं की संख्या: 3
  फाइलों की संख्या: 28
  निर्देशिका की संख्या: 20
  सबसे बड़ी फ़ाइल का आकार, बाइट्स में: 32473 (pygooglechart-0.2.0 / COPYING)
  कमिट्स: 62

0

इस उत्तर पर सुधार करते हुए , मैं इन .gitconfigउपनामों के साथ आया :

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

वह कौन सी भाषा है?
डैनियल फैरेल

3
@ डान फैरेल: शेल। उपनाम एक के साथ शुरू! उपयोग / बिन / श। Git की कॉन्फिग फ़ाइल के लिए दोहरे उद्धरण उद्धृत किए गए हैं।
टॉम हेल

0

यदि आप ग्रैडल का उपयोग कर रहे हैं,

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }

-2

निम्न आदेश दूरस्थ मूल वर्तमान कांटा का जिक्र है

git रिमोट -v

दूरस्थ पथ जोड़ने के लिए,

git रिमोट ऐड ओरिजिन पाथ_नाम


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