सवाल मैं 1 प्रतिबद्ध वापस कैसे रोल कर सकता हूं?


मेरे पास 2 काम हैं जो मैंने धक्का नहीं दिया:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

मैं अपना पहला (सबसे पुराना) वापस कैसे रोल कर सकता हूं, लेकिन दूसरा रख सकता हूं?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

यहां से:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

क्या मुझे बस करने की ज़रूरत है:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

अर्थात्?


119
2017-09-03 21:23


मूल


यह प्रश्न ऑफ़-विषय प्रतीत होता है क्योंकि यह एक प्रोग्रामिंग टूल के बारे में है। यह स्टैक ओवरफ़्लो पर है। - Peter Mortensen
@ पीटर मॉर्टेंसन सहमत यह SuperUser के लिए गुंजाइश है - Kolob Canyon


जवाब:


जाने का सबसे सुरक्षित और शायद सबसे साफ तरीका इंटरैक्टिव रूप से पुनर्जीवित करना है।

git rebase -i HEAD^^

या,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

वहां से आप प्रतिबद्धता को स्क्वैश कर सकते हैं, जो एक या अधिक को पिछले प्रतिबद्धता में एक साथ रखता है। इतिहास से प्रतिबद्धता को पूरी तरह से हटाने के लिए, सूची से रेखा हटाएं।

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

यदि आप दोनों के साथ काम कर रहे हैं, तो एक ही फाइल को प्रभावित करते हैं, तो आप एक विलय संघर्ष देख सकते हैं।

भंडार को रीसेट करना git reset --hard देखभाल के साथ किया जाना चाहिए, क्योंकि इसे पूर्ववत नहीं किया जा सकता है।

पुनर्लेखन इतिहास देखभाल के साथ किया जाना चाहिए।


92
2017-09-03 21:32



'गिट रिबेस' के दौरान मैं एक प्रतिबद्धता कैसे हटा सकता हूं? केवल 3 कमांड हैं: चुनें, संपादित करें, स्क्वैश करें। AFAIK कोई डिलीट नहीं है। - n179911
पूरी तरह से सूची से लाइन हटा दें, और यह उस प्रतिबद्धता को हटा देता है - jtimberman
जब मैं परिवर्तन को वापस करना चाहता था तो मैं इसका कोई निशान नहीं छोड़ना चाहता था। यदि आप अपने रिवर्ट का कोई निशान नहीं छोड़ना चाहते हैं तो यह करने का सबसे अच्छा तरीका है। - Phillip Whelan
"सुरक्षित और संभवतः जाने का सबसे साफ तरीका इंटरैक्टिव रूप से पुनर्जीवित करना है" शायद नहीं, यदि आप विम का उपयोग नहीं करते हैं। मैं भाग्यशाली हो गया और उस गड़बड़ी से अपना रास्ता निकाला। अभी भी ऊपर उठना क्योंकि मुझे vim सीखना चाहिए :-) - isimmons
मैं उपयोग का सुझाव दूंगा rebase जितना संभव हो उतना कम। यदि आप दूसरों के साथ काम करते हैं तो बस करें revert। - boldnik


अगर से यह http://nakkaya.com/2009/09/24/git-delete-last-commit/  और यह मेरे लिए काम किया

गिट अंतिम प्रतिबद्धता हटाएं

एक बार देर रात में जब मैं कॉफी से बाहर भाग गया, तो मैं सामान करता हूं   कि मेरे पास नहीं होना चाहिए। फिर मैं अगले 10-15 मिनट गुगलिंग खर्च करता हूं   मैंने जो आखिरी प्रतिबद्धता को हटाया है उसे कैसे हटाया जाए। तो तीसरे बार मैं चाहता था   इसका रिकॉर्ड बनाएं ताकि मैं इसे बाद में देख सकूं।

यदि आपने जंक किया है लेकिन धक्का नहीं दिया है,

git reset --hard HEAD~1

