अपने Mac पर, Terminal खोलें, रिपॉजिटरी में जाएं और git status -sb चलाएं। यदि वर्तमान शाखा अपने अपस्ट्रीम के सापेक्ष ahead 1 (या कोई अन्य धनात्मक संख्या) दिखाती है, तो इसमें ऐसे स्थानीय कमिट हैं जो उस रिमोट-ट्रैकिंग शाखा में शामिल नहीं हैं जिससे Git तुलना कर रहा है। उस तुलना को रीफ़्रेश करने के लिए पहले फ़ेच करें, फिर विशिष्ट कमिटों को सूचीबद्ध करें। यह कमिट किए गए इतिहास की जांच करता है; ऐसे संपादन जिन्हें कमिट नहीं किया गया है, वे एक अलग प्रकार के स्थानीय परिवर्तन हैं।

वर्तमान शाखा की तुलना उसकी रिमोट-ट्रैकिंग शाखा से करें

Terminal में, प्रोजेक्ट फ़ोल्डर में जाएं। आप cd टाइप कर सकते हैं, फ़ोल्डर को Finder से Terminal विंडो में खींच सकते हैं, और फिर Return दबा सकते हैं। चलाएं:

git status -sb

## main...origin/main [ahead 2] जैसा परिणाम यह दर्शाता है कि स्थानीय main, Git द्वारा सबसे हाल ही में रिकॉर्ड की गई रिमोट स्थिति के आधार पर अपने कॉन्फ़िगर किए गए अपस्ट्रीम origin/main से दो कमिट आगे है। [behind 1] का अर्थ है कि ट्रैक की गई रिमोट शाखा में एक कमिट ऐसा है जो स्थानीय रूप से मौजूद नहीं है। यदि दोनों संख्याएं दिखाई देती हैं, तो शाखाएं डाइवर्ज (diverge) हो गई हैं। Git दस्तावेज़ बताते हैं कि जब अपस्ट्रीम सेट हो और तुलना के लिए उपलब्ध हो, तो status आगे और पीछे (ahead and behind) की संख्या दिखा सकता है। Git status documentation

पूरी स्थिति जानने के लिए, git status का उपयोग करें। यह वर्किंग ट्री और स्टेजिंग क्षेत्र में परिवर्तनों की भी रिपोर्ट करता है। वे संशोधित या अनट्रैक्ड फ़ाइलें अनपुश किए गए कमिट का प्रमाण नहीं हैं: वे अभी तक कमिट नहीं हैं। एक क्लीन वर्किंग ट्री में भी अनपुश किए गए कमिट हो सकते हैं, और एक डर्टी वर्किंग ट्री में एक भी नहीं हो सकता है।

तुलना को रीफ़्रेश करें, फिर कमिटों का निरीक्षण करें

origin/main नाम एक स्थानीय रिमोट-ट्रैकिंग संदर्भ है; यह सर्वर का लाइव दृश्य नहीं है। कॉन्फ़िगर किए गए रिमोट से संदर्भों को अपडेट करने के लिए एक फ़ेच चलाएं, फिर से स्थिति की जांच करें:

git fetch
git status -sb

git fetch उन फ़ेच किए गए परिवर्तनों को आपकी वर्तमान शाखा में मर्ज किए बिना रिमोट-ट्रैकिंग जानकारी को अपडेट करता है। यह स्थानीय कमिट को पुश नहीं करता है। यदि रिमोट तक नहीं पहुंचा जा सकता है या प्रमाणीकरण अनुपलब्ध है, तो फ़ेच विफल हो सकता है; उस स्थिति में, पुरानी तुलना आपको यह नहीं बता सकती कि सर्वर पर अभी क्या है। Git fetch documentation

यदि स्थिति दिखाती है कि शाखा आगे (ahead) है और उसका एक अपस्ट्रीम है, तो उन कमिटों को प्रदर्शित करें जो आपकी वर्तमान शाखा से पहुंच योग्य हैं लेकिन उस अपस्ट्रीम से नहीं:

git log --oneline '@{u}..HEAD'

आउटपुट की प्रत्येक पंक्ति एक कमिट है; पहली पंक्ति उस सीमा में सबसे नई है। एक खाली परिणाम का अर्थ है कि Git को उस सीमा में कोई कमिट नहीं मिला। @{u} शॉर्टहैंड का अर्थ है वर्तमान शाखा का कॉन्फ़िगर किया गया अपस्ट्रीम, और दो-बिंदु वाली सीमा (..) उन कमिटों का चयन करती है जो HEAD से पहुंच योग्य हैं लेकिन अपस्ट्रीम से नहीं। Git revisions documentation

