जीआईटी ने अंतिम अलग किए गए हेड को बहाल किया


85

कृपया, मुझे अपनी परियोजना में एक बड़ी समस्या है: यह परिदृश्य है। मेरे पास GIT के तहत एक xcode प्रोजेक्ट है। आज मुझे एहसास हुआ कि आखिरी कमिट ने कुछ परीक्षण तोड़ दिए हैं, इसलिए मैंने पिछली प्रतिबद्ध जांच की। मैंने SourceTree का उपयोग किया और यह चेतावनी है

ऐसा करने से आपकी वर्किंग कॉपी 'डिटैच्ड हेड' हो जाएगी, जिसका मतलब है कि आप अब ब्रांच पर नहीं होंगे। यदि आप इसके बाद कमिट करना चाहते हैं, तो आप शायद फिर से एक ब्रांच चेकआउट करना चाहते हैं, या एक नई ब्रांच बनाना चाहते हैं। यह ठीक है?

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

मुझे पता है कि मेरे HEAD को अलग करना गलत था और सॉर्सेट्री ने मुझे चेतावनी दी ... लेकिन मेरे काम को बहाल करने का एक तरीका है?


एक ही समस्या के लिए एक संबंधित धागा यहाँ और कैसे यह यहाँ होता है पर तकनीकीताओं
RBT

जवाबों:


254

यदि आप टाइप करते हैं git reflog, तो यह आपको इतिहास दिखाएगा कि किन संशोधनों की HEADओर इशारा किया गया है। आपका अलग किया गया सिर वहां होना चाहिए। एक बार जब आप इसे ढूंढ लेते हैं, तो एक नई शाखा बनाने के लिए ऐसा करें git checkout -b my-new-branch abc123या git branch my-new-branch abc123(जहां abc123अलग किया गया SHA-1 है) जो आपके अलग किए गए सिर की ओर इशारा करता है। अब आप अपने आराम से उस शाखा को मिला सकते हैं।

आम तौर पर, यदि आप अलग किए गए सिर पर काम करने के बाद एक शाखा की जांच करते हैं, तो गिट को आपको उस अलग किए गए सिर से प्रतिबद्ध बताना चाहिए, जिस पर आप जरूरत पड़ने पर उसे पुनर्प्राप्त कर सकते हैं। मैंने कभी भी SourceTree का उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह उस संदेश से संबंधित है। लेकिन अगर यह उस संदेश को प्रदर्शित करता है, तो आपको उस कमिट को खोजने के लिए उपयोग करने में सक्षम होना चाहिए, और फिर से उस कमिट से शाखा का उपयोग करना git checkout -bया git branchबनाना होगा।


4
धन्यवाद ब्रायन। आपने मेरा दिन बचाया।
मुजम्मिल

ब्रायन, तुमने मेरा जीना बचा लिया! धन्यवाद!!
crrrr

मैं git के लिए नया हूँ .. मैं fatal: A branch named 'mybranch' already exists.मौजूदा शाखा में कैसे जोड़ूँ?
रमेश मुरुगेसन

1
ब्रायन को धन्यवाद देने वाले सभी लोगों के लिए एक PSA के रूप में: यदि आप ऐसा काम कर रहे हैं जिसे आप खोना नहीं चाहते हैं, तो इसे हर कुछ घंटों में रिमोट (जैसे जीथबब) पर धकेल दें। जब कोई उल्का आपके कंप्यूटर पर गिरता है, तो आपको खुशी होगी कि आपने किया। यदि आप अभी तक इसे सहयोगियों के साथ साझा करने के लिए तैयार नहीं हैं, तो बस इसे एक ऐसी शाखा में रख दें, जिसके बारे में किसी को भी अभी पता नहीं है और बाद में इसे बाद में फिर से तैयार कर लें।
MatrixManAtYrService

1
इसके अलावा, अगर यह एक एकल खोई हुई प्रतिबद्धता है जो अभी गायब हो गई है और आपने इसे वहां पाया है, तो आप इसे वापस ला सकते हैं git cherry-pick e5b2f7b, जहां e5b2f7bप्रतिबद्ध का SHA-1 है।
एडिन

10

सॉरसेट्री में, आप GUI का उपयोग करके ऐसा कर सकते हैं।

पहले कमांड इतिहास में एक संदेश की तलाश में "खोया" प्रतिबद्ध खोजें (देखें: कमांड आउटपुट दिखाएं)। यह संभवतः आपके द्वारा खोए जाने वाले आदेश के बाद कमांड "स्विचिंग शाखा" में होगा। उस संदेश में, उम्मीद है कि आप 1234567 कमिट आईडी के साथ कमेंट देखेंगे।

उस कमिट आईडी को अगले चरण में ले जाएं।

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

यहां छवि विवरण दर्ज करें


वास्तव में काम करता है। सुनिश्चित करें कि आप कमेंट आईडी के साथ सही टिप्पणी देखते हैं।
हम्माद खान

