ওহ ধুর, Git!?!

Git কিছুটা হলেও কঠিন: ঝামেলা পাকানো সহজ, এবং কিভাবে সেই ঝামেলাগুলো ফিক্স করা যাবে সেটা বের করা অনেক সময় কঠিন. গিট ডকুমেন্টেশনে মুরগি আগে না ডিম এই সমস্যা আছে, যেখানে কিভাবে তোমার ঝামেলা ঠিক করবে খুঁজে পাবে না, যদি না তুমি আলরেডি যেনেই থাক কিভাবে ফিক্স করতে হবে সেই প্রবলেম, যেটা তুমি ফিক্স করতে চাও।

কিছু খারাপ পরিস্থিতিতে আমি পরেছিলাম যা থেকে আমি নিজেকে সরিয়ে নিয়েছি, এবং কীভাবে আমি শেষ পর্যন্ত এগুলি থেকে নিজে মুক্তি পেয়েছি সেগুলোই দেয়া হল শুদ্ধ বাংলায়

ওহ ধুর, আমি মারাত্মক ভুল করে ফেলেছি, কেও আমাকে বল git এর ম্যাজিক টাইম মেশিন আছে!?!

git reflog
# তুমি একটা লিস্ট পাবে 
# যেখানে git এর সকল ব্রাঞ্চ এর সব commit দেখতে পারবে   
# প্রত্যেক আইটেম এর একটা ইনডেক্স HEAD@{index} থাকবে
# ওই ইনডেক্স টা খুঁজে বের কর, যেটার পরের কমিট থেকে ঝামেলা শুরু হয়েছে
git reset HEAD@{index}
# ম্যাজিক টাইম মেশিন

তুমি এটা ব্যাবহার করে ভুলবশত ডিলিট হয়ে যাওয়া যেকোনো কিছু ফিরে পাবে, কিংবা সরিয়ে ফেলতে পারবে এমন কিছু যেটা রেপো এর কিচু ভেঙ্গে ফেলতে পারে, অথবা কোন খারাপ merge রিকোভার করতে পার, এমনকি সেই সময় ফিরে যেতে পার যেখানে তুমি আসলেই কাজ করেছ। আমি reflog অনেক ব্যাবহার করি। যারা এটা এড করার উপদেশ দিসে তাদের অনেক অনেক অনেক অনেক সাধুবাদ।

ওহ ধুর, আমি কমিট করলাম এবং অবিলম্বে বুঝতে পারি যে আমার একটি ছোট পরিবর্তন করা দরকার!

# তোমার পরিবর্তন কর
git add . # or add individual files
git commit --amend --no-edit
# এখন তোমার শেষ কমিট এই সেই পরিবর্তন রয়েছে!
# সতর্কতা: public কমিট কখনও সংশোধন করবে না

এটি সাধারণত আমার সাথে ঘটে আমি যদি কমিট করি, তারপর run করি tests/linters... এবং FML, সমান চিহ্নের পরে আমি একটি স্পেস দেইনি। তুমি একটি নতুন কমিট হিসাবেও যোগ করতে পার এবং তারপর rebase -i রান করে ওই কমিটগুলো squash করতে পার, কিন্তু এটি প্রায় এক মিলিয়ন গুণ দ্রুত.

সতর্কতা: কখনই সেই কমিটগুলোকে amend করবে না যেগুলো public/shared ব্রাঞ্চ এ পুশ করা হয়েছে। শুধুমাত্র লোকাল ব্রাঞ্চ এর commit গুলোকেই amend করবে, যেটা শুধু তোমার লোকাল কপি আছে নাহলে তোমার খারাপ সময় সামনেই।

ওহ ধুর, আমার শেষ কমিট বার্তাটি পরিবর্তন করা দরকার!

git commit --amend
# কমিট বার্তা পরিবর্তন করতে পরবর্তী ধাপ অনুসরণ কর

শালার পুতের কমিট বার্তার শর্তাবলী।

