पहली बार उपयोग करें git remote update
, अपने दूरस्थ रीफ़्स को अद्यतित करने के लिए फिर आप कई काम कर सकते हैं, जैसे:
git status -uno
आपको बताएगा कि आप जिस शाखा पर नज़र रख रहे हैं, वह आगे है, पीछे है या नहीं। यदि यह कुछ नहीं कहता है, तो स्थानीय और दूरस्थ समान हैं।
git show-branch *master
आपको उन सभी शाखाओं में दिखाई देगा जिनके नाम 'मास्टर' (जैसे मास्टर और मूल / मास्टर ) में समाप्त होते हैं ।
यदि आप ( ) के -v
साथ उपयोग करते हैं, तो आप देख सकते हैं कि कौन सी शाखाएँ अद्यतन हो गई हैं, इसलिए आपको वास्तव में किसी और आदेश की आवश्यकता नहीं है।git remote update
git remote -v update
हालाँकि, ऐसा लगता है कि आप एक स्क्रिप्ट या प्रोग्राम में ऐसा करना चाहते हैं और एक सच्चे / झूठे मूल्य के साथ समाप्त करना चाहते हैं। यदि ऐसा है, तो आपके वर्तमान HEAD प्रतिबद्ध और शाखा के प्रमुख के बीच संबंध की जाँच करने के तरीके हैं, हालाँकि जब से चार संभावित परिणाम हैं, आप इसे हाँ / नहीं उत्तर में कम नहीं कर सकते। हालाँकि, यदि आप ऐसा करने के लिए तैयार हैं, तो आप pull --rebase
"स्थानीय पीछे हैं" का इलाज कर सकते हैं और "स्थानीय ने" को "खींचने की आवश्यकता" के रूप में बदल दिया है, और अन्य दो को "खींचने की आवश्यकता नहीं है"।
आप किसी भी रेफरी की प्रतिबद्ध आईडी प्राप्त कर सकते हैं git rev-parse <ref>
, इसलिए आप इसे मास्टर और मूल / मास्टर के लिए कर सकते हैं और उनकी तुलना कर सकते हैं। यदि वे समान हैं, तो शाखाएं समान हैं। यदि वे असमान हैं, तो आप जानना चाहते हैं कि कौन दूसरे से आगे है। उपयोग करने git merge-base master origin/master
से आपको दोनों शाखाओं के सामान्य पूर्वज मिल जाएंगे, और यदि उन्होंने नहीं निकाला है तो यह एक या दूसरे के समान होगा। यदि आपको तीन अलग-अलग आईडी मिलते हैं, तो शाखाओं को मोड़ दिया गया है।
इसे ठीक से करने के लिए, उदाहरण के लिए, एक स्क्रिप्ट में, आपको वर्तमान शाखा को संदर्भित करने में सक्षम होने की आवश्यकता है, और दूरस्थ शाखा जो इसे ट्रैक कर रही है। /etc/bash_completion.d
शाखा नामों को प्राप्त करने के लिए बैश प्रॉम्प्ट-सेटिंग फ़ंक्शन में कुछ उपयोगी कोड होते हैं। हालाँकि, आपको वास्तव में नाम प्राप्त करने की आवश्यकता नहीं है। Git में शाखाओं और कमिट्स (जैसा कि दस्तावेज में है git rev-parse --help
) के संदर्भ में कुछ साफ-सुथरे शॉर्टहैंड हैं । विशेष रूप से, आप @
वर्तमान शाखा के लिए उपयोग कर सकते हैं (यह मानते हुए कि आप अलग-अलग स्थिति में नहीं हैं) और @{u}
इसके अपस्ट्रीम शाखा (जैसे origin/master
) के लिए। तो git merge-base @ @{u}
(वर्तमान में) हैश (जिस पर) की वर्तमान शाखा और इसके ऊपर की ओर मोड़ देंगे git rev-parse @
और git rev-parse @{u}
आपको दो युक्तियों का हैश देगा। इसे निम्नलिखित लिपि में संक्षेपित किया जा सकता है:
#!/bin/sh
UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")
if [ $LOCAL = $REMOTE ]; then
echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
echo "Need to push"
else
echo "Diverged"
fi
नोट: git के पुराने संस्करणों ने @
अपने दम पर अनुमति नहीं दी , इसलिए आपको @{0}
इसके बजाय उपयोग करना पड़ सकता है ।
लाइन UPSTREAM=${1:-'@{u}'}
आपको वैकल्पिक रूप से एक अपस्ट्रीम शाखा को पारित करने की अनुमति देती है, यदि आप वर्तमान शाखा के लिए कॉन्फ़िगर किए गए एक से अलग दूरस्थ शाखा के खिलाफ जांच करना चाहते हैं। यह आमतौर पर रीमोटेनम / ब्रांचनाम के रूप का होगा । यदि कोई पैरामीटर नहीं दिया गया है, तो मान चूक जाता है @{u}
।
स्क्रिप्ट मानती है कि आपने ट्रैकिंग शाखाओं को अद्यतित करने के लिए git fetch
या git remote update
पहले किया है । मैंने इसे स्क्रिप्ट में नहीं बनाया है क्योंकि यह अधिक लचीला होना है जिससे आप अलग-अलग ऑपरेशन कर सकते हैं और अलग-अलग ऑपरेशन के रूप में तुलना कर सकते हैं, उदाहरण के लिए यदि आप बिना लेट हुए तुलना करना चाहते हैं क्योंकि आपने हाल ही में प्राप्त किया है।