स्थानीय शाखा, स्थानीय ट्रैकिंग शाखा, दूरस्थ शाखा और दूरस्थ ट्रैकिंग शाखा के बीच अंतर क्या हैं?


158

मैंने अभी Git का उपयोग करना शुरू किया और मैं विभिन्न शाखाओं के बीच वास्तव में भ्रमित हो गया। क्या कोई मुझे यह पता लगाने में मदद कर सकता है कि निम्नलिखित शाखा प्रकार क्या हैं?

  • स्थानीय शाखाएँ
  • स्थानीय ट्रैकिंग शाखाएँ
  • दूरस्थ शाखाएँ
  • दूरस्थ ट्रैकिंग शाखाएँ

उनके बीच क्या अंतर है? और वे एक दूसरे के साथ कैसे काम करते हैं?

एक त्वरित डेमो कोड वास्तव में उपयोगी होगा मुझे लगता है।

जवाबों:


123

एक स्थानीय शाखा एक शाखा है जिसे केवल आप (स्थानीय उपयोगकर्ता) देख सकते हैं। यह केवल आपके स्थानीय मशीन पर मौजूद है।

git branch myNewBranch        # Create local branch named "myNewBranch"

एक दूरदराज के शाखा एक दूरस्थ स्थान पर एक शाखा (ज्यादातर मामलों में है origin)। आप नई बनाई गई स्थानीय शाखा myNewBranchको धक्का दे सकते हैं origin। अब अन्य उपयोगकर्ता इसे ट्रैक कर सकते हैं।

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

एक रिमोट ट्रैकिंग शाखा एक दूरस्थ शाखा की एक स्थानीय प्रति है। जब ऊपर दिए गए आदेश का उपयोग myNewBranchकरने के लिए धक्का दिया जाता originहै, तो origin/myNewBranchआपके मशीन पर नामित रिमोट ट्रैकिंग शाखा बनाई जाती है। यह रिमोट ट्रैकिंग शाखा दूरस्थ शाखा पटरियों myNewBranchपर origin। आप अपनी दूरस्थ ट्रैकिंग शाखा का उपयोग करके या दूरस्थ शाखा के साथ समन्वयित होने के लिए अपडेट कर सकते हैं ।git fetchgit pull

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

एक स्थानीय ट्रैकिंग शाखा एक स्थानीय शाखा है जो दूसरी शाखा पर नज़र रख रही है। यह इतना है कि आप दूसरी शाखा से / के लिए आवागमन कर सकते हैं। ज्यादातर मामलों में स्थानीय ट्रैकिंग शाखाएं दूरस्थ ट्रैकिंग शाखा को ट्रैक करती हैं। जब आप किसी स्थानीय शाखा को विकल्प originके git push commandसाथ उपयोग करते हैं -u(जैसा कि ऊपर दिखाया गया है), तो आप myNewBranchदूरस्थ ट्रैकिंग शाखा को ट्रैक करने के लिए स्थानीय शाखा सेट करते हैं origin/myNewBranch। यह उपयोग करने के लिए git pushऔर git pullऊपर की ओर धक्का देने या खींचने के लिए निर्दिष्ट किए बिना आवश्यक है ।

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

स्थानीय ट्रैकिंग शाखा की परिभाषा के लिए, यह रिमोट के लिए धक्का देने के बाद स्थानीय शाखा के समान नहीं है?
mskw

2
@mskw नहीं, एक स्थानीय ट्रैकिंग शाखा और एक स्थानीय (गैर ट्रैकिंग) शाखा एसोसिएशन में भिन्न हैं। एक स्थानीय शाखा किसी भी शाखा से संबद्ध नहीं है। यह अलगाव में आपके स्थानीय मशीन पर मौजूद एक शाखा है। एक स्थानीय ट्रैकिंग शाखा एक दूरस्थ ट्रैकिंग शाखा के साथ जुड़ा हुआ है। तो आप एक-दूसरे से / को कमिट / पुश कर सकते हैं।
एसएनसी

196

यहाँ लंबे जवाब है।

दूरस्थ:

यदि आप सहयोगी रूप से Git का उपयोग कर रहे हैं, तो आपको संभवतः अन्य मशीनों या स्थानों के साथ अपने कमिट को सिंक करना होगा। प्रत्येक मशीन या स्थान को Git की शब्दावली में रिमोट कहा जाता है , और प्रत्येक में एक या अधिक शाखाएं हो सकती हैं। सबसे अधिक बार, आपके पास सिर्फ एक नाम होगा origin। सभी रिमोट को सूचीबद्ध करने के लिए, रन करें git remote:

$ git remote
bitbucket
origin

आप देख सकते हैं कि ये दूरस्थ नाम किन स्थानों के लिए शॉर्टकट हैं, जिन्हें चलाकर git remote -v:

$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)

प्रत्येक रिमोट के नीचे एक निर्देशिका है git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

आपकी मशीन पर शाखाएँ:

TLDR: आपकी स्थानीय मशीन पर, आपको तीन प्रकार की शाखाएँ मिली हैं: स्थानीय गैर-ट्रैकिंग शाखाएँ, स्थानीय ट्रैकिंग शाखाएँ और दूरस्थ ट्रैकिंग शाखाएँ। एक दूरस्थ मशीन पर, आपको सिर्फ एक प्रकार की शाखा मिली है।

1. स्थानीय शाखाएँ

आप अपनी मशीन पर सभी स्थानीय शाखाओं की एक सूची देख सकते हैं git branch:

$ git branch
master
new-feature

प्रत्येक स्थानीय शाखा में एक फ़ाइल है .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

आपकी मशीन पर दो प्रकार की स्थानीय शाखाएँ होती हैं: स्थानीय शाखाओं पर नज़र रखना और स्थानीय शाखाओं पर नज़र रखना।

1.1 गैर-ट्रैकिंग स्थानीय शाखाएँ

गैर-ट्रैकिंग स्थानीय शाखाएं किसी अन्य शाखा से जुड़ी नहीं हैं। तुम दौड़कर एक पैदा करते हो git branch <branchname>

1.2। स्थानीय शाखाओं पर नज़र रखना

ट्रैकिंग स्थानीय शाखाएं एक अन्य शाखा से जुड़ी होती हैं, आमतौर पर एक रिमोट-ट्रैकिंग शाखा। तुम दौड़कर एक पैदा करते हो git branch --track <branchname> [<start-point>]

आप यह देख सकते हैं कि आपकी कौन सी स्थानीय शाखा शाखाओं का उपयोग करके ट्रैकिंग कर रही है git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

इस कमांड के आउटपुट से, आप देख सकते हैं कि स्थानीय शाखा masterरिमोट-ट्रैकिंग शाखा को ट्रैक कर रही है origin/master, और स्थानीय शाखा new-featureकुछ भी ट्रैक नहीं कर रही है।

यह देखने के लिए कि शाखाओं को ट्रैक करने वाली शाखाएं देखने का एक और तरीका है .git/config

स्थानीय शाखाओं को ट्रैक करना उपयोगी है। वे आपको चलाने की अनुमति देते हैं git pullऔर git push, यह निर्दिष्ट किए बिना कि कौन सी अपस्ट्रीम शाखा का उपयोग करना है। यदि शाखा किसी अन्य शाखा को ट्रैक करने के लिए सेट नहीं है, तो आपको इस तरह एक त्रुटि मिलेगी:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. रिमोट-ट्रैकिंग शाखाएं (अभी भी आपकी मशीन पर)

आप अपनी मशीन पर सभी दूरस्थ-ट्रैकिंग शाखाओं की सूची चलाकर देख सकते हैं git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

प्रत्येक दूरस्थ ट्रैकिंग शाखा में एक फ़ाइल है .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

अपनी दूरस्थ-ट्रैकिंग शाखाओं के बारे में सोचें कि आपके स्थानीय कैश के लिए दूरस्थ मशीनें क्या हैं। आप अपनी रिमोट-ट्रैकिंग शाखाओं का उपयोग करके अपडेट कर सकते हैं git fetch, जो git pullपर्दे के पीछे का उपयोग करता है।

भले ही रिमोट-ट्रैकिंग शाखा का सारा डेटा आपकी मशीन पर (कैश की तरह) स्थानीय रूप से संग्रहीत हो, फिर भी इसे कभी भी स्थानीय शाखा नहीं कहा जाता है। (कम से कम, मैं इसे नहीं कहूंगा!) इसे सिर्फ एक रिमोट-ट्रैकिंग शाखा कहा जाता है।

दूरस्थ मशीन पर शाखाएँ:

आप सभी दूरस्थ शाखाओं को देख सकते हैं (यानी, रिमोट मशीन की शाखाएँ), दौड़कर git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:Flimm/example.git
  Push  URL: git@github.com:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

यह git remoteकमांड नेटवर्क पर रिमोट मशीन से उसकी शाखाओं के बारे में पूछताछ करता है। यह आपके स्थानीय मशीन, उपयोग git fetchया उसके git pullलिए रिमोट-ट्रैकिंग शाखाओं को अपडेट नहीं करता है।

आउटपुट से, आप उन सभी शाखाओं को देख सकते हैं जो रिमोट मशीन पर "हेडिंग ब्रांच" ("स्टेल" के रूप में चिह्नित लाइनों को अनदेखा करें) के नीचे देखकर मौजूद हैं।

यदि आप दूरस्थ मशीन में लॉग इन कर सकते हैं और फाइलसिस्टम में रिपॉजिटरी पा सकते हैं, तो आप इसकी सभी शाखाओं पर एक नज़र डाल सकते हैं refs/heads/

