git: X द्वारा आपकी शाखा आगे है


379

यह वास्तव में कैसे आता है?

मैं इस समय अपने द्वारा एक रेपो में काम कर रहा हूं, इसलिए यह मेरा वर्कफ़्लो है:

  1. फाइलें बदलें
  2. कमिट
  3. संतुष्ट होने तक 1-2 बार दोहराएं
  4. गुरु को धक्का

फिर जब मैं ऐसा करता हूं तो git statusमुझे बताता है कि मेरी शाखा एक्स कमिट्स से आगे है (संभवत: उसी तरह की संख्या जो मैंने बनाई है)। क्या ऐसा इसलिए है क्योंकि जब आप कोड को धक्का देते हैं तो यह वास्तव में आपकी स्थानीय रूप से कैश्ड फ़ाइलों (.गित फ़ोल्डर्स में) को अपडेट नहीं करता है? git pullइस अजीब संदेश को 'ठीक' करने के लिए लगता है, लेकिन मैं अभी भी उत्सुक हूं कि ऐसा क्यों होता है, शायद मैं गलत का उपयोग कर रहा हूं?


संदेश में क्या शाखा मुद्रित है सहित

मेरी स्थानीय शाखा गुरु से आगे है

आप वर्तमान शाखा को कहां धकेलते हैं / खींचते हैं

मैं GitHub पर जोर दे रहा हूं और जो भी कंप्यूटर मैं उस समय काम कर रहा हूं, उस समय तक खींच रहा हूं, मेरी स्थानीय प्रति हमेशा पूरी तरह से अद्यतित है क्योंकि मैं केवल उसी पर काम कर रहा हूं।

यह वास्तव में रिमोट रेपो की जाँच नहीं करता है

यही मैंने सोचा था, मुझे लगा कि मैं यह सुनिश्चित करूंगा कि मेरी समझ सही थी।

क्या आप इसके लिए कुछ अतिरिक्त तर्क दे रहे हैं?

उन लोगों को नहीं जो मैं देख सकता हूं, शायद मेरे अंत में कुछ मज़ेदार कॉन्फ़िग चल रही है?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

आप कैसे कर रहे हैं pushऔर आपकी दूरस्थ और शाखा विन्यास सेटिंग्स क्या हैं?
CB बेली

2
यह वास्तव में रिमोट रेपो की जांच नहीं करता है, आपको पुश प्रदर्शन करने के बाद रिमोट रेपो पर नवीनतम जानकारी लाने के लिए एक git लाने की आवश्यकता है, यह स्थानीय "रिमोट" शाखा को अपडेट करेगा जिसका उपयोग वह ट्रैक करने के लिए करता है।
सेखट

2
@Sekhat: जबकि git statusदूरस्थ रिपॉजिटरी की जाँच नहीं करता है, git pullकरता है। यदि आपके पास एक रिपॉजिटरी के लिए एक ट्रैकिंग शाखा है जिसे आप धक्का देते हैं, git pushतो यदि आपका धक्का सफल होता है तो दूरस्थ शाखा की नई स्थिति को दर्शाने के लिए अपनी स्थानीय ट्रैकिंग शाखा को अपडेट करेगा। यही कारण है कि मैंने प्रश्नकर्ता के कॉन्फ़िगरेशन के बारे में पूछा क्योंकि अगर यह सही तरीके से नहीं हो रहा है तो संभवतः कॉन्फ़िगरेशन त्रुटि है।
सीबी बेली

git status? वास्तव में? मेरी git statusमुझे कभी नहीं बताता कि मेरी शाखा कितनी आगे है .. क्या आप इसके लिए कुछ अतिरिक्त तर्क दे रहे हैं?
hasen

4
@ jenen j: git statusयह देखने के लिए रिमोट रिपॉजिटरी में नहीं जाता है कि रिमोट ब्रांच को अपडेट किया गया है या नहीं। यह बताता है कि आपकी स्थानीय शाखा आपके स्थानीय रूप से संग्रहीत रिमोट ट्रैकिंग शाखा की तुलना में कितनी आगे है । मुद्दा यह है कि एक सामान्य git push(साथ ही लाने और खींचने) को दूरस्थ ट्रैकिंग शाखा को अद्यतन करना चाहिए और पूछने वाले के लिए यह काम नहीं करता है। यह देखने के लिए कि हमें दोनों के सटीक रूप का git pushउपयोग करने की आवश्यकता क्यों है और स्थानीय रिपॉजिटरी के कॉन्फ़िगरेशन का उपयोग किया जा रहा है, लेकिन जैसा कि पूछने वाले ने पहले ही एक उत्तर स्वीकार कर लिया है, मैं इसे अब नहीं देख सकता।
सीबी बेली

