गिट चेकआउट - ट्रैक मूल / शाखा और गिट चेकआउट-बी शाखा मूल / शाखा के बीच अंतर


208

क्या किसी को दूरस्थ शाखा को बदलने और ट्रैक करने के लिए इन दोनों आदेशों के बीच का अंतर पता है?

git checkout -b branch origin/branch
git checkout --track origin/branch

मुझे लगता है कि दोनों दूरस्थ शाखा का ध्यान रखते हैं ताकि मैं अपने परिवर्तनों को मूल पर शाखा में धकेल सकूं, सही?

क्या कोई व्यावहारिक अंतर है ??

धन्यवाद!

जवाबों:


281

दोनों आदेशों का एक ही प्रभाव है ( रॉबर्ट सिमर के जवाब के लिए धन्यवाद )।

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

  • git checkout -b mybranch origin/abranchबनाएंगे mybranchऔर ट्रैक करेंगेorigin/abranch
  • git checkout --track origin/abranchकेवल ' abranch' का निर्माण करेगा , एक अलग नाम वाली शाखा का नहीं।

(यह है, जैसा कि सेबस्टियन ग्राफ द्वारा टिप्पणी की गई थी , अगर स्थानीय शाखा पहले से मौजूद नहीं थी ।
यदि ऐसा हुआ, तो आपको इसकी आवश्यकता होगी git checkout -B abranch origin/abranch)


नोट: Git 2.23 (Q3 2019) के साथ, जो नई कमांड काgit switch उपयोग करेगा :

git switch -c <branch> --track <remote>/<branch>

यदि शाखा कई रीमोट में मौजूद है और उनमें से एक को checkout.defaultRemoteकॉन्फ़िगरेशन चर द्वारा नाम दिया गया है , तो हम उस एक का उपयोग अव्यवस्था के उद्देश्यों के लिए करेंगे, भले ही <branch>सभी रीमोट में अद्वितीय न हो। अगर यह अस्पष्ट है, लेकिन 'मूल' रिमोट पर मौजूद है, तो
इसे checkout.defaultRemote=originहमेशा दूरस्थ शाखाओं की जांच करने के लिए उदा में सेट करें <branch>

यहाँ, ' -c' नया है ' -b'।


सबसे पहले, कुछ पृष्ठभूमि: ट्रैकिंग का मतलब है कि एक स्थानीय शाखा का एक दूरस्थ शाखा के लिए अपस्ट्रीम सेट है:

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branch मर्जी:

  • branchद्वारा संदर्भित बिंदु पर बनाएँ / रीसेट करें origin/branch
  • शाखा बनाएं branch(साथ git branch) और दूरस्थ ट्रैकिंग शाखा को ट्रैक करें origin/branch

जब एक स्थानीय शाखा को दूरस्थ-ट्रैकिंग शाखा से शुरू किया जाता है, तो Git शाखा (विशेष रूप से branch.<name>.remoteऔर branch.<name>.mergeकॉन्फ़िगरेशन प्रविष्टियाँ) को सेट करता है, ताकि git pullरिमोट-ट्रैकिंग शाखा से उचित रूप से विलय हो सके।
यह व्यवहार वैश्विक branch.autosetupmergeकॉन्फ़िगरेशन ध्वज के माध्यम से बदला जा सकता है । सेटिंग --trackऔर --no-trackविकल्पों का उपयोग करके उस सेटिंग को ओवरराइड किया जा सकता है , और बाद में गिट शाखा का उपयोग करके बदल दिया जा सकता है --set-upstream-to


और git checkout --track origin/branchवैसा ही करेंगे git branch --set-upstream-to):

 # or, since 1.7.0
 git branch --set-upstream upstream/branch branch
 # or, since 1.8.0 (October 2012)
 git branch --set-upstream-to upstream/branch branch
 # the short version remains the same:
 git branch -u upstream/branch branch

यह ' branch' के लिए अपस्ट्रीम भी सेट करेगा ।

(नोट: git1.8.0 अपग्रेड करेगा git branch --set-upstreamऔर इसे बदल देगा git branch -u|--set-upstream-to: git1.8.0-rc1 घोषणा देखें )


एक स्थानीय शाखा के लिए एक अपस्ट्रीम शाखा पंजीकृत होगी:

  • में git statusऔर दो शाखाओं के बीच के रिश्तेgit branch -v को दिखाने के लिए git बताएं ।
  • जब नई शाखा की जाँच की जाती है तो अपस्ट्रीम से खींचने के लिए git pull बिना तर्क के निर्देश ।

अधिक के लिए " आप मौजूदा गिट शाखा को दूरस्थ शाखा कैसे बनाते हैं? " देखें।


1
@VonC मैं उस छोटी सी डिटेल की तलाश में था जिसे आप अतिरिक्त जानकारी के रूप में उल्लिखित करते हैं। मेरे मामले में, मैं उत्सुक था कि मेरी कुछ शाखाएं मुझे अनुमति क्यों देती हैं git pull, जबकि कुछ शाखाएं एक दूरस्थ शाखा से खींचने के लिए कहेंगी। यह पता चला है कि यदि आप, अपने पहली बार में, एक दूरस्थ शाखा की जाँच कर रहे हैं जिसे आपके सहकर्मी ने बनाया है, तो git चला जाता है और branch.<BNAME>.remote=originस्थानीय gitconfig में जुड़ जाता है। जो तब आपको जारी करने की अनुमति देता है git pull। हालाँकि, यदि आप शाखा बना रहे हैं git checkout -b BNAME, तो git -of कोर्स- नहीं जानता है। इसलिए आपको इसका रिमोट निर्दिष्ट करना चाहिए।
23:56

