रिमोट रिपॉजिटरी का विशेष संस्करण Git क्लोन


181

मैंने लगभग एक महीने पहले एक रिमोट गिट रिपॉजिटरी पर क्लोन किया था। दूरस्थ रिपॉजिटरी में कई बदलाव हुए हैं और अब अस्थिर हो गया है। अब मुझे रिपॉजिटरी की एक और कॉपी की आवश्यकता है, एक महीने पहले मेरे द्वारा क्लोन किए गए संस्करण के समान।

मैं यह कैसे करु?


के संभावित डुप्लिकेट stackoverflow.com/questions/3489173/...
निकोलस राउल

जवाबों:


242

आप अपने रिपॉजिटरी को किसी भी कमिटमेंट के लिए "रीसेट" कर सकते हैं (जैसे 1 महीने पहले)।

उसके लिए git-reset का प्रयोग करें :

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]

27
आपने इसका उल्लेख नहीं किया है, लेकिन यह केवल masterशाखा को रीसेट करेगा , जिसे डिफ़ॉल्ट रूप से क्लोन पर चेक किया जाता है। यदि masterआपके अलावा कोई अन्य शाखा आपकी मुख्य विकास शाखा है जिसे पहले चेक आउट किया जाना चाहिएgit reset
स्टीव फ़ॉली

16
आप चाहते हैं कि प्रतिबद्ध का एक साधारण चेकआउट क्यों नहीं किया जाएगा
नीमू

10
क्योंकि आप एक विशेष प्रतिबद्धताओं के लिए चेकआउट के बाद "अलग किए गए राज्य" पर होंगे।
रुई कारनेइरो

6
@ रुईकार्नेइरो का उपयोग करना बेहतर होगा कि git checkout -b new_branch hashआप किसी अन्य शाखा को स्पर्श किए बिना हैश के आधार पर एक नई शाखा बनाएं। किसी मौजूदा शाखा के प्रमुख के पास किसी दूरस्थ सर्वर पर किसी चीज़ को धकेलने का समय होने पर समस्याएँ पैदा हो सकती हैं।
लूक फ़ॉरेक्स-लैक्रोसिक्स

1
@YuriGhensev यदि कमिटमेंट को पहले से ही एक दूरस्थ शाखा में धकेल दिया गया है तो आप git pull origin [branch]अन्यथा कर सकते हैं , इसे खो सकते हैं।
रुई कारनेइरो

94

आप बस इस्तेमाल कर सकते हैं

git checkout  commithash

इस क्रम में

git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

प्रतिबद्ध हैश इस तरह दिखता है "45ef55ac20ce2389c9180658fdba35f4a66d204/


9
मुझे यह उत्तर सबसे अच्छा लगता है। मुझे लगता है कि एक git reset --hard, एक के पक्ष में बचा जाना चाहिए git checkout commit-hashgit reset --hardगिट इतिहास का एक हिस्सा निकाल देता है जो कभी-कभी वांछनीय नहीं होता है।
जॉर्डन स्टीवर्ट

8
git initआवश्यक नहीं है
Lautaro Paskevicius

37

उपयोग git logसंशोधन आप के लिए रोलबैक करना चाहते हैं, और ध्यान में रखना के हैश करते हैं। उसके बाद, आपके पास 2 विकल्प हैं:

  1. यदि आप उस संशोधन के बाद कुछ भी करने की योजना बनाते हैं, तो मैं आपको एक नई शाखा में चेकआउट करने की सलाह देता हूं :git checkout -b <new_branch_name> <hash>

  2. यदि आप उस संशोधन के बाद कुछ भी करने की योजना नहीं बनाते हैं, तो आप बस एक शाखा के बिना चेकआउट कर सकते हैं: git checkout <hash>- नोट: यह आपके भंडार को 'अलग किए गए राज्य' में रख देगा, जिसका अर्थ है कि इसका वर्तमान में किसी भी शाखा से जुड़ा नहीं है - फिर आप ' नए कमिट को वास्तविक शाखा में मिलाने के लिए कुछ अतिरिक्त काम करना होगा

उदाहरण:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

इस तरह से आप किसी भी प्रकार की चेतावनी को नहीं खोते हैं, इस प्रकार आप एक नए संशोधन पर जा सकते हैं जब यह स्थिर हो जाता है।


2
लेकिन यह भी कि आप एक अलग सिर पर हैं, जो केवल पढ़ने के लिए ठीक है। लेकिन जब आप इस संशोधन में बदलाव करने का इरादा रखते हैं, तो आपको एक नई शाखा बनाने की आवश्यकता होती है। अधिक informations के लिए sitaramc.github.com/concepts/detached-head.html देखें ।
रुडी

@ रूडी: धन्यवाद। यह उपयोग दिखाने के लिए सिर्फ एक उदाहरण था। इसका उल्लेख करने के लिए अद्यतन किया गया।
jweyrich

"काम करने की स्थिति" पर वापस जाने के लिए आप बस वही कर सकते हैं git checkout developजहाँ विकास आपकी शाखा का नाम है।
स्टीव तौबर

1
@SteveTauber ठीक है, मान आप है एक अलग शाखा है, जो काम कर रहा है , बदल रहा है कि शाखा वास्तव में पर्याप्त है।
jweyrich

19

यदि उस संस्करण को आपको प्राप्त करने की आवश्यकता है तो या तो एक शाखा या एक टैग है:

git clone -b branch_or_tag_name repo_address_or_path

2

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

उस समय किसी विशेष संस्करण को चिह्नित करने के लिए टैग हो सकते हैं । यदि नहीं, तो आप उन्हें स्थानीय स्तर पर स्वयं बना सकते हैं। ऐसा करने का एक अच्छा तरीका यह है कि git logउपकरण के साथ या शायद अधिक नेत्रहीन का उपयोग करें gitk(शायद gitk --allसभी शाखाओं और टैग को देखने के लिए)। यदि आप उस समय उपयोग किए गए कमिट हैश को देख सकते हैं, तो आप उन्हें उपयोग करके टैग कर सकते हैं git tag <hash>और फिर नई कार्य प्रतियों में देख सकते हैं (उदाहरण के लिए git checkout -b new_branch_name tag_nameया टैग नाम के बजाय सीधे हैश के साथ)।


1

आप इसे इस तरह से हल कर सकते हैं:

git reset --hard sha

कहाँ shaजैसे:85a108ec5d8443626c690a84bc7901195d19c446

आप कमांड के साथ वांछित शा प्राप्त कर सकते हैं:

git log

1

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"

0

आपके द्वारा अपेक्षित स्रोत पेड़ अभी भी गिट रिपॉजिटरी के भीतर उपलब्ध है, हालांकि, आपको उस कमेटी के SHA1 की आवश्यकता होगी जो आप में रुचि रखते हैं। मुझे लगता है कि आप वर्तमान क्लोन से SHA1 प्राप्त कर सकते हैं?

यदि आप उस SHA1 को प्राप्त कर सकते हैं, तो आप समान रिपॉजिटरी के लिए वहां एक शाखा / रीसेट बना सकते हैं।

रुई के उत्तर के अनुसार करता है


0

शायद git resetआपकी समस्या का हल निकाल ले।

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