Skip to content

Advanced Git

Git-এর গভীরে গিয়ে কাজ করা এবং জটিল সমস্যা সমাধান করার জন্য এই অ্যাডভান্সড টপিকগুলো জানা জরুরি।

Git Internals: Under the Hood

Git মূলত একটি Content-Addressable Filesystem. এর ডেটাবেস (.git/objects) ৪ ধরণের অবজেক্ট নিয়ে গঠিত:

  1. Blob (Binary Large Object):
    • ফাইলের কন্টেন্ট স্টোর করে (ফাইলের নাম নয়)।
  2. Tree:
    • ডিরেক্টরি স্ট্রাকচার রিপ্রেজেন্ট করে। এতে ফাইলের নাম এবং Blob/Tree-এর রেফারেন্স থাকে।
  3. Commit:
    • একটি স্ন্যাপশট। এতে একটি রুট Tree অবজেক্ট, প্যারেন্ট কমিট, অথর এবং মেসেজ থাকে।
  4. Tag:
    • নির্দিষ্ট কমিটের উপর একটি লেবেল (যেমন v1.0)।

Cherry Picking

যদি আপনি অন্য কোনো ব্রাঞ্চ থেকে নির্দিষ্ট একটি বা দুটি কমিট আপনার বর্তমান ব্রাঞ্চে আনতে চান (পুরো ব্রাঞ্চ মার্জ না করে), তবে cherry-pick ব্যবহার করুন।

bash
git cherry-pick [commit-hash]

এটি ওই কমিটের চেঞ্জগুলো নিয়ে আপনার ব্রাঞ্চে একটি নতুন কমিট তৈরি করবে।


Git Hooks

Git Hooks হলো স্ক্রিপ্ট যা নির্দিষ্ট ইভেন্টের আগে বা পরে রান করে। এগুলো .git/hooks ডিরেক্টরিতে থাকে।

Common Hooks

  • pre-commit: কমিট করার ঠিক আগে রান করে। কোড ফরম্যাটিং বা লিন্টিং চেকের জন্য ব্যবহৃত হয়।
  • pre-push: পুশ করার আগে রান করে (যেমন টেস্ট রান করা)।

Git Reflog

কখনো ভুলে git reset --hard দিয়ে কমিট ডিলিট করে ফেলেছেন? git reflog আপনাকে বাঁচাতে পারে। এটি আপনার করা প্রতিটি অ্যাকশন (commit, checkout, reset, merge) এর লগ রাখে, এমনকি ডিলিট করা কমিটও।

  1. হিস্ট্রি দেখুন:
    bash
    git reflog
  2. হারিয়ে যাওয়া কমিটে ফিরে যান:
    bash
    git reset --hard HEAD@{2}

Git Submodules

যদি আপনার প্রজেক্টের মধ্যে অন্য একটি গিট রিপোজিটরি ব্যবহার করতে হয় (যেমন কোনো লাইব্রেরি), তবে Submodule ব্যবহার করা হয়।

Add Submodule

bash
git submodule add https://github.com/username/lib-name.git

Clone with Submodules

bash
git clone --recursive [repo-url]

Git Bisect (Debugging)

আপনার কোডে কোনো বাগ আছে, কিন্তু জানেন না কোন কমিটে এটি তৈরি হয়েছে। git bisect ব্যবহার করে বাইনারি সার্চের মাধ্যমে দোষী কমিটটি খুঁজে বের করা যায়।

bash
git bisect start
git bisect bad            # বর্তমান ভার্সনে বাগ আছে
git bisect good [hash]    # অতীতে এই ভার্সনে বাগ ছিল না

Git তখন মাঝের একটি কমিটে চেকআউট করবে। আপনি টেস্ট করে বলবেন git bisect good নাকি git bisect bad। এভাবে দ্রুত বাগ খুঁজে পাওয়া যায়।


Rewriting History

Interactive Rebase (rebase -i)

গত ৩টি কমিট এডিট করতে:

bash
git rebase -i HEAD~3

অপশনসমূহ:

  • pick: কমিটটি রাখুন।
  • reword: কমিট মেসেজ পরিবর্তন করুন।
  • squash: আগের কমিটের সাথে মার্জ করুন।
  • drop: কমিটটি ডিলিট করুন।

Released under the MIT License.