@blalond हैलो, आपके उत्तर को पढ़ने के बाद, मेरे पास एक छोटा सा सवाल है: जब SourceTree में मैं पिछली कमिट पर डबल-क्लिक करता हूं (इसे जांचने के लिए) मुझे एक ही संदेश मिलता है कि इससे अलग सिर हो जाएगा, इसलिए मुझे आश्चर्य है इसका क्या मतलब है जब लोग कहते हैं कि आप बस किसी भी पिछले संशोधन के साथ वापस आ सकते हैं? फिर मैं किसी विशेष कमिट में वापस कैसे आ सकता हूं? धन्यवाद

5

यदि आप अलग किए गए HEAD के परिवर्तन नहीं रखना चाहते हैं और सीधे कमांड के नीचे नवीनतम शाखा प्रतिबद्ध उपयोग पर जाना चाहते हैं।

git checkout - 

नोट: मैं अलग किए गए HEAD में आपके सभी परिवर्तनों को हटा दूंगा।


ओपी ने अपना काम रखने का अनुरोध किया। यह मूल प्रश्न का उत्तर नहीं देता है। बस एक शाखा में रखने के विकल्प को जोड़ने से यह उत्तर उपयोगी हो जाएगा।
मैनुएलविगेरिया

1

मेरे एक सहकर्मी की बस यही स्थिति थी। उनके मामले में, अलग-थलग सिर में आर-स्टूडियो काम में काम कर रहे थे - और उपकरण ने उन्हें चेतावनी दी कि वे इस और उस SHA संदर्भ के साथ शाखा बना सकते हैं ... लेकिन चूंकि एकमात्र विकल्प "बंद" था --duh !! यह एक सूचना बॉक्स था - उन्होंने बातचीत बंद कर दी और हमेशा के लिए जानकारी खो दी ...

reflogकमांड के लिए धन्यवाद हम देख सकते हैं कि परिवर्तन खो नहीं गए थे। लेकिन हमारे मामले में, git branchउम्मीद के मुताबिक काम नहीं किया ... या एक आने वाले git pullने इसे किसी तरह गड़बड़ कर दिया। हमें रिफ्लेक्स से नवनिर्मित शाखा में परिवर्तन करना था:

 git cherry-pick 0b823d42..3cce27fc

जिस शाखा में हम चाहते थे, वह सभी आवागमन रखे। तब हम developबिना किसी समस्या के शाखा में विलय कर सकते थे ।

बस अगर यह किसी के लिए जानकारीपूर्ण है, तो हमने "चेकआउट" (जो शाखा शिफ्टिंग की पहचान करते हैं) के साथ चिह्नित लोगों के बीच में अलग-थलग पड़ने वाले कमिट्स की पहचान की थी reflog:

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

उन हम चाहते थे थे HEAD@{8}करने के लिए HEAD@{6}(दोनों शामिल)। तो हमने उन्हें:

git cherry-pick 0b823d42..3cce27fc

फिर सामान्य मर्ज को हल करने और अंतिम कमिटमेंट ने हमें शाखा खो-खो के साथ छोड़ दिया, जो कि हमने सोचा था कि खोए हुए सिर के काम की मेजबानी करेगा। यह कहते हुए कि इस समय विकास तेजी से आगे बढ़ रहा था।


0

मैंने इस परिदृश्य की कोशिश की, और पाया कि मुझे अंतिम वचन का SHA-1 बताता है:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

क्या आपने यह संदेश देखा?


नहीं। या शायद मैं ध्यान नहीं देता। मैं
टिमेमाचाइन

1
@IgnazioC आपको एक बैकअप देखने की आवश्यकता नहीं है। क्या आपने मेरे उत्तर पर एक नज़र डाली? git reflogआपको वह दिखाना चाहिए जो आपको चाहिए।
ब्रायन कैंपबेल

0

अलग किया गया सिर तब तक ठीक रहता है जब तक आप कोई बदलाव नहीं करना चाहते।

यदि आप एक कमिट वापस करना चाहते हैं, तो आप विशिष्ट शाखा पर गिट रिवर्ट का उपयोग कर सकते हैं

यदि आप बंद सिर पर काम करना चाहते हैं और कमिट करते हैं; एक नई शाखा बनाएं (और बाद में इसे मर्ज करें);


हाँ! हम नियमों को जानते हैं। लेकिन जब सहकर्मी अलग किए गए सिर से काम करते हैं और फिर उन कमिटों को बंद करते हैं, तो वे जवाब मांगते हैं, नियम नहीं।
manuelvigarcia

0
  1. सबसे पहले, git reflogइतिहास को देखने के लिए दौड़ें ।
  2. सबसे पुराना संशोधन सूची में अंतिम एक होगा।
  3. git checkout -b temp e35d2b3E35dd23 का उपयोग करके अपनी इच्छित कमेट पर स्विच करें यह आपकी प्रतिबद्धताओं का हैश मान है।
  4. बस। अब सिर्फ git add करें। आदि....

इसे एक उत्तर के रूप में स्वीकार करें यदि यह आपके मुद्दे को हल करता है। अन्यथा कृपया अपनी टिप्पणी साझा करें।

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