धत तेरे की, Git!?!

Git कठिन है: गलतियाँ आसानी से हो सकती हैं, और यह पता लगाना कि आपकी गलतियों को कैसे ठीक किया जाए असंभव है। Git प्रलेखन में यह मुर्गी और अंडे जैसी समस्या है जहाँ आप खुद को तब तक बाहर नहीं निकाल सकते, जब तक आपको अपनी समस्या को ठीक करने के लिए पहले से ही उसका नाम पता न हो जिसके बारे में आपको पता होना चाहिए।

तो यहाँ कुछ बुरी स्थितियाँ हैं जहाँ मैं खुद रहा हूँ, और आखिरकार मैंने खुद को उन स्थितियों से कैसे बाहर निकाला सामान्य हिंदी में

धत तेरे की, मैंने कुछ बहुत गलत कर दिया है, कृपया मुझे बताएं कि Git में एक जादुई समय यंत्र है?!

git reflog
# आपको आपके पास मौजूद हर चीज की एक सूची दिखाई देगी
# जो आपने git में सभी branches में commit किया है!
# हर एक का एक इंडेक्स HEAD@{index} है
# उस commit का पता लगाएं, जहां से आपने गड़बड़ी शुरू की है
git reset HEAD@{index}
# जादुई समय यंत्र

आप इसके द्वारा गलती से हटाए गए किसी काम को वापस पा सकते हैं, या आपके द्वारा आजमाए गए किसी चीज़ को हटाने के लिए, या repository से गड़बड़ कोड हटाने के लिए, या खराब merge को ठीक करने के लिए, या फिर बस उस commit तक वापस जाने के लिए उपयोग कर सकते हैं जहां चीजें वास्तव में काम कर रही थी। मैं reflog का बहुत उपयोग करता हूँ। कई लोगों ने मुझे इसे जोड़ने का सुझाव दिया था, उनको मेरा सलाम!

धत तेरे की, मैंने commit किया और मुझे तुरंत महसूस हुआ कि मुझे एक छोटा बदलाव करने की आवश्यकता है!

# परिवर्तन करें
git add . # or add individual files
git commit --amend --no-edit
# अब आपकी अंतिम commit में वह बदलाव है!
# चेतावनी: कभी public commits का संशोधन न करें।

यह आम तौर पर मेरे साथ होता है यदि मैं commit करू, फिर tests/linters... चलाऊ और धत, मैंने एक बराबर संकेत के बाद एक खाली स्थान नहीं रखा। आप बदलाव को एक नई commit के रूप में भी बना सकते हैं और फिर उन दोनों को एक साथ जोड़ करने के लिए rebase -i कर सकते हैं, लेकिन यह लगभग एक लाख गुना तेज है।

चेतावनी: आपको कभी भी उन commits को संशोधित नहीं करना चाहिए जिन्हें public/shared branch में push किया गया है! केवल उन्हीं commits का संशोधन करें जो केवल आपकी स्थानीय प्रति में मौजूद है वरना आपके साथ बहुत बुरा हो सकता हैं।

धत तेरे की, मुझे अपनी अंतिम commit पर संदेश को बदलने की आवश्यकता है!

git commit --amend
# commit पर संदेश को बदलने के लिए संकेतों का पालन करें

मूर्ख commit संदेश स्वरूपण हेतु आवश्यकताएँ।

धत तेरे की, मैंने गलती से master branch मे कुछ commit किया जो की एक नई branch पर होना चाहिए था!

# master की वर्तमान स्थिति से एक नई branch बनाएं
git branch some-new-branch-name
# master branch से अंतिम commit हटा दें
git reset HEAD~ --hard
git checkout some-new-branch-name
# आपकी commit अब इस शाखा में रहती है :)

ध्यान दें: यह काम नहीं करता है यदि आपने पहले से ही एक public/shared branch के लिए commit किया है, और यदि आपने पहले अन्य चीजों की कोशिश की है, तो आपको HEAD~ के बजाय git reset HEAD@{number-of-commits-back} की आवश्यकता हो सकती है। असीम उदासी। इसके अलावा बहुत से लोगों ने इसे छोटा बनाने के लिए कई भयानक तरीके सुझाय जिसे मैं खुद नहीं जानता था। आप सभी को धन्यवाद!

धत तेरे की, मैंने गलती से गलत branch में commit कर दिया

# अंतिम commit को पूर्ववत करें, लेकिन उपलब्ध परिवर्तनों को छोड़ दें
git reset HEAD~ --soft
git stash
# सही branch में जाएँ
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# अब आपके परिवर्तन सही branch पर हैं :)

बहुत से लोगों ने इस स्थिति के लिए cherry-pick का उपयोग करने का सुझाव दिया है, इसलिए जो भी आपको बेहतर समझ आये, उसका इस्तेमाल करें!

git checkout name-of-the-correct-branch
# अंतिम commit को master में ले जाने के लिए पकड़ो
git cherry-pick master
# इसे master से हटाओ
git checkout master
git reset HEAD~ --hard