उदाहरण के लिए, यदि status [ahead 2] दिखाता है और लॉग में दो कमिट विषय सूचीबद्ध हैं, तो वे ऐसे कमिट हैं जो ट्रैक की गई शाखा से स्थानीय रूप से आगे हैं। यह तय करने से पहले कि क्या आप उन्हें पुश करना चाहते हैं, यह एक उपयोगी पुष्टि है। यह स्वयं कुछ भी नहीं भेजता है।

यदि Git शाखा की तुलना नहीं कर सकता है

यदि git status -sb आगे/पीछे की कोई संख्या नहीं दिखाता है, तो हो सकता है कि शाखा का कोई कॉन्फ़िगर किया गया अपस्ट्रीम न हो। चलाएं:

git branch -vv

वर्तमान शाखा को * से चिह्नित किया गया है; कोष्ठक में दिया गया टेक्स्ट, जब मौजूद हो, उसके अपस्ट्रीम और डाइवर्जेंस संख्याओं की पहचान करता है। यदि कोई अपस्ट्रीम नहीं दिखाया गया है, तो Git के पास इस तुलना के लिए सामान्य ट्रैकिंग संदर्भ नहीं है। git remote -v कॉन्फ़िगर किए गए रिमोट नाम और URL दिखा सकता है, लेकिन यह स्थापित नहीं करता है कि कौन सी रिमोट शाखा अभीष्ट गंतव्य है। Git दस्तावेज़ अपस्ट्रीम को वैकल्पिक शाखा सेटिंग्स के रूप में वर्णित करते हैं जिनका उपयोग status जैसे कमांड द्वारा किया जाता है। Git pull documentation

origin/main का अनुमान लगाने से बचें: आपकी शाखा किसी भिन्न नाम वाली शाखा या किसी भिन्न रिमोट को ट्रैक कर सकती है। यदि आप अभीष्ट रिमोट शाखा जानते हैं, तो फ़ेच करने के बाद स्पष्ट रूप से तुलना करें, और origin/main को उसके वास्तविक नाम से बदलें:

git log --oneline origin/main..HEAD

यह उन कमिटों को सूचीबद्ध करता है जो आपके वर्तमान HEAD में मौजूद हैं लेकिन उस संदर्भ में अनुपस्थित हैं। यदि गंतव्य अनिश्चित है, तो परिणाम को पुश पूर्वावलोकन के रूप में मानने से पहले शाखा और रिमोट कॉन्फ़िगरेशन का निरीक्षण करें। Git कॉन्फ़िगर किए गए पुश गंतव्य को तुलना के लिए उपयोग किए जाने वाले अपस्ट्रीम से भिन्न होने की अनुमति देता है। Git revisions documentation

यह जांच क्या स्थापित करती है और क्या नहीं

तुलना केवल अंतिम सफल फ़ेच जितनी ही अद्यतित होती है। कोई अन्य व्यक्ति आपके फ़ेच के बाद नए कमिट पुश कर सकता है, या आपके पुश करने से पहले सर्वर बदल सकता है। एक सफल फ़ेच Git को एक नया संदर्भ प्रदान करता है; यह गारंटी नहीं देता कि बाद का पुश सफल होगा। इसी तरह, origin/main से अनुपस्थित कोई कमिट अनिवार्य रूप से प्रत्येक रिमोट या शाखा से अनुपस्थित नहीं होता है।

जब आपने अभीष्ट गंतव्य की पुष्टि कर ली हो और कमिट भेजना चाहते हों, तो अपनी रिपॉजिटरी की शाखा और रिमोट सेटअप के लिए उपयुक्त पुश कमांड का उपयोग करें। यदि Git रिपोर्ट करता है कि कोई अपस्ट्रीम कॉन्फ़िगर नहीं है, तो इसके लिए एक स्पष्ट रिमोट और शाखा की आवश्यकता हो सकती है; पुश करने से पहले गंतव्य की सावधानीपूर्वक जांच करें। उपरोक्त चरण स्थानीय-बनाम-ट्रैक किए गए इतिहास की पहचान करते हैं ताकि आप बिना कमिट किए गए फ़ाइल संपादनों को कमिट के साथ भ्रमित किए बिना यह निर्णय ले सकें।

स्रोत