'जिट पुल ओरिजिन माइब्रंच' स्थानीय मायब्रांच एन मूल से आगे निकलता है। क्यों?


92

मैंने अभी कुछ अजीब देखा git pull, जिसके बारे में मुझे समझ नहीं आया।

शुक्रवार को, मैंने एक स्थानीय शाखा में काम किया। चलो इसे बुलाओ mybranch। कार्यालय छोड़ने से पहले मैंने इसे मूल में धकेल दिया था (जो कि मेरा गितुब रेपो है) git push origin mybranch:।

कल घर पर, मैंने pullअपने लैपटॉप को mybranch एड किया, कुछ और कोडिंग की, और फिर अपने बदलावों को वापस गितूब (मूल) में धकेल दिया।

अब मैं फिर से काम पर हूँ, और कल से अपनी कार्य मशीन में बदलावों को खींचने की कोशिश की (मैंने सप्ताहांत में अपने कार्य स्थान के स्थानीय रेपो में कुछ भी नहीं बदला):

git pull origin mybranch

इससे तेजी से फॉरवर्ड मर्ज हुआ, जो ठीक है। मैंने तब किया था git status, और यह कहा:

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

है ना? जब मैं वीकेंड पर भी इसे नहीं छूता, तो यह 6 बार आगे कैसे हो सकता है, और सिर्फ मूल से खींचा गया है? इसलिए मैंने भाग लिया git diff origin/mybranchऔर डिफरेंसेस ठीक 6 बदलाव थे जिन्हें मैंने अभी रिमोट से खींचा था।

मैं इसे चलाकर केवल "ठीक" कर सकता था git fetch origin:

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch

जाहिर है, मेरे स्थानीय रेपो कुछ संदर्भ वस्तुओं को याद कर रहे थे, लेकिन यह कैसे हो सकता है? मेरा मतलब है, एक पुल एक पहले से ही लाने करता है, और मैं कुछ भी पर काम उस शाखा को छोड़कर नहीं था, तो एक git fetch originऔर git fetch origin mybranchएक ही परिणाम होना चाहिए?

क्या मुझे git pull originइसके बजाय हमेशा उपयोग करना चाहिए git pull origin branchname?

मैं उलझन में हूं।


मैंने यह भी देखा है; एक git pushभी इसे हल करने के लिए प्रतीत होता है ("सभी को अप टू डेट") रिपोर्टिंग।
बेन जेम्स

4
git config --get-regexp br.*क्या आप बता सकते हैं कि आपके कॉन्फ़िग में एक स्थानीय शाखा है जो दूसरी शाखा पर नज़र रख रही है
VonC

3
यदि स्थिति 'आगे' चेतावनी के साथ बनी रहती है तो क्या आप git config branch.master.remote yourGitHubRepo.gitअपने कार्य में टाइप कर सकते हैं और चेक (अगले पर git pull origin) कर सकते हैं ?
VonC

यह सेट नहीं है (खाली आउटपुट)। लेकिन git remote show originमुझे पता चलता है कि मूल मेरे GitHub भंडार को इंगित करता है, इसलिए मुझे ठीक होना चाहिए?
मथियास

1
git रिमोट अकेले (GitHub repo के लिए सही पता दिखाना) पर्याप्त नहीं है । एक के बाद एक " Your branch is ahead" चेतावनी संदेश होने से बचने के लिए git pull, आपको शाखा के लिए दूरस्थ नाम को परिभाषित करने की भी आवश्यकता है । इसलिए मेरा सुझाव: टाइप करें , फिर a और प्रयास करें और देखें कि क्या समस्या बनी हुई है। git config branch.master.remote yourGitHubRepo.gitgit pullgit status
वॉन सी सी

जवाबों:


115

git pullgit fetchस्पष्ट रूप से प्राप्त किए गए शीर्षों (या यदि कोई भी दूरस्थ शाखा मर्ज के लिए कॉन्फ़िगर नहीं किया गया है) को वर्तमान शाखा में विलय करने से पहले उचित मापदंडों के साथ कॉल करें।

वाक्य-विन्यास: git fetch <repository> <ref>जहां <ref>कोई कॉलोन नहीं के साथ सिर्फ एक शाखा का नाम है, एक 'एक शॉट' लाने वाला है जो निर्दिष्ट रिमोट की सभी ट्रैक की गई शाखाओं का एक मानक प्राप्त नहीं करता है, बल्कि केवल नामित शाखा को प्राप्त करता है FETCH_HEAD

