रिमोट रिपॉजिटरी से git पुल रिवीजन करें


56

हमारे पास एक दूरस्थ गिट रेपो है जिसे हम सामान्य रूप से git pushअपने देव सर्वर पर प्रयोग करते हैं और फिर git pullअपने लाइव सर्वर पर रेपो का नवीनतम धक्का संस्करण प्राप्त करते हैं।

लेकिन अगर हमने कुछ संशोधन (बिना git pullजियो सर्वर पर) किए और किए हैं तो हम ऐसा कैसे कर सकते git pullहैं जो हम चाहते हैं कि पुरानी कमिट का जिक्र है?

यानी कुछ ऐसा git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

जवाबों:


64

एक बार जब आप रिपॉजिटरी खींच लेते हैं, तो आपको जाने में सक्षम होना चाहिए:

git checkout 3ef0d...

1
अच्छा लगा, इसने पूरी तरह से काम किया। यह भी देखा कि अगर मैं भविष्य में होने वाली खींचतान के लिए सिंक में वापस जाना चाहता हूं तो मुझे अगला पुल (यानी git pull server:repoबनाम नियमित git pull) करते समय रिमोट सर्वर को निर्दिष्ट करने की आवश्यकता है
dlrust

1
शायद ओपी ने गलत सवाल पूछा, लेकिन मेरे लिए यह सही सवाल है और इसका कोई जवाब नहीं है। सर्वर पर एक विशिष्ट प्रतिबद्ध है जो स्थानीय रूप से गायब है। कमिटमेंट एक शाखा का हिस्सा नहीं है और न ही किसी टैग का और यह एक पुल / भ्रूण के साथ trasnfered नहीं है। एक विशिष्ट प्रतिबद्धता लाने के लिए कैसे?
ब्लैकई

8

uploadpack.allowReachableSHA1InWant

चूंकि Git 2.5.0 इस विन्यास चर सर्वर पर सक्रिय किया जा सकता है, यहाँ GitHub सुविधा का अनुरोध और GitHub इस सुविधा को सक्षम करने

बिटबकेट सर्वर ने 5.5+ संस्करण के बाद से इसे सक्षम किया

उपयोग:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"

2

यदि आपके लाइव सर्वर पर कुछ प्रक्रिया तुरंत बस खींची गई सामग्री तक पहुंच जाती है (यानी आप git checkout 3ef0dखींचने के बाद काम नहीं कर सकते हैं ), तो आपको उस संस्करण को टैग करने पर विचार करना चाहिए जिसे आप उत्पादन में तैनात करना चाहते हैं और विशेष रूप से उत्पादन पर उस टैग की जांच करें, ताकि खींचने पर तुरंत न हो अपनी कार्यशील निर्देशिका बदलें। अन्यथा आप अपने पुल से पहले किसी को धक्का देने का जोखिम लेंगे।


1

ध्यान दें कि git pull git checkout my-old-commit अब एक विस्तृत राज्य अवस्था में आपको छोड़ देता है - प्रभावी रूप से आप भविष्य में एक नए प्रतिबद्ध पथ पर इस रिपॉजिटरी में भविष्य के कमिट भेज रहे हैं। परिनियोजन रेपो के लिए यह एक प्रमुख मुद्दा नहीं है, क्योंकि केवल कमिटेड लोगों को खींचे जाने से पहले ही सही तरीके से प्रतिबद्ध होना चाहिए।

हालांकि, कभी-कभी यह जांचने के लिए उपयोगी होता है कि प्रतिबद्ध मार्कर (सिर, टैग, रिमोट) मास्टर रेपो के समान दिखते हैं। अपने चेकआउट के बाद इसे ठीक करने के लिए: git reset - सिर को reattaches git fetch - रिमार्क्स के लिए मार्करों को सिंक करता है [यह git संस्करण पर निर्भर हो सकता है - माना जाता है कि हमारा वातावरण अभी भी 1.7 पर है ... इसलिए अब YMMV की आवश्यकता नहीं हो सकती]

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