प्रवंचक पत्रक:

  • किसी स्थानीय शाखा को हटाने के लिए, चाहे वह ट्रैकिंग हो या गैर-ट्रैकिंग, सुरक्षित रूप से:

    git branch -d <branchname>
    
  • किसी स्थानीय शाखा को हटाने के लिए, चाहे ट्रैकिंग हो या गैर-ट्रैकिंग, जबरदस्ती:

    git branch -D <branchname>
    
  • दूरस्थ ट्रैकिंग शाखा को हटाने के लिए:

    git branch -rd <remote>/<branchname>
    
  • एक नई स्थानीय गैर-ट्रैकिंग शाखा बनाने के लिए:

    git branch <branchname> [<start-point>]
    
  • एक नई स्थानीय ट्रैकिंग शाखा बनाने के लिए: (ध्यान दें कि यदि <start-point>निर्दिष्ट किया गया है और एक दूरस्थ-ट्रैकिंग शाखा है जैसे origin/foobar, तो --trackध्वज स्वचालित रूप से शामिल है)

    git branch --track <branchname> [<start-point]
    

    उदाहरण:

    git branch --track hello-kitty origin/hello-kitty
    
  • किसी दूरस्थ मशीन पर शाखा हटाने के लिए:

    git push --delete <remote> <branchname>
    
  • सभी दूरस्थ-ट्रैकिंग शाखाएँ, जो बासी हैं, को हटाने के लिए, जहाँ रिमोट मशीन पर संबंधित शाखाएँ मौजूद नहीं हैं:

    git remote prune <remote>
    

आपने देखा होगा कि कुछ कमांड में, आप का उपयोग करते हैं <remote>/<branch>, और अन्य कमांड <remote> <branch>,। उदाहरण: git branch origin/hello-kittyऔर git push --delete origin hello-kitty

यह मनमाना लग सकता है, लेकिन यह याद रखने का एक सरल तरीका है कि स्लैश का उपयोग कब करें और अंतरिक्ष का उपयोग कब करें। जब आप एक स्लैश का उपयोग कर रहे हैं, तो आप अपनी मशीन पर रिमोट-ट्रैकिंग शाखा का उल्लेख कर रहे हैं, जबकि जब आप एक स्थान का उपयोग कर रहे होते हैं, तो आप वास्तव में नेटवर्क पर एक रिमोट मशीन पर एक शाखा के साथ काम कर रहे होते हैं।


मैं शाखा बनाने और एक cmd में शाखा में जाने के लिए उपयोग करूंगा: git checkout -b mynewbranch
Zeta

मुझे अन्तरिक्ष और स्लेश के अंतर पर अंतिम बिंदु पसंद था!
aderchox

12

स्थानीय शाखा:

आपकी मशीन की एक शाखा जिस पर आप काम कर सकते हैं और उसमें काम कर सकते हैं। आप इन शाखाओं को सूचीबद्ध कर सकते हैं git branch

स्थानीय शाखा (ट्रैकिंग के साथ):

दूरस्थ शाखा के अनुरूप एक साधारण स्थानीय शाखा। इसके पास रिपॉजिटरी और शाखा का नाम निर्दिष्ट करने की क्षमता के बिना git pullऔर इसके git pushबिना बेंचफिट्स हैं । git statusजब आपकी शाखा रिमोट से आगे या पीछे होती है तो ट्रैकिंग आपको सूचित करती है।

दूरस्थ शाखा:

बस एक रिमोट रिपॉजिटरी पर एक शाखा - आमतौर पर एक सर्वर पर जैसे GitHub आदि।

रिमोट ट्रैकिंग शाखा:

दूरस्थ शाखा की एक स्थानीय प्रति। इस शाखा को कभी भी संपादित नहीं किया जाना चाहिए। इसका उद्देश्य एक दूरस्थ शाखा की वर्तमान स्थिति पर नज़र रखना है। दूरस्थ ट्रैकिंग शाखाओं के साथ देखा जा सकता है git branch -rऔर आम तौर पर कुछ ऐसा दिखता है origin/master(रेपो नाम के बाद स्लैश के बाद शाखा नाम)। रनिंग git fetchसुदूर ट्रैकिंग शाखाओं की स्थिति को दर्शाने के लिए दूरस्थ ट्रैकिंग शाखाओं को अपडेट करेगा।

git branch -avvमेरी निजी पसंदीदा है कि मेरी मशीन पर कौन सी शाखाएँ हैं, कौन सी शाखाएँ रिमोट पर हैं, और प्रत्येक में नवीनतम कमिट प्रदर्शित करने के लिए मेरा पसंदीदा है। -aभाग निर्दिष्ट करता है कि सभी शाखाओं दिखाया जाना चाहिए (दूरस्थ और स्थानीय)। v'वर्बोज़ के लिए अंत स्टैंड पर है (यह पिछले चलता हैश और संदेश के लिए प्रतिबद्ध)। @Flimm के लिए धन्यवाद, यह इंगित करने के लिए कि दूसरा vजानकारी जोड़ता है कि कौन सी स्थानीय शाखा किस रिमोट को ट्रैक कर रही है।


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

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