ওহ, 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 কমিট কখনও সংশোধন করবেন না

এটি সাধারণত আমার সাথে ঘটে আমি যদি commit করি, তারপর 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
# আপনার কমিট এখন এই নতুন ব্রাঞ্চ এ আছে :)

দ্রষ্টব্য: আপনি যদি ইতিমধ্যে কোনও 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 -- কে, কোন ফাইলকে পূর্বাবস্থায় ফিরিয়ে আনার সেরা উপায় হিসাবে দেখবে?

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

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