अरे यार्, Git!?!

Git गार्हो छ: सजिलै गल्ति गर्न सकिन्छ, र त्यो गल्ति लाई कसरी सुधार्ने भनेर जान्न झन्डै असम्भव छ| Git को डकुमेन्टेसन(documentation) मा पनि फेरी त्यो "कुखुरा पहिला आयो कि अन्डा" जस्तो कुरा लेखिएको छ, जहाँ हामी चाहेर पनि त्यो गल्ति कसरी सुधार्ने भनेर खोज्न सक्दैनौ, जब सम्म त्यो गल्तिको टेक्निकल(technical) नाम थाहा हुदैन, तब सम्म त्यो गल्ति सुधार्न सकिदैन |

ल, अब मैले भोगेका समस्या हरु, र तिनीहरुलाई कसरी समाधान गर्ने त भनेर सरल नेपाली भाषामा छलफल गरौं|

अरे यार्, बर्बाद भयो, मैले एउटा भयानक जल्ती गरे, कृपया git को कुनै जादुई टाइम मेसिन छ भनिदेउ भगवान!?!

git reflog
# प्रत्येक ब्रान्च(branch) मा गरिएको प्रत्येक कुराहरु यहाँ देखिन्छ!
# गरिएको प्रत्येक कामको index HEAD@{index} हुन्छ
# जुन काममा कुरा बिग्रिएको थियो, त्यो भन्दा अगाडीको HEAD@{index} खोज, अनि
git reset HEAD@{index}
# जादुई टाइम मेसिन

यो प्रयोग गरेर बिग्रिएको काम, या झुकिएर मेटाइएको काम, या नराम्रो मर्ज(merge) भएको काम फिर्ता पाउन सकिन्छ| मैले reflog धेरै प्रयोग गरे| र, जसले यो टिप् समावेस गर्न भने, उनीहरु लाई धेरै धेरै सलाम छ!

अरे यार्, मैले कमिट(commit) गरिहाले, अनि एकैछिन पछि सानो परिवर्तन गर्नुपर्ने छ भनेर महसुस गरे!

# जे परिवर्तन गर्ने हो, त्यो गर, अनि
git add . # या, ब्यक्तिगत फाईल एक-एक गरि थप, अनि तेस्पछी
git commit --amend --no-edit
# अब त्यो अघिको कमिट(commit) ले ऐले भर्खर गरेको परिवर्तन समावेस गर्छ!
# चेतावनी: सार्वजनिक कमिट(commit) कहिले पनि संशोधन नगर्नु

यो समस्या कमिट(commit) गरे पछी टेस्ट/लिंटर ले परीक्षण(test) गर्दा आउन सक्छ, या " इकुवल(=) साइन पछी स्पेस राख्न बिर्सिए यार् ", या " छ्या! त्या सेमिकोलन(;) राख्न बिर्सिए " जस्ता बेवकुफ गल्ति ले गर्दा पनि आउने गर्दछ| तिमीले नयाँ कमिट(commit) गरेर rebase -i गर्न पनि सक्छौ, तर त्यो अगाडीको तरिका लाखौं गुना छिटो छ|

चेतावनी: पब्लिक(public/shared) ब्रान्च(branch) मा अपलोड(push) गरिएको कमिट(commit) संशोधन नगर! आफ्नो निजी रेपोजिटोरि(repository) मा मात्र कमिट(commit) संशोधन गर, नत्र झन् नराम्रो समस्या मा पर्ने छौ|

अरे यार्, अघिल्लो कमिट(commit) को मेसेज परिवर्तन गर्नु थियो!

git commit --amend
# त्यस पछी आएको अनुक्रम फलो गरेर कमिट(commit) मेसेज परिवर्तन गर|

बकवास अनुक्रम हरु को आवश्यकता|

अरे यार्, नयाँ ब्रान्च(branch) मा कमिट(commit) गर्नु पर्थ्यो, मैले झुकिएर मास्टर(master) ब्रान्च मा गरे!

# अहिले को स्थितिमा नै बसेर नयाँ ब्रान्च(branch) बनाउ,
git branch नयाँ-ब्रान्च-को-नाम
# अघिल्लो कमिट(commit) लाई मास्टर ब्रान्च बाट हटाउ,
git reset HEAD~ --hard
git checkout अघि-बनेको-नयाँ-ब्रान्च-को-नाम
# अब तिम्रो कमिट(commit) यो नयाँ ब्रान्च मा बस्छ :)