धत तेरे की, मैंने एक diff चलाने की कोशिश की लेकिन कुछ नहीं हुआ ?!

यदि आप जानते हैं कि आपने फ़ाइलों में परिवर्तन किया है, लेकिन diff खाली है, तो आप संभवतः अपनी फ़ाइलों को स्टेजिंग में add किया है और आपको एक विशेष flag का उपयोग करने की आवश्यकता है।

git diff --staged

File under ¯\_(ツ)_/¯ (हाँ, मुझे पता है कि यह एक विशेषता है, bug नहीं, लेकिन यह चकित करने वाला और गैर-स्पष्ट होता है, जब यह पहली बार आपके साथ होता है!)

धत तेरे की, मुझे 5 commits से पहले की commit को पूर्ववत करने की जरूरत है!

# आप पूर्ववत करने के लिए commit खोजे
git log
# इतिहास में ऊपर और नीचे स्क्रॉल करने के लिए तीर कुंजियों का उपयोग करें
# एक बार जब आप अपना commit पा लेते हैं, तो हैश सेव करें
git revert [saved hash]
# git एक नया commit बनाएगा जो की उस commit को पूर्ववत करता है
# संकेतों का पालन करते हुए commit सन्देश को ठीक करें 
# या बस सेव और commit करें

परिवर्तनों को पूर्ववत करने के लिए आपको पुरानी फ़ाइल सामग्री को खोजने और कॉपी-पेस्ट करने की आवश्यकता नहीं है! यदि आपने कोई बग commit किया है, तो आप revert के साथ एक बार में सभी कमिट को पूर्ववत कर सकते हैं।

आप एक पूर्ण commit के बजाय किसी एकल फ़ाइल को वापस भी ला सकते हैं! लेकिन निश्चित रूप से, सच्चे Git फैशन में, यह एक पूरी तरह से अलग आदेश होंगे ...

धत तेरे की, मुझे फ़ाइल में अपने परिवर्तनों को पूर्ववत करने की आवश्यकता है!

# फ़ाइल को बदलने से पहले commit के हैश का पता लगाएं
git log
# इतिहास में ऊपर और नीचे स्क्रॉल करने के लिए तीर कुंजियों का उपयोग करें
# एक बार जब आप अपना commit पा लेते हैं तो हैश सेव करें
git checkout [saved hash] -- path/to/file
# फ़ाइल का पुराना संस्करण आपके सूचकांक में होगा
git commit -m "Wow, you don't have to copy-paste to undo"

जब अंत में मुझे यह पता लगा तो मैं झूम उठा। जैसे एकदम धरती से चाँद तक छलांग लगा ली हो। लेकिन गंभीरता से सोचने पर checkout-- एक फ़ाइल को पूर्ववत करने का सबसे अच्छा तरीका कैसे हो सकता है? लीनुस टोर्वाल्ड दे ताली!

इसको भूल जाओ, मैं हार मानता हूं।

cd ..
sudo rm -r stupid-git-repo-dir
git clone https://some.github.url/stupid-git-repo-dir.git
cd stupid-git-repo-dir

इसके लिए एरिक वी को धन्यवाद। इस मजाक में sudo के उपयोग की सभी शिकायतें उसे निर्देशित की जा सकती हैं।

यदि आपकी branch में बहुत समस्याएं हैं और उसके लिए आपको अपने repository में बदलाव करना परजाये, तो आपको "git-स्वीकृत" तरीके से अपने repo को remote repo के समान रीसेट करने की आवश्यकता है, इसे आज़माएं लेकिन सावधान रहें ये विनाशकारी और अस्वीकार्य क्रियाएं हैं!

# origin की नवीनतम स्थिति प्राप्त करें
git fetch origin
git checkout master
git reset --hard origin/master
# ट्रैक न किए गए फ़ाइलों और निर्देशिकाओं को हटा दें
git clean -d --force
# प्रत्येक कष्टदायक शाखा के लिए बार-बार checkout/reset/clean करें

* अस्वीकरण: यह साइट पूर्ण संदर्भ के लिए नहीं है। और हाँ, इस चीज़ को करने के और भी बेहतर तरीके हो सकते हैं, लेकिन मैं इस परिणाम पर कई चरणों के परीक्षण और बहुत सारी कठबोली और टेबल फ़्लिपिंग के माध्यम से आया हूं, और मेरे दिमाग में यह साइट बनाने का पागल विचार आया जिसे मैं आपके साथ साझा कर रहा हूँ। हमारी कोई जवाबदारी नहीं है!

उन लोगों के लिए बहुत धन्यवाद जिन्होंने साइट को नई भाषाओं में अनुवाद करने के लिए स्वेच्छा से काम किया है, आपने धमाल मचा दिया है! Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) · Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl) · Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai (th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . हमने इनसे अतिरिक्त मदद ली। Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

यदि आप भी अपनी भाषा में अनुवाद जोड़ने में मदद करना चाहते हैं, तो यहाँ एक PR सबमिट करें GitHub