ওহ ধুর, আমি দুর্ঘটনাক্রমে মাস্টার ব্রাঞ্চে এমন কিছু কমিট করেছি যা একেবারে নতুন ব্রাঞ্চে থাকা উচিত ছিল!

# বর্তমানের মাস্টার ব্রাঞ্চ থেকে একটি নতুন ব্রাঞ্চ তৈরি কর
git branch some-new-branch-name
# মাস্টার ব্রাঞ্চ থেকে শেষ কমিট অপসারণ কর
git reset HEAD~ --hard
git checkout some-new-branch-name
# তোমার commit এখন এই নতুন ব্রাঞ্চ এ আছে :)

দ্রষ্টব্য: তুমি যদি ইতিমধ্যে কোনও public/shared ব্রাঞ্চে কমিট করে থাক তবে এটি কাজ করবে না, এবং যদি তুমি প্রথমে অন্য কিছু চেষ্টা করে থাক তবে তোমার git reset HEAD@{number-of-commits-back} দরকার হবে HEAD~ এর পরিবর্তে। অসীম বিষণ্ণতা.এছাড়াও, অনেক লোক একটা সংক্ষিপ্ত উপায় তৈরি করার জন্য একটি দুর্দান্ত পরামর্শ দিয়েছিল যা আমি নিজেও জানতাম না। সবাইকে ধন্যবাদ!

ওহ ধুর, আমি ভুলবশত অন্য ব্রাঞ্চে কমিট করে ফেলেছি!

# শেষ কমিট পূর্বাবস্থায় ফেরাও, তবে পরিবর্তনগুলি উপলভ্য রাখ
git reset HEAD~ --soft
git stash
# সঠিক ব্রাঞ্চে চেকআউট কর
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# এখন তোমার পরিবর্তনগুলো সঠিক ব্রাঞ্চে পাবে

এই পরিস্থিতির জন্য অনেক লোক চেরি-পিক ব্যবহার করার পরামর্শ দিয়েছেন, সুতরাং যেটি তোমার জন্য সবচেয়ে বেশি কার্যকর সেটাই চয়ন কর!

git checkout name-of-the-correct-branch
# মাস্টার থেকে শেষ কমিট কালেক্ট কর
git cherry-pick master
# মাস্টার থেকে শেষ কমিট ডিলিট কর
git checkout master
git reset HEAD~ --hard

ওহ ধুর, আমি একটি diff চালানোর চেষ্টা করেছি কিন্তু কিছুই হয়নি?!

তুমি যদি জান যে তোমার ফাইলগুলিতে পরিবর্তন করেছ কিন্তু diff এ খালি রয়েছে, তাহলে তুমি সম্ভবত তোমার ফাইলগুলি অ্যাড করেছ ঠিকই, এখন তোমাকে শুধু একটি বিশেষ ফ্ল্যাগ ব্যবহার করতে হবে।

git diff --staged

File under ¯\_(ツ)_/¯ (হ্যাঁ, আমি জানি এটি একটি বৈশিষ্ট্য, কোনও বাগ নয়, তবে এটি চমকপ্রদ এবং অবিস্মরণীয় যে এটি তোমার সাথে প্রথমবার ঘটল!)

ওহ ধুর, আমার 5 টি কমিটের আগে যে কমিট হয়েছে সেটা বাদ দিতে হবে!

# তোমার যে কমিটটা দরকার তা খুঁজে বের কর
git log
# লগ হিস্টরির উপরে এবং নীচে স্ক্রোল করতে অ্যারো কী-গুলি ব্যবহার কর
# তোমার কমিটটা একবার পেয়ে গেলে হ্যাশটি সংরক্ষণ কর
git revert [saved hash]
# গিট একটি নতুন কমিট তৈরি করবে যেন কমিটগুলি পূর্বাবস্থায় ফিরে আসে
# কমিট বার্তা পরিবর্তন করতে পরবর্তী ধাপ অনুসরণ কর 
# অথবা শুধু সেভ এবং কমিট

