अरे यार्, 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) ले ऐले भर्खर गरेको परिवर्तन समावेस गर्छ!
# चेतावनी: सार्वजनिक कमिट(public 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 को आधिकारिक साइट कै सट्टामा सन्दर्भ लिने मनसाय ले बनाइएको होइन| र हो, यी समस्या हरु समाधान गर्न अन्य "राम्रा" तरिका हरु पनि छन्, तर माथि उल्लेखित बिधि हरु मैले धेरै परीक्षण र गल्ति हरु बाट सिकेका हुन्, र ति कुरा हरु यो वेबसाइट मार्फत सबै संग सहज र मनोरञ्जनात्मक तरिका मा सेयर गर्न मन लाग्यो| तिम्रो इछ्या हो अब, यसलाई मन पराउछौ या पराउदैनौ!

यो वेबसाइट अनुवाद गर्न मद्हत गर्ने सबै सहयोगी साथि हरु लाई धेरै धेरै धन्यवाद, सलाम छ! Björn Söderqvist (sv) · 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) · Taha Paksu (tr) · Kitt Tientanopajai (th) · Gyeongjae Choi (ko) . अन्य थप सहयोगी हरु Iain Murray · Frank Taillandier · David Fyffe · Lucas Larson · Artem Vorotnikov

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