Git में चेकआउट कैसे करें?


314

मैं स्रोत कोड में एक प्रतिगमन पर काम कर रहा हूं। मैं Git को बताना चाहता हूं: "एक मानकीकृत तिथि / समय के आधार पर स्रोत की जांच करें"। क्या यह संभव है?

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


9
बस अगर आप इसके बारे में नहीं जानते हैं, तो जीआईट बिसेक्ट रिग्रेशन खोजने के लिए बहुत बढ़िया है। मैं कहूंगा, {1 साल पहले} सिंटैक्स का उपयोग करें जैसे एंडी ने कहा, एक ज्ञात-अच्छी प्रतिबद्ध को खोजने के लिए, फिर उस प्रारंभिक git bisect goodबिंदु के रूप में उपयोग करें ।
3

मुझे ऐसा लगता है कि यह एक अच्छा उपयोग मामला है tags
जेस

जवाबों:


365

अपने वर्तमान परिवर्तनों को बनाए रखने के लिए

आप अपने काम को बिना रुके, बिना रुके, दूर रख सकते हैं git stash। आप git stash popइसे वापस पाने के लिए उपयोग करना चाहेंगे । या आप कर सकते हैं (जैसा कि कार्लीटो ने कहा था) git commitयह एक अलग शाखा में है।

रीव-पार्स का उपयोग करके तारीख तक चेकआउट करें

आप rev-parseइस तरह का उपयोग करके एक विशिष्ट तिथि के आधार पर एक जांच कर सकते हैं :

git checkout 'master@{1979-02-26 18:30:00}'

उपलब्ध विकल्पों पर अधिक विवरण में पाया जा सकता है git-rev-parse

जैसा कि टिप्पणियों में उल्लेख किया गया है कि यह विधि आपके इतिहास में कमिटमेंट खोजने के लिए रिफ्लॉग का उपयोग करती है। डिफ़ॉल्ट रूप से ये प्रविष्टियाँ 90 दिनों के बाद समाप्त हो जाती हैं । हालांकि रिफ्लग का उपयोग करने के लिए सिंटैक्स कम क्रिया है आप केवल 90 दिन वापस जा सकते हैं।

रि-लिस्ट का उपयोग करके तारीख तक चेकआउट करें

अन्य विकल्प, जो रिफ्लॉग का उपयोग नहीं करता है, rev-listसमय के साथ एक विशेष बिंदु पर कमिट प्राप्त करने के लिए उपयोग करना है:

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`

यदि आप केवल अपना इतिहास चाहते हैं, तो मर्ज के द्वारा लाए गए - thefirst-parent पर ध्यान दें । जो आप आमतौर पर चाहते हैं।


2
@ क्या आप हमें अधिक विवरण दे सकते हैं रॉकी? आप कमांड लाइन पर क्या दर्ज कर रहे हैं और क्यों कहते हैं कि यह काम नहीं कर रहा है? क्या आपको कोई त्रुटि संदेश मिल रहा है?
एंडी

8
@Rocky: समस्या यह है कि पैरामीटर को उद्धरणों में संलग्न करने की आवश्यकता है, अन्यथा बैश रिक्त स्थान पर तर्कों को अलग करता है। कोशिश करो git co 'master@{2 days ago}'
मार्क वाइल्डन

13
नोट: आप कितनी दूर जाते हैं, इसके आधार पर, यह काम नहीं कर सकता क्योंकि यह रिफ्लॉग का उपयोग करता है (जो कुछ समय बाद समाप्त हो जाता है)। आपको 'चेतावनी: लॉग इन करें' मास्टर के लिए केवल वापस जाना होगा ... '। रॉकी का समाधान हमेशा काम करेगा। git checkoutgit rev-list -n 1 --before="2009-07-27 13:37" master
मार्क नादिग

3
मैंने आपके उत्तर को संपादित किया क्योंकि बैकटिक्स को हटा दिया गया है और पढ़ना मुश्किल है। सब्सक्रिप्शन $(...)पसंद किए जाते हैं।
अमेडी वैन गेस

1
@ और 40 वां जन्मदिन मुबारक हो, एंडी! (यह मानते हुए कि 1979-02-26 का क्या मतलब है :))
डेविड बिल्विन्स

123

एंडी का समाधान मेरे लिए काम नहीं करता है। यहाँ मुझे एक और तरीका मिला:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git: तिथि के अनुसार चेकआउट करें


3
जब मैं कमांड के ऊपर निष्पादित करता हूं तो मुझे error: unknown switch `n'कोई भी विचार मिलता है कि इसे कैसे प्राप्त किया जाए?
टिम

15

ऐसा लगता है कि आपको इसकी तर्ज पर कुछ चाहिए: तारीख के आधार पर चेक चेकआउट

दूसरे शब्दों में, आप उपयोग करते हैं rev-list कमिट ढूंढने के लिए उपयोग करते हैं और फिर वास्तव में इसे प्राप्त करने के लिए चेकआउट का उपयोग करते हैं।