@batilc "यह पता चला है कि यदि आप, अपने पहली बार में, एक दूरस्थ शाखा की जाँच कर रहे हैं जिसे आपके सहकर्मी ने बनाया है,"; हां, git-scm.com/docs/git-checkout को पढ़ते हुए , मैं देखता हूं: " If <branch>नहीं मिला है, लेकिन <remote>एक मिलान नाम के साथ बिल्कुल एक रिमोट (इसे कॉल करें ) में एक ट्रैकिंग शाखा मौजूद है , जिसे $ git checkout -b <branch> --track <remote>/<branch>"
VONC

@VonC मुझे इसके लिए एक बेहतर विन्यास मिला। बस हम जो बात कर रहे हैं उसे करने के branch.autoSetupMergeलिए सेट अप करना always। यह सेटिंग डिफॉल्ट करता है true, जिसका अर्थ है कि ट्रैकिंग केवल एक दूरस्थ शाखा की जांच करते समय की जाएगी। trueस्थानीय रूप से बनाई गई शाखाओं के लिए ट्रैकिंग की स्थापना नहीं करता है।
बल्लेबाजी

@batilc मैं सहमत हूँ। मैं हमेशा उपयोग नहीं करना चाहता, क्योंकि मैं स्पष्ट रूप से ट्रैकिंग सेट करना पसंद करता हूं, लेकिन आपके मामले में, यह सही सेटिंग होनी चाहिए।
वॉन

1
"गिट ब्रांच -सेट-अपस्ट्रीम-टू-ब्रांच अपस्ट्रीम / ब्रांच" सही सिंटैक्स नहीं है। यह होना चाहिए: "गिट ब्रांच - सेट-अप-अपस्ट्रीम-अपस्ट्रीम / ब्रांच ब्रांच"
maharvey67

33

कोई अंतर नहीं है!

1) git checkout -b branch origin/branch

यदि कोई नहीं है --trackऔर नहीं है --no-track, तो --trackइसे डिफ़ॉल्ट माना जाता है। सेटिंग के साथ डिफ़ॉल्ट को बदला जा सकता है branch.autosetupmerge

प्रभाव में, 1) जैसा व्यवहार करता है git checkout -b branch --track origin/branch

2) git checkout --track origin/branch

"एक सुविधा के रूप में", --trackबिना -bतात्पर्य -bऔर तर्क के -b"शाखा" होने का अनुमान लगाया जाता है। अनुमान विन्यास चर द्वारा संचालित है remote.origin.fetch

प्रभाव में, 2) जैसा व्यवहार करता है git checkout -b branch --track origin/branch

जैसा कि आप देख सकते हैं: कोई अंतर नहीं।

लेकिन यह और बेहतर हो जाता है:

3) git checkout branch

git checkout -b branch --track origin/branch"शाखा" अभी भी मौजूद नहीं है, लेकिन "मूल / शाखा" 1 करता है, तो भी बराबर है ।


सभी तीन कमांड "शाखा" के "अपस्ट्रीम" को "मूल / शाखा" (या वे विफल) सेट करते हैं।

नदी के ऊपर के संदर्भ बिंदु के रूप में प्रयोग किया जाता तर्क कम git status, git push, git mergeऔर इस तरह git pull(उस तरह से कॉन्फ़िगर किया गया है, तो (जो डिफ़ॉल्ट या लगभग डिफ़ॉल्ट है))।

उदाहरण के लिए git status, यदि आप कॉन्फ़िगर किए गए हैं, तो आपको बताता है कि आप कितने आगे या पीछे हैं।

git pushजीआईटी 2.0 के बाद से डिफ़ॉल्ट 2 द्वारा वर्तमान शाखा को ऊपर की ओर धकेलने के लिए कॉन्फ़िगर किया गया है ।

1 ... और यदि "मूल" एकमात्र दूरस्थ शाखा "शाखा" है, तो
2 डिफ़ॉल्ट ("सरल" नाम) भी दोनों शाखा नामों के बराबर होने के लिए लागू होती है


5

पुस्तक से संकेत मिलता है कि वे आदेश समान प्रभाव देते हैं:

साधारण मामला वह उदाहरण है जिसे आपने अभी देखा था, git checkout -b [ब्रांच] [remotename] / [ब्रांच] चला रहा है। यदि आपके पास संस्करण 1.6.2 या बाद का संस्करण है, तो आप --ट्रैक शॉर्टहैंड का भी उपयोग कर सकते हैं:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

दूरस्थ शाखा की तुलना में एक अलग नाम के साथ एक स्थानीय शाखा स्थापित करने के लिए, आप आसानी से एक अलग स्थानीय शाखा नाम के साथ पहले संस्करण का उपयोग कर सकते हैं:

$ git checkout -b sf origin/serverfix

यह विशेष रूप से तब उपयोगी होता है जब आपका बैश या ओह-माय-ज़श गिट पूर्णता origin/serverfixआपके लिए नाम खींचने में सक्षम होता है - बस संलग्न --track(या -t) और आप अपने रास्ते पर हैं।


-1

आप इस आदेश के साथ एक नई शाखा नहीं बना सकते

git checkout --track origin/branch

यदि आपके पास ऐसे परिवर्तन हैं जिनका मंचन नहीं किया गया है।

यहाँ उदाहरण है:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

हालाँकि आप आसानी से git checkout -bकमांड के साथ अन-स्टेज्ड बदलावों के साथ एक नई शाखा बना सकते हैं :

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

ध्यान रखें कि प्रश्नों के दोनों आदेश मौजूदा दूरस्थ शाखा ( origin/branch) को ट्रैक करने के लिए हैं
yorch

@Green आप के origin/new-branchबजाय परीक्षण के साथ है origin/branch। क्या आपको उसकी जानकारी है?
राबर्ट सीमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.