चेतावनी: यदी पब्लिक(public/shared) रिपोजिटोरी(repository) मा कमिट गरेको थियौ भने यसले काम गर्दैन, र यदि तिमीले पहिला नै अन्य विकल्पहरु प्रयास गरेको थियौ भने git reset HEAD~ --hard को ठाउँमा git reset HEAD@{पहिला-गरेको-कोमिटहरु} गर्नु पर्छ| अनन्त परिशानी हरु, उफ्| साथै, धेरै जना अन्य डेभलपर(developer) हरु ले यो छोटो तरिका सुझाव दिएका थिए, जुन मलाई पहिला थाह थिएन| धन्यवाद उनीहरु लाई|

अरे यार्, मैले झुकिएर गलत ब्रान्च मा कमिट गरे!

# अघिल्लो कमिट(commit) लाई हटाउने, तर गरिएको परिवर्तन राखिराख्ने,
git reset HEAD~ --soft (कमिट हटाउछ, तर गरिएको परिवर्तन रखिरन्छ)
git stash
# सहि ब्रान्च मा प्रवेश गर,
git checkout सहि-ब्रान्च-को-नाम
git stash pop
git add . # or ब्यक्तिगत फाईल एक-एक गरि थप, अनि तेस्पछी
git commit -m "कमिट मेसेज";
# अब तिम्रो परिबर्तन सहि ब्रान्च मा पुगेको छ

धेरै डेभलपर(developer) हरु ले यो अवस्था मा cherry-pick प्रयोग गर्न सुझाव पनि दिएका छन्, तेसैले तिमीलाई जुन तरिका सहज लाग्छ त्यहि प्रयोग गर|

git checkout सहि-ब्रान्च-को-नाम
# अघिल्लो कमिट लाई मास्टर ब्रान्च मा चेरी-पिक(cherry-pick) गर, 
git cherry-pick master (अघिल्लो कमिट को रेफरेन्स(reference) मास्टर ब्रान्च मा पास हुन्छ)
# अब त्यो कमिट को रेफरेन्स(reference) लाई हटाई देउ,
git checkout master
git reset HEAD~ --hard

अरे यार्, मैले diff प्रयोग गरे तर केहि फाईदा भएन!

यदी फाइल हरु परिबर्तन गरेको मा विस्वोअस्थ छौ, तर diff ले केहि देखाउदैन भने, तिमीले आफ्नो स्टेजिंग एरिया(staging area) मा add गरेको हुन सक्छौ, र तेस्को लागि एउटा विषेश फ्ल्याग(flag) समावेस गर्नु पर्छ.

git diff --staged

फाइल मुनि ¯\_(ツ)_/¯ (हो, मलाई थाहा छ यो एउटा सुभिधा हो, त्रुटी(bug) होइन, तर जब यो समस्या पहिलो पटक अनुभव हुन्छ, तब तेस्ले चकित पार्दछ|)

अरे यार्, मलाई ४-५ ओटा कमिट अगाडी को कमिट लाई सुधार्नु पर्यो!

# सुरुमा जुन कमिट सुधार्ने हो, त्यो फेला पार
git log
# किबोड को एरो(arrow) कि प्रयोग गरेर तल-माथि सार्न सकिन्छ,
# कमिट फेला परे पछी त्यो कमिट को hash कपि(copy) गर,
git revert कमिट-को-hash-पेस्ट-गर
# git ले अब नयाँ कमिट बनाउछ
# त्यस पछी आएको अनुक्रम को आधार मा कमिट(commit) मेसेज परिवर्तन गर
# या सिधै सेभ गरेर कमिट गर

र अब फाइल लाई सच्याउनको लागि पुरानो समावेस बाट कपि-पेस्ट गरिराख्नु पनि पर्दैन! यदि कुनै त्रुटी कमिट गरेको छौ भने, revert प्रयोग गरेर एकैचोटि मा त्यो त्रुटी सच्याउन सक्नेछौ|

एक-एक गरि फाइल हरु कमिट गर्न पनि सक्छौ! तर थाहा भाकै कुरा हो, असली git को तरिका मा, एकदमै भिन्न र बकवास कमाण्ड हरु प्रयोग गर्नु पर्छ... तेसैले यो माथि को तरिका नै हजार गुना सजिलो हुन्छ|