जवाबों:


507

यदि आपको यह करने के बाद यह संदेश मिलता है git pull remote branch, तो इसके साथ प्रयास करें git fetch। (वैकल्पिक रूप git fetch -pसे, रेपो से हटाई गई शाखाओं को prune करने के लिए चलाएँ )

लगता है दूरस्थ शाखा के स्थानीय प्रतिनिधित्व को अद्यतन करने के लिए लगता है, जो जरूरी नहीं है कि जब आप एक करते हैं git pull remote branch


1
वाहवाही। यह वास्तव में मुद्दा था। मैंने google कोड पर एक रिपॉजिटरी बनाकर शुरुआत की। फिर मैंने अपने लैपटॉप पर इस रिपॉजिटरी को क्लोन किया और मैं वहां काम करता हूं और परिवर्तनों को धकेलता हूं, लैपटॉप => code.google। मुझे यह संदेश मेरे सर्वर पर मिलता था, जहाँ मैंने code.google कोड रिपॉजिटरी का एक क्लोन बनाया था और मैं परिवर्तनों को खींचता था। मुझे लगता है कि स्थानीय डेटाबेस को अपडेट करने के लिए लाने की आवश्यकता है।
rjha94

2
हमारे यहाँ भी यही समस्या थी क्योंकि एक अन्य शाखा (ए) ने मास्टर की उसी प्रतिबद्धता की ओर इशारा किया। पुलिंग ए और फिर मास्टर को खींचना इसी स्थिति के कारण हुआ। जब git ने A को खींचा, तो कमिट को पिछले एक पर अपडेट किया गया था, इसलिए मास्टर को खींचने से वास्तव में खींचने के लिए कुछ भी नहीं है, इसलिए git ने मास्टर को आखिरी कमिट अपडेट नहीं किया और "मास्टर से आगे" होने के बारे में चेतावनी दे रहा था।
Uberto

8
धन्यवाद, हालांकि मैंने एक अजीब बात नोटिस की। "git लाने के मूल गुरु" मदद नहीं करता है, लेकिन "git लाने के मूल" करता है। मैं मास्टर ब्रांच पर हूं, इसलिए यह सुनिश्चित नहीं है कि "git fetch origin" संदर्भ में कुछ अलग कैसे करेगा।
पराग

2
@Parag उन दो आदेशों के बीच अंतर की व्याख्या के लिए stackoverflow.com/questions/26350876/… देखें , और व्यवहार को बदलने के लिए कॉन्फ़िगर फ़ाइल को कैसे संशोधित करें, इसलिए git लाने के लिए दूरस्थ शाखा भी दूरस्थ-ट्रैकिंग-शाखा रेफरी को अपडेट करती है, इसलिए git_status 'द्वारा आगे' की रिपोर्ट नहीं करता है।
अनातोयस हाउस

2
@Pagag, stackoverflow.com/questions/7365415/… उत्तर में ORIG_HEAD और FETCH_HEAD के सिंक से बाहर जाने की स्थिति, चेतावनी चेतावनी और संभावित कॉन्फिग फ़ाइल सुधार के कारण की चर्चा है।
अनातोयस हाउस

138

उपयोग

git pull --rebase

--Rebase विकल्प का अर्थ है कि git आपके स्थानीय कमिट को अलग कर देगा, रिमोट के साथ सिंक्रोनाइज़ करेगा और फिर नए राज्य से अपने कमिट्स को लागू करने का प्रयास करेगा।


3
बेकार मर्ज को रोकने के लिए वास्तव में एक अच्छा तरीका है और मूल में एक क्लीनर पेड़ है!
हेटफ

1
मैंने इस आदेश की कोशिश की, लेकिन मेरे पास अभी भी यही मुद्दा है ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
बीबीएच

4
यह उत्तर गलत है: यदि आप स्थिति को समझे बिना इसका उपयोग करते हैं, तो आप संभावित रूप से आगे के लिए परेशानी पैदा कर रहे हैं (फिर से लिखा गया है)। यदि आप स्थिति को समझते हैं, तो इसके लिए यह तय नहीं होगा । उपयोग करने से पहले कृपया सोचें git, और कभी भी इतिहास को फिर से लिखने के लिए माइंड न करें!
cmaster - मोनिका

80

इन 3 सरल आदेशों का उपयोग करें

चरण 1 :git checkout <branch_name>

चरण 2 :git pull -s recursive -X theirs

चरण 3 :git reset --hard origin/<branch_name>

