अरे यार, 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