দেখা যাচ্ছে যে পরিবর্তনগুলি পূর্বাবস্থায় ফেলার জন্য তোমাকে বিদ্যমান ফাইলটিতে পুরানো ফাইল এর কন্টেন্ট কপি এবং পেস্ট করতে হবে না! তুমি যদি কোনও বাগও কমিট করে থাক তবে revert দিয়ে একসাথে সমস্ত কমিটগুল পূর্বাবস্থায় ফিরিয়ে আনতে পার

তুমি একটি পূর্ণ কমিট এর পরিবর্তে একটি ফাইল রিভার্ট পার! কিন্তু অবশ্যই git এর স্টাইলে। সেগুলো সম্পূর্ণই আলাদা গিট কম্যান্ড...

ওহ ধুর, আমার কোনও ফাইলের পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনা দরকার!

# ফাইলটি পরিবর্তিত হওয়ার আগের একটি কমিটের হ্যাশ সন্ধান কর
git log
# লগ হিস্টরির উপরে এবং নীচে স্ক্রোল করতে অ্যারো কী-গুলি ব্যবহার কর
# তোমার কমিটটা একবার পেয়ে গেলে হ্যাশটি সংরক্ষণ কর
git checkout [saved hash] -- path/to/file
# ফাইলটির পুরাতন ভার্সনটা তোমার ইনডেক্স এ থাকবে
git commit -m "Wow, you don't have to copy-paste to undo"

অবশেষে যখন আমি এটি বুঝতে পারলাম এটি ছিল বিশাল। বিশাল. বিশাল. তবে চিন্তা কর, কোন গ্রহে checkout -- কে, কোন ফাইলকে পূর্বাবস্থায় ফিরিয়ে আনার সেরা উপায় হিসাবে দেখবে? :shakes-fist-at-linus-torvalds:

ওহ ধুর, এইটা ভুলে যাও, আমি ছেড়ে দিলাম।

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

ধন্যবাদ Eric V. এটার জন্য. sudo ব্যবহার সম্পর্কে সমস্ত অভিযোগই তাঁর কাছে ফরওয়ার্ড করা যেতে পারে।

বাস্তব যদিও, যদি তোমার ব্রাঞ্চ এমনি নষ্ট হয় যে তোমার রেপো কে রিসেট দিতে হয় যেন সেটা রিমোট রেপো এর মত হয়ে যায়, "git-approved" পদ্ধতিতে এটা ট্রাই কর, তবে সাবধান, এগুলি ধ্বংসাত্মক এবং অপরিবর্তনযোগ্য!

# অরিজিন এর সর্বশেষ অবস্থা নামিয়ে নাও
git fetch origin
git checkout master
git reset --hard origin/master
# আনট্রাক্ট ফাইল এবং ডিরেক্টরি মুছ
git clean -d --force
# পুনরাবৃত্তি কর checkout/reset/clean সকল ব্রোকেন ব্রাঞ্চ এর জন্য

*Disclaimer: এই সাইটটি একটি সম্পূর্ণ রেফারেন্স হওয়ার উদ্দেশ্যে নয়। এবং হ্যাঁ, আরও তাত্ত্বিক বিশুদ্ধতা বা যাই হোক না কেন এই একই জিনিসগুলি করার অন্যান্য উপায় রয়েছে। তবে আমি প্রচুর ট্রাইয়াল-এন্ড-এরর এবং গালাগালি এবং টেবিল উল্টানর এর মাধ্যমে এখানে পৌঁছেছি, এবং সবার সাথে ভাগ করে নিতে আমার এই উন্মাদ ধারণাটি ছিল একটা স্বাস্থ্যকর ডোজ। এটি নাও বা ছেড়ে দাও সেটি একান্তই ব্যক্তিগত!

যারা সাইটটিকে নতুন ভাষায় অনুবাদ করতে স্বেচ্ছাসেবি হয়েছ তাদের প্রত্যেককে অনেক ধন্যবাদ, তোমরা অসাধারণ! 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

তুমি যদি নিজের ভাষায় কোনও অনুবাদ যুক্ত করতে সহায়তা করতে চাও, submit a PR on GitHub