अधिक जानकारी: https://stackoverflow.com/a/39698570/2439715

का आनंद लें।


3
यह एकमात्र उत्तर है जिसने वास्तव में मेरे लिए इस मुद्दे को तय किया है। ऊपर अजीब तरह से कमानों ने इसे 12 से 7 से नीचे कर दिया और इसने आखिरकार हटा दिया
Ieuan

1
मैं इस बारे में बात करता हूं कि केवल वही चीज है जो मेरे लिए काम करती है। मुझे यकीन है कि जीआईटी में कभी-कभी कई व्यक्तित्व विकार होते हैं।
ksed

11
@Leuan की तरह, कुछ भी नहीं लेकिन git reset --hard origin/masterयह मेरे लिए मंजूरी दे दी।
डेव लैंड

यहाँ भी, यह एकमात्र कदम है जो मेरे लिए काम करता है
शारद_एमडब्ल्यू

51

मुझे लगता है कि आप संदेश को गलत बता रहे हैं - आपकी शाखा आगे नहीं है master, यह है master । यह से आगे है origin/master, जो एक है रिमोट ट्रैकिंग शाखा है कि अपने पिछले से दूरदराज के भंडार की स्थिति को रिकॉर्ड push, pullया fetch। यह आपको वही बता रहा है जो आपने किया था; आप रिमोट से आगे बढ़ गए और यह आपको धक्का देने की याद दिला रहा है।


22
यह वास्तव में मेरे धकेलने के बाद है। मुझे उस संदेश को न पाने के लिए (या संभवतः लाने के लिए?) खींचना पड़ा।
सीनजा

26

किसी ने कहा कि आप अपने संदेश को गलत कर रहे हैं, आप नहीं हैं। यह समस्या वास्तव में आपकी <project>/.git/configफ़ाइल के साथ है । यह इसके समान एक खंड होगा:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

यदि आप अपनी परियोजना की .git / config फ़ाइल से फ़ेच लाइन हटाते हैं, तो आप "आपकी शाखा Nकमिट द्वारा मूल / मास्टर 'से आगे हैं ।" होने से झुंझलाहट।

या इसलिए मुझे उम्मीद है। :)


मैं अगली बार यह देखूंगा कि मैं ahead by x commitsसंदेश देख रहा हूं । मैंने संदेश को कुछ समय में नहीं देखा है।
सीनजा

मैंने संदेश को कुछ समय में नहीं देखा है। मुझे लगता है कि यह इसलिए है क्योंकि मैंने स्थानीय रूप से गिट रेपो बनाना शुरू कर दिया है, फिर इसे आसपास के अन्य तरीके के बजाय रिमोट रेपो पर
धकेलना

मैंने यह कोशिश की थी, लेकिन जब मैंने कमिट करने की कोशिश की, तो यह "इंटरनल एरर" के साथ एक्लिप्स की शुरुआत में बदल गया। Git खुद को ठीक काम करने लगा, हालाँकि।
user4815162342

18
वह लाइन क्या करती है? और मैं इसे हटाकर क्या याद कर रहा हूं? (झुंझलाहट के अलावा)
जॉन मे

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

15

मेरे पास मेरे मंच सर्वर पर यह मुद्दा था जहां मैं केवल पुल करता हूं। और हार्ड रीसेट ने मुझे HEAD को रिमोट की तरह साफ करने में मदद की।

git reset --hard origin/master

तो अब मेरे पास फिर से है:

On branch master
Your branch is up-to-date with 'origin/master'.

मैंने पहली बार -हार्ड ध्वज के बिना कोशिश की और यह काम कर गया!
kroiz

12

इसने मेरे लिए काम किया

git reset --hard origin/master

आउटपुट जैसा दिखना चाहिए

On branch dev HEAD is now at ae1xc41z Last commit message


11

मेरे मामले में ऐसा इसलिए था क्योंकि मैंने मास्टर का उपयोग करने के लिए स्विच किया

 git checkout -B master

इसके बजाय इसके नए संस्करण को खींचने के लिए

 git checkout master

पहला कमांड मास्टर के प्रमुख को मेरे नवीनतम कमिट पर रीसेट करता है

मैंनें इस्तेमाल किया

git reset --hard origin/master

जिसे ठीक करना है


9

मैं इस पृष्ठ पर हर समाधान के माध्यम से गया, और सौभाग्य से @ अनातोली-पज़हिन ने टिप्पणी की क्योंकि उनका समाधान वह था जो काम करता था। दुर्भाग्य से मेरे पास उसे उभारने के लिए पर्याप्त प्रतिष्ठा नहीं है , लेकिन मैं पहले उसके समाधान की कोशिश करने की सलाह देता हूं:

git reset --hard origin/master

जो मुझे दिया:

HEAD is now at 900000b Comment from my last git commit here

मैं भी सलाह देता हूं:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

आप भी उपयोग कर सकते हैं:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

शुभकामनाएँ


4

विंडोज मशीन पर मुझे यही समस्या थी। जब मैं एक git pull origin masterकमांड चलाता था, तो मुझे "एक्स / कमिट्स द्वारा 'मूल / मास्टर से आगे" चेतावनी मिलती थी। मैंने पाया कि यदि मैं इसके बजाय भाग गया git pull originऔर शाखा को निर्दिष्ट नहीं किया, तो मैं अब चेतावनी प्राप्त नहीं करूंगा।


मेरा मानना ​​है कि यह git fetchपर्दे के पीछे प्रभावी ढंग से करता है ।
ब्रायन पीटरसन

"git fetch" ने मेरी समस्या हल नहीं की, यह किया। मुझे नई जोड़ी गई शाखाओं की सूची मिली और यह संदेश "आपने रिमोट 'अपस्ट्रीम' से खींचने के लिए कहा, लेकिन एक शाखा निर्दिष्ट नहीं की। क्योंकि यह आपकी वर्तमान शाखा के लिए डिफ़ॉल्ट कॉन्फ़िगर किया गया रिमोट नहीं है, आपको कमांड पर एक शाखा निर्दिष्ट करनी होगी। लाइन। " और अगले "git स्टेटस" कमांड ने चेतावनी नहीं दिखाई।
कृष्ण पाण्डेय

2

यह आपको वर्तमान शाखा और वर्तमान ट्रैक करने वाली शाखा के बीच के अंतर को याद दिलाता है। कृपया अधिक जानकारी प्रदान करें, जिसमें संदेश में कौन सी शाखा मुद्रित है और आप वर्तमान शाखा को कहां धक्का / खींचते हैं।


2

हालांकि यह सवाल थोड़ा पुराना है ... मैं एक ऐसी ही स्थिति में था और मेरे जवाब से मुझे इसी तरह के मुद्दे को हल करने में मदद मिली

पहले कोशिश करो push -f या बल विकल्प के

अगर वह काम नहीं करता है तो यह संभव है कि (जैसा कि मेरे मामले में) दूरस्थ रिपॉजिटरी (या बल्कि दूरस्थ रिपॉजिटरी के संदर्भ) में दिखाया गया है git remote -v ) अपडेट नहीं हो रहे हैं।

अपने पुश के ऊपर होने के कारण आपके रिमोट / ब्रांच के साथ आपकी लोकल / ब्रांच सिंक हो गई है, हालांकि आपके लोकल रेपो में कैश अभी भी पिछली कमिटमेंट (लोकल / ब्रांच का ही ... बशर्ते केवल सिंगल कमिट को पुश करता हो) को HEAD के रूप में दिखाता है।

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

समाधान:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

अब push -fइस प्रकार करें

git push -f github master ### ध्यान दें कि आपके आदेश में originअब और नहीं है!

git pullअभी करोgit pull github master

पर git statusप्राप्त करते हैं

# On branch master

nothing to commit (working directory clean)

मुझे उम्मीद है कि किसी के लिए यह उपयोगी है क्योंकि विचारों की संख्या इतनी अधिक है कि इस त्रुटि की खोज लगभग हमेशा शीर्ष पर इस धागे को सूचीबद्ध करती है

विवरण के लिए gitref भी देखें


2

मैं वास्तव में यह तब हो रहा था जब मैं TortiseGIT के साथ एक स्विच / चेकआउट कर रहा था।

मेरी समस्या यह थी कि मैंने दूसरी स्थानीय शाखा के आधार पर शाखा बनाई थी। इसने एक "मर्ज" प्रविष्टि बनाई जिसमें /.git/configकुछ इस तरह से देखा गया:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

जब भी मैं "वेब" शाखा में स्विच करता हूं, तो यह मुझे बता रहा था कि मैं 100+ विकसित होने से पहले कमिट करता हूं। खैर, मैं अब विकास करने के लिए प्रतिबद्ध नहीं था, इसलिए यह सच था। मैं इस प्रविष्टि को केवल निकालने में सक्षम था और यह अपेक्षित रूप से कार्य कर रहा है। यह विकसित शाखा के पीछे होने की शिकायत करने के बजाए रिमोट रेफ के साथ ठीक से नज़र रखता है।

