सवाल गिट रिमोट रिपोजिटरी से विशिष्ट संशोधन खींचें


हमारे पास रिमोट गिट रेपो है जिसे हम आम तौर पर उपयोग करने से तैनात करते हैं git push तब हमारे देव सर्वर पर git pull रेपो के नवीनतम धक्का संस्करण प्राप्त करने के लिए हमारे लाइव सर्वर पर।

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

यानी कुछ पसंद है git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4


38
2018-02-26 18:26


मूल




जवाब:


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

git checkout 3ef0d...

42
2018-02-26 18:31



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


uploadpack.allowReachableSHA1InWant

जबसे गिट 2.5.0 यह विन्यास चर सर्वर पर सक्षम किया जा सकता है, यहां गिटहब सुविधा अनुरोध और यह गिटहब इस सुविधा को सक्षम बनाता है

बिटबकेट सर्वर ने संस्करण 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"

6
2017-08-10 11:23





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


2
2018-02-26 18:35





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

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


1
2017-11-13 11:20