यदि आप अपने मंचित परिवर्तनों को नहीं खोना चाहते हैं, तो सबसे आसान बात यह होगी कि आप एक नई शाखा बनाएँ और उस शाखा में जाएँ। आप हमेशा शाखाओं के बीच आगे और पीछे स्विच कर सकते हैं।

संपादित करें: लिंक नीचे है, इसलिए यहां कमांड है:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

2
बढ़िया लिंक! इसलिए git checkout branch@{date}जब रिफ्लॉज समाप्त हो जाता है तो काम करना बंद कर देता है, लेकिन आप उपयोग कर सकते हैं git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
cdunn2001

10

उन लोगों के लिए जो प्रतिस्थापन के लिए एक पाइप पसंद करते हैं

git rev-list -n1 --before=2013-7-4 master | xargs git checkout

9

मेरे मामले में -n 1विकल्प काम नहीं करता है। विंडोज पर मैंने पाया है कि कमांड का निम्नलिखित क्रम ठीक काम करता है:

git rev-list -1 --before="2012-01-15 12:00" master

यह दी गई तारीख के लिए उचित प्रतिबद्ध SHA लौटाता है, और फिर:

git checkout SHA

4

git rev-parseसमाधान @Andy द्वारा प्रस्तावित ठीक काम करता है अगर तारीख आप रुचि रखते हैं है प्रतिबद्ध की तारीख । यदि आप लेखक की तारीख के आधार पर चेकआउट करना चाहते हैं , rev-parseतो यह काम नहीं करेगा, क्योंकि यह उस तारीख का उपयोग करने का विकल्प नहीं देता है, जो कमिट का चयन करने के लिए करता है। इसके बजाय, आप निम्न का उपयोग कर सकते हैं।

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

(यदि आप awk predicate $1 >= "2016-04-12" && $2 >= "11:37"में समय का उपयोग भी निर्दिष्ट करना चाहते हैं ।)


3

rev-listविकल्प के साथ आगे बढ़ते हुए , यदि आप अपने मास्टर ब्रांच से सबसे हाल के मर्ज को अपनी प्रोडक्शन ब्रांच में ढूंढना चाहते हैं (विशुद्ध रूप से काल्पनिक उदाहरण के रूप में):

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

मुझे उस कोड को खोजने की आवश्यकता थी जो किसी दिए गए दिनांक के रूप में उत्पादन सर्वर पर था। यह मेरे लिए मिल गया।


2

यदि आप उस समय रिपॉजिटरी के सटीक संस्करण पर वापस जाने में सक्षम होना चाहते हैं, तो आप जो निर्माण करते हैं, उस पर टैग लगाने के लिए सबसे अच्छा है जहां से आप बिल्ड बनाते हैं।

अन्य उत्तर एक निश्चित समय के रूप में एक शाखा में सबसे हालिया प्रतिबद्ध के लिए भंडार को वापस करने की तकनीक प्रदान करते हैं - लेकिन वे हमेशा पर्याप्त नहीं हो सकते हैं। उदाहरण के लिए, यदि आप एक शाखा से निर्माण करते हैं, और बाद में शाखा को हटा देते हैं, या उस शाखा से निर्माण करते हैं जिसे बाद में छूट दी जाती है, तो आपके द्वारा बनाई गई प्रतिबद्धता किसी भी वर्तमान शाखा से "अप्राप्य" बन सकती है। जीआईएस में अप्राप्य वस्तुओं को अंततः हटाया जा सकता है जब रिपॉजिटरी को कॉम्पैक्ट किया जाता है।

टैग को कमिट पर रखने का मतलब है कि यह कभी भी अप्राप्य नहीं होता है, फिर चाहे आप शाखाओं के साथ क्या करें (टैग को हटाने पर रोक)।


यद्यपि यह मुझे वह उत्तर नहीं देता जिसकी मैं तलाश करता हूं, यह अब तक उल्लिखित एक पहलू को इंगित करने के लिए एक अच्छे उल्लेख के लायक है। यह उन समस्याओं का स्रोत हो सकता है जो आपको सही संस्करण तक पहुंचने से रोकते हैं।
मैनुअलविगारिया

1
git rev-list -n 1 --before="2009-07-27 13:37" origin/master

मुद्रित स्ट्रिंग लें (उदाहरण के लिए XXXX) और करें:

git checkout XXXX

2
क्या यह @bartoszkp उत्तर की नकल नहीं है? मूल के संदर्भ को जोड़ते हुए, अन्य उत्तर पर टिप्पणी होनी चाहिए ...
manuelvigarcia

हां, वास्तव में, लगभग यह स्पष्ट करना कि कौन कॉपी करना चाहता है, कौन नहीं जानता कि SHA क्या है (मेरे जैसे), मेरे मामले में वह पाठ स्पष्ट नहीं था और यह मेरा कोड है समाधान को खोजने के बाद, कॉपी नहीं किया गया, वास्तव में आप देख सकते हैं विकल्प भी स्पष्ट रूप से अलग हैं
लुका सी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.