जैसा कि विक्रम ने कहा, यह स्टैक ओवरफ्लो थ्रेड Google में शीर्ष परिणाम है जब इस समस्या को खोज रहा है तो मैंने सोचा कि मैं अपनी स्थिति और समाधान साझा करूंगा।


2

मैं ऊपर दिए गए @Marian ज़र्बलिया द्वारा बताई गई बात को दोहराना चाहूंगा। इसने मेरे लिए काम किया और दूसरों को भी यही सुझाव दूंगा।

git pull origin develop

द्वारा पीछा किया जाना चाहिए $ git pull --rebase

यह $ git statusनवीनतम खींचने के बाद आने वाली टिप्पणियों को हटा देगा ।


2

git fetch आपके लिए इसका समाधान करेगा

यदि मेरी समझ सही है, तो आपका स्थानीय (कैश्ड) origin/masterपुराना है। यह कमांड सर्वर से रिपॉजिटरी स्टेट को अपडेट करेगा।


1
कृपया कुछ विवरण जोड़ें
मैथ्यू सनी

2

फिर जब मैं एक git स्टेटस करता हूं तो यह मुझे बताता है कि मेरी शाखा X कमिट्स से आगे है (संभवतः मेरे द्वारा किए गए कमिट की समान संख्या )।

मेरा अनुभव कई शाखाओं वाली टीम के माहौल में है। हम अपनी स्वयं की सुविधा शाखाओं (स्थानीय क्लोनों में) में काम करते हैं और यह उन लोगों में से एक था जिन्होंने git statusदिखाया कि मैं 11 कमिट आगे था। सवाल के लेखक की तरह मेरी काम करने की धारणा, +11 मेरे खुद के कमिट से थी ।

यह पता चला है कि मैंने developकई हफ्ते पहले अपनी सुविधा शाखा में आम शाखा से परिवर्तन में खींच लिया था - लेकिन भूल गया! जब मैंने आज अपनी स्थानीय सुविधा शाखा का पुनरीक्षण किया और git pull origin developसंख्या +41 तक कूद गया तो आगे बढ़ा। में बहुत काम किया गया था developऔर इसलिए मेरी स्थानीय सुविधा शाखा फीचर शाखा से भी आगे थीorigin रिपॉजिटरी ।

इसलिए, यदि आपको यह संदेश मिलता है, तो किसी भी तरह की खींच / मर्ज के बारे में सोचें जो आपने अन्य शाखाओं (अपनी खुद की, या अन्य) से की है, जिसकी आप तक पहुँच है। संदेश सिर्फ git pushउन संकेतों को दिखाता है जिन्हें आपके स्थानीय रेपो से रेपो ('ट्रैकिंग शाखा') में pullवापस बदल दिया जाता originहै ताकि चीजें सिंक हो जाएं।


1

जो उत्तर देते हैं git pullया git fetchसही होते हैं।
संदेश तब उत्पन्न होता है, जब और (जैसे) के git statusबीच अंतर दिखाई देता है.git/FETCH_HEAD.git/refs/remotes/<repository>/<branch>.git/refs/remotes/origin/master ) के ।

बाद वाली फ़ाइल अंतिम भ्रूण (रिपॉजिटरी / ब्रांच के लिए) से हेड को रिकॉर्ड करती है। git fetchशाखा की वर्तमान HEAD में दोनों फ़ाइलों को अपडेट करना ।
बेशक, अगर वहाँ लाने के लिए कुछ भी नहीं है (क्योंकि स्थानीय भंडार पहले से ही अद्यतित है) तो .git/FETCH_HEADपरिवर्तित नहीं होता है।


यह मेरे लिए मामला प्रतीत नहीं होता है: .git/FETCH_HEADइसमें शामिल हैं 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLऔर .git/refs/remotes/origin/masterइसमें शामिल हैं 9f7336c873ccffc772168bf49807e23ff74014d3, फिर भी मुझे अभी भी संदेश प्राप्त होता है और न git pullही git fetchइसे हल करता है
डेविड

0

यदि आपको यह संदेश शाखा में फ़ाइल को अनट्रैक करने के लिए कमिट करने के बाद मिलता है, तो किसी भी फ़ाइल में कुछ बदलाव करने का प्रयास करें और कमिट करें। जाहिरा तौर पर आप एकल प्रतिबद्ध नहीं बना सकते हैं जिसमें केवल पहले से ट्रैक की गई फ़ाइल को अनट्रैक करना शामिल है। अंत में इस पोस्ट से मुझे पूरी समस्या हल करने में मदद मिली https://help.github.com/articles/removing-files-from-a-repository-s-history/ । मुझे सिर्फ रिपॉजिटरी हिस्ट्री से फाइल को हटाना था।

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