अलग-थलग पड़ने वाली स्थिति में निर्मित होने वाले हिट के लिए क्या होता है?


137

यह हुआ था:

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


जब आप कहते हैं कि "मैंने शाखा ए में पिछली प्रतिबद्धताओं की जाँच की है", तो क्या आपका मतलब है "मैं पिछली प्रतिबद्धता के लिए शाखा ए रीसेट करता हूं"? यानी आप वास्तव में git resetबजाय git checkout?
सीबी बेली

नहीं, मैंने चेकआउट किया। फिर से काम किया।
मौसिमो

यदि आप चेकआउट का उपयोग करते हैं तो आप अलग HEAD- थलग पड़ जाते थे और शाखा A पिछली प्रतिबद्धताओं पर बनी रहती थी। वास्तव में आपने क्या आदेश चलाया?
सीबी बेली

1
मैं OSX शेर पर SourceTree GIT GUI का उपयोग कर रहा था। मैं शाखा ए पर था और शाखा ए पर पिछली प्रतिबद्धता का एक चेकआउट किया। फिर मैंने कोड में बदलाव किया और प्रतिबद्ध (शाखा ए) किया। मेरा मानना ​​है कि मैं एक अलग सिर था।
मौसिमो

ठीक है, मुझे लगता है कि मैं भ्रमित हो गया था जब आपने कहा था कि आपने शाखा ए पर अधिक बदलाव किया है
सीबी बेली

जवाबों:


185

पुरानी कमेटी अभी भी रिफ्लॉग में है।

git reflog

यह कमिट्स की एक सूची दिखाएगा, और "खोई हुई" प्रतिबद्धता वहां होनी चाहिए। आप इसे एक नई शाखा में बना सकते हैं। उदाहरण के लिए, यदि SHA-1 ba5a739 है, तो आप पुरानी प्रतिबद्धता पर "नई-शाखा" नामक एक नई शाखा बना सकते हैं:

git branch new-branch ba5a739

ध्यान दें कि डेटाबेस खो जाने पर "खो गया" कमिट डिलीट हो जाएगा।


3
मैंने वही किया और दिल का दौरा पड़ने के बारे में सोचकर वह खो गया। जानकारी के लिए धन्यवाद!
चेस

14
git cherry-pick [SHA]यदि आप गलती से सिर की स्थिति में रहते हैं, तो एक मौजूदा शाखा पर कमिट करने के लिए उपयोग करें
Jan Aagard Meier

3
वैकल्पिक रूप से आप किसी मौजूदा शाखा में स्विच कर सकते हैं और रिफ्लग में सूचीबद्ध "खो" प्रतिबद्ध के अनुरूप "git मर्ज HEAD @ {n}" कर सकते हैं।
eakinkin

क्या आप जानते हैं कि अगर pruneडिलीट किए गए मैसेज में रेफर किए गए कमिट को भी डिलीट कर दिया जाएगा? या कि उन्हें पहुंच में आता है ?
कामाफेदर

@ कामफेदर: मुझे नहीं लगता है कि यह उन्हें पहुंच में लाता है।
डिट्रिच एप्प जू

63

आपके कमिट अभी भी रिफ्लॉग में उपलब्ध हैं, जैसा कि पहले ही बताया जा चुका है। अन्य उत्तरों के अलावा, यहां एक नई शाखा बनाने और विलय के बिना, सीधे अपनी वर्तमान शाखा में शामिल होने का एक तरीका है :

  1. अलग किए गए HEAD स्थिति में किए गए कमिट के SHA-1 हैश को देखें

    git reflog
    
  2. फिर निष्पादित करें, सभी प्रतिबद्ध हैश के साथ सबसे पुराने से हाल के दिनों में ऑर्डर किए गए:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    उदाहरण के लिए यदि मेरे पास केवल एक ही है, तो "पहले 7 वर्ण" लघु हैश प्रारूप में दिया गया है:

    git cherry-pick a21d053
    

यह आपकी वर्तमान शाखा में नए कमिट बनाएगा, जो आपके द्वारा कमांड में उल्लिखित है। यह मूल प्रतिबद्ध संदेश भी लेता है।


11

आपको निम्न आदेश के साथ खो जाने (झूलने) का संकेत मिल सकता है:

git fsck --lost-found

ध्यान दें, यदि आपका वर्तमान सिर कमिटेड है, तो यह खोए हुए के रूप में सूचीबद्ध नहीं है।

आप git-fsck (1) मैनुअल पेज पर अधिक जानकारी पा सकते हैं

फिर आप उस खोई हुई प्रतिबद्धता पर शाखा बना सकते हैं:

git branch new-branch ba5a739

मैंने पहली बार "git reflog" कमांड का इस्तेमाल किया, फिर "git Branch new-branch ba5a739" एक सबमॉड्यूल के लिए, इसने काम किया।
ondermerol

7

आपकी कार्यशील निर्देशिका की स्थिति के लिए Git parlance एक " अलग है "। यहाँ एक और जगह है git reflogजो बचाती है।

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

अगर मैं एक अलग शाखा की जांच करने की कोशिश करता हूं, तो git-1.7.5.1 एक उपयोगी सुझाव देता है।

$ गिट चेकआउट मास्टर
चेतावनी: आप 1 प्रतिबद्ध को पीछे छोड़ रहे हैं, से जुड़ा नहीं है
आपकी कोई भी शाखा:

  0b40dd6 HEAD के लिए मेरी प्रतिबद्धता अलग है

यदि आप नई शाखा बनाकर उन्हें रखना चाहते हैं, तो यह एक अच्छा समय हो सकता है
ऐसा करने के लिए:

 git शाखा new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

शाखा 'मास्टर' में बदल गया

जानकारी और लिंक के लिए धन्यवाद। लिंक ने मुझे समझने में मदद की कि क्या हो रहा था।
मौसिमो

6

आपने इसे नहीं खोया, गिट अभी भी एक प्रतिलिपि रखता है (लेकिन यह वर्तमान में किसी भी शाखा प्रमुख द्वारा उपलब्ध नहीं है)। आप git reflogकमांड का उपयोग करके अपने लापता कमिट को पा सकते हैं । रिफ्लग एक शाखा प्रमुख के ऐतिहासिक पदों का ट्रैक रखता है, और आप इसका उपयोग उन चीजों को खोजने के लिए कर सकते हैं जो शाखा प्रमुख पहले इंगित कर रहे थे।


4

अपने अलग किए गए सिर को गिट रेपो से जोड़ने के लिए इन चरणों का पालन करें

  1. git checkout "your branch with path but without remote name"

उदाहरण के लिए यदि दूरस्थ नाम मूल और शाखा नाम है bugfix/somebranchतो उपयोग करेंgit checkout bugfix/somebranch

  1. git reflog अलग शाखा की अपनी प्रतिबद्ध सूची से प्रतिबद्ध SHA को सूचीबद्ध करें।

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

सब तैयार!!


2

सॉर्सेट्री में, मैंने पाया कि git reflog काम नहीं करता था, इसलिए मुझे लगा कि GUI का उपयोग करके यह कैसे करना है।

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

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

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

यह मेरे लिए कुछ खोया हुआ काम वापस लाया!

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