Git के सबसे हाल के संस्करण में वापस कैसे आएं?


303

मैं हाल ही में एसवीएन से गिट में स्थानांतरित हुआ हूं और कुछ के बारे में थोड़ा भ्रमित हूं। मुझे एक स्क्रिप्ट के पिछले संस्करण को डिबगर के माध्यम से चलाने की आवश्यकता थी, इसलिए मैंने वही किया git checkout <previous version hash>और जो मुझे करने की आवश्यकता थी।

अब मैं नए संस्करण में वापस जाना चाहता हूं, लेकिन मुझे इसके लिए हैश का पता नहीं है। जब मैं टाइप करता हूं git log, तो मैं इसे नहीं देखता।

मैं यह कैसे कर सकता हूँ? इसके अलावा, हैश टाइपिंग की तुलना में संस्करणों को बदलने का एक आसान तरीका है - "गो बैक दो संस्करण" या "सबसे कालानुक्रमिक हाल में जाना" जैसे कुछ?

जवाबों:


371

git checkout masterचाल चलनी चाहिए। दो संस्करणों को वापस जाने के लिए, आप कुछ कह सकते हैं git checkout HEAD~2, लेकिन उस समय के आधार पर एक अस्थायी शाखा बनाने के लिए बेहतर है , इसलिएgit checkout -b temp_branch HEAD~2


7
ठंडा! git checkout masterठीक इसी तरह से मैं एक शाखा से वापस स्विच करता हूं। तो क्या इसका मतलब यह है कि जब मैं पिछले संस्करण की जांच करता हूं, तो मैं अनिवार्य रूप से एक शाखा बना रहा हूं?
नाथन लांग

4
@ नथन: गिट में एक शाखा एक निश्चित संशोधन के लिए वास्तव में एक चल सूचक है। इसलिए वैचारिक रूप से, आप एक शाखा बनाने की तरह हैं, लेकिन इस अर्थ में नहीं कि शाखाएं सोचती हैं।
DLH

2
तो सबसे सरल मामले में, जहां मुझे रैखिक परिवर्तनों का एक गुच्छा मिला है, जब मैं पहले के संशोधन की जांच करता हूं, तो मैं वहां HEAD पॉइंटर को स्थानांतरित कर रहा हूं, जिसका अर्थ git logउस बिंदु के सापेक्ष प्रदर्शित होगा? और जब मैं मास्टर चेकआउट करता हूं, तो मैं सूचक को मास्टर शाखा के नवीनतम संस्करण में स्थानांतरित करता हूं?
नाथन लॉन्ग

7
@ नथन: बिल्कुल सही। HEAD को एक प्रतीकात्मक रेफरी कहा जाता है - यह सामान्य रूप से एक अन्य रेफरी (वर्तमान में चेक आउट शाखा) के लिए एक सूचक है। git checkoutचारों ओर HEAD को स्थानांतरित करने का एक तरीका है। जब आपने HEAD को अलग किया, तो आपने उस दिए गए कमिट पर सीधे बात की; जब आप मास्टर को फिर से देखते हैं तो यह मास्टर को वापस इंगित करता है। (और कई आदेश जैसे git logवास्तव में एक संशोधन रेंज लेते हैं, जो HEAD के लिए चूक करता है।)
कैस्केबेल

3
हां - HEAD "सर्वनाम" है जिसका उपयोग "कार्यशील निर्देशिका में उस कोड के संस्करण" को संदर्भित करने के लिए किया जाता है। यह "आप आगे जो भी करते हैं उसके माता-पिता" के लिए भी सर्वनाम है
अना बेट्स

54

जब आप एक विशिष्ट कमिटमेंट के लिए चेकआउट करते हैं, तो गिट एक अलग शाखा बनाता है। इसलिए, यदि आप फोन करते हैं:

$ git branch 

आपको कुछ इस तरह दिखाई देगा:

* (detached from 3i4j25)
  master
  other_branch

मास्टर शाखा प्रमुख के पास वापस आने के लिए आपको बस अपनी मास्टर शाखा को फिर से चेकआउट करने की आवश्यकता है:

$ git checkout master

यह आदेश स्वचालित रूप से अलग की गई शाखा को हटा देगा।

यदि आप git checkoutकाम नहीं करते हैं, तो आपके पास शाखाओं के बीच परस्पर विरोधी फ़ाइलों को संशोधित करना संभव है। कोड को खोने से रोकने के लिए आपको इन फ़ाइलों से निपटने की आवश्यकता है। आपके पास तीन विकल्प हैं:

  1. अपने संशोधनों को रोकें (आप उन्हें बाद में पॉप कर सकते हैं):

    $ git stash
    
  2. बंद शाखा को रीसेट-आईएनजी में परिवर्तन को छोड़ दें:

    $ git reset --hard
    
  3. पिछले संशोधनों के साथ एक नई शाखा बनाएं और उन्हें प्रतिबद्ध करें:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

इसके बाद आप अपनी मास्टर शाखा (सबसे हालिया संस्करण) पर वापस जा सकते हैं:

$ git checkout master

36