अरे यार्, मलाई एउटा फाइल अंडू(undo) गर्नु पर्यो!

# फाइल परिवर्तन गर्नु भन्दा अगाडी गरिएको कमिट को ह्यास(hash) पत्ता लगाउ,
git log
# किबोड को एरो(arrow) कि प्रयोग गरेर तल-माथि सार्न सकिन्छ,
# अघिल्लो कमिट भेटी पछी त्यसलाई कपी गर, अनि
git checkout कमिट-को-hash-पेस्ट-गर -- अंडू/गर्नु/पर्ने/फाइलको/पाथ
# त्यो फाइल को पुरानो भर्जन(version) तिम्रो इन्डेक्स(index) मा हुन्छ
git commit -m "वाह: कपि/पेस्ट नगरे पनि अंडू भयो"

जब पहिलो पटक मैले यो तरीका थाहा पाए, यसले ठुलो सहयोग गर्यो| ठु-लो| ठु-लो-स-ह-योग| तर साचै, कुन ग्रह मा चै checkout -- राम्रो विकल्प हुन्छ होला? त्यसको रिस :linus-torvalds लाई पोख|

यो बकवास हल्ला, मैले हार माने|

cd ..
sudo rm -r बकवास-git-रेपोजिटोरी-को-पाथ
git clone https://कुनै-git-को-url/बकवास-git-रेपोजिटोरी-को-पाथ.git
cd बकवास-git-रेपोजिटोरी-को-पाथ

यसको लागि एरिक भी(Eric V.) लाई धन्यवाद! यो चुट्किला मा प्रयोग भएको sudo उनलाई नै निर्देस गरिएको हो|

तर साचै, यदि तिम्रो ब्रान्च धेरै-धेरै बिग्रिएको छ र तेस्लाई ऐले भाको git को रिमोट रेपोजीटोरी संग "git द्वारा मान्यता प्राप्त" पारा मा मिलाउनु छ भने, यो तरिका अपनाउ, तर ध्यान राख, यो तरिका एकदमै विनासकारी र अप्रापनीय छ!

# ओरिजिन(remote-repository) को पछिल्लो अवस्था प्राप्त गर,
git fetch origin
git checkout master
git reset --hard origin/master
# ट्रयाक नभाको फाइल हरु डिलिट गर,
git clean -d --force
# प्रत्येक बिग्रिएको ब्रान्च मा checkout/reset/clean कमाण्ड प्रयोग गर

*सूचना: यो साइट पूर्ण रुपमा git को सन्दर्भ लिने मनसाय ले बनाइएको होइन| र हो, यी समस्या हरु समाधान गर्न अन्य "शुद्ध" तरिका हरु पनि छन्, तर माथि उल्लेखित बिधि हरु मैले धेरै परीक्षण र गल्ति हरु बाट सिके, र ति कुरा हरु सबै संग यो वेबसाइट मार्फत सहज र मनोरञ्जनात्मक तरिका मा सेयर गर्न मन लग्यो| तिम्रो इछ्या हो अब, यसलाई मन पराउछौ या पराउदैनौ!

धेरै धेरै धन्यवाद सबै सहयोगी साथि हरु लाई, जसले यो वेबसाइट अनुवाद गर्न मद्हत गरे, सलाम छ! Moritz Stückler (de) · Daniil Golubev (ru) · Łukasz Wójcik (pl) · fedemcmac (it) · Michel (fr) · Andriy Sultanov (ua) · Meiko Hori (ja) · Alex Tzimas (gr) · Martijn ten Heuvel (nl) · Elad Leev (he) · Franco Fantini (es) · Catalina Focsa (ro) · Davi Alexandre (pt_BR) · Nemanja Vasić (sr) · Tao Jiayuan (zh) · Eduard Tomek (cs) · Ricky Gultom (id) · Khaja Md Sher E Alam (bn) · Rahul Dahal (ne) . अन्य थप सहयोगी हरु Iain Murray · Frank Taillandier · David Fyffe · Lucas Larson

यदि तिमीलाई आफ्नो निजी भाषा मा अनुवाद गर्न मन छ भने,मलाई PR पठाऊ GitHub