अद्यतन: 1.8.4 के बाद से Git संस्करणों के लिए, यदि कोई दूरस्थ ट्रैकिंग शाखा है जो उस रेफ्रेन्स को ट्रैक करती है जिसे आपने लाने के लिए कहा है तो ट्रैकिंग शाखा अब अपडेट हो जाएगी fetch। यह परिवर्तन विशेष रूप से उस भ्रम से बचने के लिए किया गया है जो पिछले व्यवहार का कारण था।

जब आप प्रदर्शन करते हैं git pull <repository> <ref>, FETCH_HEADतो ऊपर के रूप में अपडेट किया जाता है, फिर आपके चेक आउट में विलय हो जाता है HEADलेकिन दूरस्थ रिपॉजिटरी के लिए मानक ट्रैकिंग शाखाओं में से कोई भी अपडेट नहीं किया जाएगा (Git <1.8.4)। इसका मतलब है कि स्थानीय रूप से ऐसा लगता है कि आप दूरस्थ शाखा से आगे हैं, जबकि वास्तव में आप इसके साथ अद्यतित हैं।

व्यक्तिगत रूप से मैं हमेशा git fetchपीछा करता git merge <remote>/<branch>हूं क्योंकि मुझे मर्ज करने से पहले जबरन अपडेट के बारे में कोई भी चेतावनी देखने को मिलती है, और मैं मर्ज होने पर पूर्वावलोकन कर सकता हूं। यदि मैं git pullजितना करता हूं उससे थोड़ा अधिक उपयोग किया जाता है, तो मैं git pullबिना किसी मापदंडों के एक सादा काम करूंगा। समय पर, भरोसा करना branch.<branch>.remoteऔर branch.<branch>.merge'सही काम करना'।


4
+1 यह वास्तव में एक अच्छा स्पष्टीकरण है! मुझे पता था कि स्पष्टीकरण 'git help fetch' के अंदर कहीं छिपा हुआ था, लेकिन इसे बाहर नहीं निकाला जा सका ...
Stefan Näwe

1
+1। अच्छा पोस्ट, इसी तरह एक दृष्टिकोण के साथ करने के लिए gitster.livejournal.com/28309.html
VonC

1
तो एक के git fetchबाद एक git pull <repository> <ref>समस्या को ठीक कर देगा क्योंकि भ्रूण मानक ट्रैकिंग शाखाओं को अद्यतन करेगा? इसके अलावा, इस उत्तर के लिए धन्यवाद, समझ में आने के लिए :)
बार्ट जेड्रोचा

1
मैं इस मुद्दे पर भी भाग गया और आपको इसके git fetchबाद करने की आवश्यकता होगी git merge origin/master master
user1027169

3

git remote -v showजब उत्पत्ति की बात आती है तो क्या रिटर्न देता है?

यदि उत्पत्ति गिथब की ओर इशारा करती है, तो स्थिति अद्यतित होनी चाहिए, और किसी दूरस्थ रेपो से आगे नहीं। कम से कम, Git1.6.5 के साथ मैं एक त्वरित परीक्षण के लिए उपयोग कर रहा हूं।

वैसे भी, इससे बचने के लिए, मास्टर शाखा के दूरस्थ रेपो को स्पष्ट रूप से परिभाषित करें:

$ git config branch.master.remote yourGitHubRepo.git

उसके git pull origin masterबाद git statusस्वच्छ स्थिति (आगे नहीं) वापस आना चाहिए।
क्यों? क्योंकि मूल उद्गम मास्टर (गिट पुल ओरिजनल मास्टर में शामिल) सिर्फ अपडेट नहीं होगा FETCH_HEAD(जैसा कि चार्ल्स बैली अपने उत्तर में बताते हैं ), लेकिन यह आपके स्थानीय गिट रिपॉजिटरी के भीतर "दूरस्थ मास्टर शाखा" को भी अपडेट करेगा ।
उस स्थिति में, आपका स्थानीय मास्टर दूरस्थ मास्टर के "आगे" प्रतीत नहीं होगा।


मैं इसे git1.6.5 के साथ परीक्षण कर सकता हूं:

पहले मैं एक वर्करेपो बनाता हूं:

PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A 
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"