यह मेरे लिए चाल चली (मैं अभी भी मास्टर शाखा पर था):

git reset --hard origin/master

34
रीसेट -हार्ड एक ओवरकिल है और दर्शाता है कि आप अपने द्वारा किए गए संशोधनों से अवगत नहीं हैं। यह कोड खोने के परिणामस्वरूप हो सकता है।
थोमियो

1
मेरे मामले में मैं अनपेक्षित रूप से गलती से किए गए परिवर्तनों से छुटकारा पाना चाहता था। मुझे पता है कि इसे प्राप्त करने के अन्य तरीके हो सकते हैं। यदि आप अपने अप्रकाशित प्रतिबद्ध परिवर्तनों को ढीला नहीं करना चाहते हैं तो यह डेटा हानि है।
सेसाबा तोथ

8

नवीनतम संस्करण पर लौटने के लिए:

git checkout <branch-name> 

उदाहरण के लिए, git checkout masterयाgit checkout dev


7

आप एक चीज़ के लिए, शाखा नामों का उपयोग करके देख सकते हैं।

मुझे पता है कि HEAD को इधर-उधर करने के कई तरीके हैं, लेकिन मैं इसे मिटाने के लिए इसे एक गिट एक्सपर्ट के पास छोड़ दूंगा।

मैं सिर्फ सुझाव देना चाहता था gitk --all- मैंने इसे जीआईटी के साथ शुरू करते समय बहुत उपयोगी पाया।


7

मैं सिर्फ गहराई में खोदने की शुरुआत कर रहा हूं, इसलिए निश्चित नहीं कि अगर मैं सही तरीके से समझ पाऊं, लेकिन मुझे लगता है कि ओपी के सवाल का सही जवाब यह है कि आप git log --allइस तरह एक प्रारूप विनिर्देश के साथ चल सकते हैं git log --all --pretty=format:'%h: %s %d':। यह वर्तमान चेक आउट संस्करण को चिह्नित करता है (HEAD)और आप सूची से अगले एक को पकड़ सकते हैं।

BTW, .gitconfigथोड़ा बेहतर प्रारूप के साथ अपने लिए इस तरह एक उपनाम जोड़ें और आप चला सकते हैं git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

रिश्तेदार संस्करणों के बारे में, मुझे यह पोस्ट मिला , लेकिन यह केवल पुराने संस्करणों के बारे में बात करता है, नए संस्करणों को संदर्भित करने के लिए शायद कुछ भी नहीं है।


6

कुछ उत्तर यहां दिए गए हैं जो आप मानते हैं कि इससे पहले कि आप एक पुरानी प्रतिबद्धताओं की जांच करने का निर्णय लें। ऐसी स्थिति हर बार नहीं होती है।

git checkout -

आपको उस शाखा को वापस इंगित करेगा जो आप पहले थे (भले ही यह मास्टर था या नहीं)।


एक शाखा आवश्यक नहीं है, यह HEAD को इंगित करेगा जहां यह पहले इंगित कर रहा था; यदि आपने git checkout hash2बाद में किया git checkout hash1, git checkout -तो आपको वापस ले जाएगा hash1
मिखाइल वासिन

3

जब आप पिछले संस्करण पर वापस जाते हैं,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

आप इस स्थिति में भी इस कमांड के साथ अपना फीचर लॉग (हैश) देख सकते हैं;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master एक और शाखा नाम के साथ प्रतिस्थापित किया जा सकता है।

फिर इसे चेक करें, आप इस सुविधा पर वापस जा पाएंगे।

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

2.23+ (अगस्त 2019) के साथ, भ्रामक कमांड के git switchबजाय सबसे अच्छा अभ्यास होगा ।git checkout

पुराने संस्करण के आधार पर एक नई शाखा बनाने के लिए:

git switch -c temp_branch HEAD~2

वर्तमान मास्टर शाखा में वापस जाने के लिए:

git switch master

0

उपयोग करने के लिए एक अधिक सुरुचिपूर्ण और सरल समाधान है

git stash

यह शाखा के सबसे नाराज स्थानीय संस्करण पर वापस आ जाएगा और अपने परिवर्तनों को छिपाने की स्थिति में भी बचाएगा, इसलिए यदि आप इस कार्रवाई को पूर्ववत करना चाहते हैं:

git stash apply

मुझे पता है कि यह बहुत पुराना है, लेकिन मुझे इस पर एक टिप्पणी करनी है (क्योंकि मुझे लगता है कि इस समाधान का उपयोग नहीं किया जाना चाहिए) - मैं इस समाधान का उपयोग नहीं करूंगा क्योंकि यह इस समस्या को हल नहीं करता है लेकिन एक अलग समस्या है। हर बार जब आप पिछली कमिटमेंट को चेकआउट करना चाहते हैं तो इस स्टैश सॉल्यूशन के साथ आप वास्तव में "सेव" डेटा जो इस केस के लिए बहुत अनावश्यक है। सही और अधिक सुरुचिपूर्ण तरीका है (जैसा कि पहले कहा गया है) बस चेकआउट करने के लिए <शाखा>।
मयॉ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.