हेड ~ 1 सिर से पहले प्रतिबद्धता के लिए एक शॉर्टेंड है। वैकल्पिक रूप से आप   हैश के SHA-1 को संदर्भित कर सकते हैं जिसे आप रीसेट करना चाहते हैं। ध्यान दें कि   जब काम कर रहे पेड़ में ट्रैक की गई फ़ाइलों में किसी भी बदलाव का उपयोग करते हैं   चूंकि सिर से पहले प्रतिबद्धता खो जाती है।

यदि आप जो काम किया है उसे मिटा देना नहीं चाहते हैं, तो आप इसका उपयोग कर सकते हैं    --soft विकल्प जो प्रतिबद्धता को हटा देगा लेकिन यह आपके सभी को छोड़ देगा   फ़ाइलों को बदल दिया "परिवर्तन करने के लिए परिवर्तन", क्योंकि गिट स्थिति इसे रखेगी।

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

git revert HEAD

यह एक नई प्रतिबद्धता बनाएगा जो सबकुछ पेश करता है   आकस्मिक प्रतिबद्धता।


48
2017-08-05 17:52



- सॉफ्ट विकल्प के साथ, यह एकदम सही है कि आप फ़ाइल का नाम बदलते हैं और गलती से "गिट एड-ए" का उपयोग करने के बजाए "गिट प्रतिबद्ध-ए"। - Aaron Harun


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


8
2017-09-03 21:26



खैर, यह काम करता है लेकिन यह आपको लॉग करने के लिए प्रदूषित करता है। यदि इन कामों को पहले से धक्का नहीं दिया गया था / खींच लिया गया था तो उन्हें एक इंटरैक्टिव रिबेस के साथ साफ करना बेहतर होगा। इतिहास बदलने की क्षमता अन्य संस्करण नियंत्रण प्रणालियों पर गिट के मुख्य फायदों में से एक है। - knweiss


मैंने अभी यह किया है:

git rebase -i HEAD^^

मैंने इसे खराब कर दिया ताकि मैंने किया

git rebase --abort

फिर फिर से किया। तब मुझे इस तरह धक्का देना पड़ा:

git push origin master -f

और यह उस प्रतिबद्धता से नया काम करता है जिसे मैंने वापस ले लिया था। महान काम किया।


5
2017-12-12 04:39





Jtimberman की टिप्पणी के संदर्भ में git reset --hard अवांछित होने के नाते, यह पूरी तरह से सच नहीं है। यहाँ देखें: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


4
2018-01-28 03:48





नहीं, git reset --hard baf8d5e हटा देंगे 3368e1c प्रतिबद्धता और सिर पर होगा baf8d5e बाद में।

यदि आप रखना चाहते हैं 3368e1cप्रतिबद्ध और हटाएं bad8d5e सबसे आसान समाधान करना एक "git rebase -i HEAD~2"(यानी पिछले दो प्रतिबद्धताओं का इंटरैक्टिव रिबेस)। यह आदेश आपके प्रतिबद्ध संदेश संपादक को लॉन्च करेगा और आप पिछले दो कामों में से प्रत्येक के लिए एक लाइन देखेंगे। वहां आप बस हटाएं bad8d5e लाइन प्रतिबद्ध और बचाओ। गिट फिर आपके इतिहास को फिर से लिख देगा और दूसरी प्रतिबद्धता समाप्त हो जाएगी।

ऐसे अन्य उपयोगी आदेश हैं जिनका उपयोग आप प्रतिबद्ध संदेश संपादक में कर सकते हैं squash, edit, आदि इंटरेक्टिव रिबेस बहुत शक्तिशाली है!

ऐसा न करें अगर किसी ने पहले ही ये देखा है (धक्का या अपने भंडार से खींचें)!


3
2017-09-03 21:46





git checkout <treeish> -- /path/to/dir

इससे / path / to / dir के लिए दिए गए "वृक्ष" से निर्देशिका वापस आ जाएगी


2
2017-10-12 09:23