मैं नंगे रेपो (जो कहीं से भी धक्का प्राप्त कर सकता हूं) बनाकर एक GitHub रेपो का अनुकरण करता हूं

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github

मैं अपने काम करने वाले रेपो में एक मोडिफ़ जोड़ता हूं, कि मैं गितुब रेपो (रिमोट के रूप में जोड़ा गया) पर जोर देता हूं

PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github

मैं एक होम रेपो बनाता हूं, जिसे GitHub का क्लोन बनाया गया है, जिसमें मैं कुछ संशोधन करता हूं, GitHub में धकेल दिया गया:

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif

PS D:\git\tests\pullahead\homerepo> echo aHomeModif1  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github

मैं तो पहले प्रयोग के लिए वर्करेपो क्लोन करता हूं

PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)

उस रेपो में, git स्टेटस ' origin' के आगे मास्टर जिंग का उल्लेख करता है :

PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

लेकिन वह केवल originगितुब नहीं है:

PS D:\git\tests\pullahead\workrepo2> git remote -v show
github  d:/git/tests/pullahead/github (fetch)
github  d:/git/tests/pullahead/github (push)
origin  D:/git/tests/pullahead/workrepo (fetch)
origin  D:/git/tests/pullahead/workrepo (push)

लेकिन अगर मैं एक रेपो में अनुक्रम को दोहराता हूं, जिसमें जीथब (या बिल्कुल भी मूल नहीं है, तो बस एक दूरस्थ 'जीथब' परिभाषित) है, स्थिति साफ है:

PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)

अगर मैं केवल originइशारा कर रहा था github, statusgit1.6.5 के लिए साफ होगा।
यह पहले के गिट के लिए एक 'आगे' चेतावनी के साथ हो सकता है, लेकिन वैसे भी, एक git config branch.master.remote yourGitHubRepo.gitपरिभाषित स्पष्ट रूप से ध्यान रखना चाहिए, यहां तक ​​कि गिट के शुरुआती संस्करणों के साथ भी।


इस पर गौर करने के लिए समय देने के लिए धन्यवाद। मूल रिमोट पहले से ही मेरे GitHub रेपो को इंगित करता है। मैंने उस प्रोजेक्ट को GitHub url से क्लोन किया और मेरी स्थानीय मास्टर शाखा मूल / मास्टर को ट्रैक कर रही है। Mybranch के लिए, मुझे पूरा यकीन है कि मैंने इसे मूल / mybranch शाखा से बनाया है, जिसे इसे स्वचालित रूप से ट्रैक करना चाहिए। लेकिन फिर भी, शायद यह समस्या है? कि स्थानीय mybranch वास्तव में मूल / mybranch को ट्रैक नहीं करता है? पुनश्च: मैं git 1.6.1 का उपयोग कर रहा हूँ (MacPorts के माध्यम से)।
मथायस

क्या कोई git कमांड है जो मुझे यह देखने देता है कि क्या कोई स्थानीय शाखा दूसरी शाखा पर नज़र रख रही है? मैं इसे मैन पेजों में नहीं ढूंढ सकता।
मथियास

आप देख सकते हैं कि किन सुदूर शाखाओं को ट्रैक किया गया है git remote show origin
टेड परसीवल डे

2

क्या आप अपने सभी रिमोट को जोड़ने के लिए सावधान हैं (सिवाय इसके originकि आपके मूल क्लोन के साथ कौन आता है) का उपयोग कर git remote add NAME URL? मैं इस बग को देखा है जब वे सिर्फ git config में जोड़ा गया है।


मैंने रेपो की क्लोनिंग करते समय ऐसा किया। मैंने हालांकि प्रत्येक शाखा के साथ ऐसा नहीं किया। उदाहरण के लिए mybranch मैं पहले मूल से लाऊंगा, फिर git checkout -b mybranch origin/mybranch। Git-branch के मैन पेज के अनुसार, मूल / mybranch एक शुरुआती बिंदु है, और इसके अलावा, यह --track के लिए बताता है: "... यदि आप हमेशा एक ही अपस्ट्रीम शाखा से नई शाखा में खींचते हैं, और अगर आप "git pull <repository> <refspec>" का स्पष्ट रूप से उपयोग नहीं करना चाहते हैं। यह व्यवहार तब डिफ़ॉल्ट होता है जब प्रारंभ बिंदु एक दूरस्थ शाखा है। "
मथियास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.