Git চিট শিট

একটি অনুসন্ধানযোগ্য Git চিট শিট যা সেটআপ, দৈনন্দিন কমিট লুপ, ব্রাঞ্চিং, রিমোট, ইতিহাস এবং রিকভারি কভার করে, প্রতিটি কমান্ডের জন্য ওয়ান-ক্লিক কপি সহ।

মনে রাখার মতো উনপঞ্চাশটি Git কমান্ড। কমান্ডের নাম এবং বর্ণনা জুড়ে ফিল্টার করুন, তারপর প্রয়োজনীয়টি কপি করুন। সেটআপ, দৈনন্দিন ওয়ার্কফ্লো, ব্রাঞ্চিং, রিমোট, ইতিহাস এবং ভুল সংশোধনের ভিত্তিতে ভাগ করা হয়েছে।

আপনার দৈনন্দিন ব্যবহৃত Git কমান্ডগুলো বোঝা

একটি Git চিট শিট আসলে কী কাজে লাগে

Git-এ শতাধিক পোরসেলেইন কমান্ড রয়েছে, কিন্তু বেশিরভাগ ইঞ্জিনিয়ার প্রতিদিন একই বিশ-ত্রিশটি ব্যবহার করেন এবং বাকিগুলো বছরে কয়েকবার হাত দেন। একটি চিট শিট মডেল বোঝার বিকল্প নয়; এটি এমনভাবে তৈরি করা হয়েছে যাতে আপনি ইতিমধ্যে বুঝে থাকা কমান্ডগুলো একটি কীস্ট্রোক দূরত্বে থাকে, এক ব্রাউজার ট্যাব এবং তিনটি Stack Overflow উত্তর দূরত্বে নয়।

এই পৃষ্ঠার রেফারেন্সটি কাজ যেভাবে হয় সেভাবে সাজানো: রিপোজিটরি সেটআপ করা, প্রতিদিন ডজনবার চালানো কমিট লুপ, ব্রাঞ্চিং, রিমোটের সাথে কথা বলা, ইতিহাস পড়া এবং বিপদ থেকে নিজেকে বের করা। ফিল্টার বক্সে টাইপ করুন এবং তালিকাটি কমান্ড টেক্সট এবং এর বর্ণনা উভয় জুড়েই সংকুচিত হয়, তাই "stash", "force" বা "undo" খুঁজলে প্রাসঙ্গিক সারিগুলো তাৎক্ষণিকভাবে সামনে চলে আসে। প্রতিটি সারিতে একটি কপি বাটন রয়েছে, কারণ --force-with-lease যুক্ত কমান্ড পুনরায় টাইপ করাই টাইপোর কারণ হয়ে ওঠে।

কমান্ডগুলোর পেছনের মানসিক মডেল

আপনার মাথায় তিনটি জায়গা ধরে রাখলে প্রায় প্রতিটি Git কমান্ড অর্থবোধ করে। ওয়ার্কিং ট্রি হল ডিস্কের ফাইলগুলো যেমন আপনি এডিটরে দেখেন। ইন্ডেক্স — যাকে স্টেজিং এরিয়া-ও বলা হয় — হল পরবর্তী কমিটের জন্য আপনি যে স্ন্যাপশট তৈরি করছেন। রিপোজিটরি হল ইতিমধ্যে রেকর্ড করা কমিটের অপরিবর্তনীয় চেইন। git add ওয়ার্কিং ট্রি থেকে ইন্ডেক্সে কন্টেন্ট সরায়, git commit ইন্ডেক্সকে একটি নতুন কমিটে পরিণত করে, আর git restore কন্টেন্ট উল্টো দিকে ফিরিয়ে দেয়।

ব্রাঞ্চ হলো দ্বিতীয় ধারণা, এবং এগুলো দেখতে যত জটিল, আসলে তত সরল: একটি ব্রাঞ্চ শুধুই একটি কমিটের দিকে নির্দেশকারী চলমান পয়েন্টার, আর HEAD হল আপনি যে ব্রাঞ্চে আছেন তার পয়েন্টার। ব্রাঞ্চ তৈরি করতে কিছু খরচ হয় না কারণ এটি শুধু একটি চল্লিশ-অক্ষরের হ্যাশ সম্বলিত একটি ফাইল লেখে। তাই git switch -c পাঁচ মিনিটের পরীক্ষার জন্য যথেষ্ট সস্তা।

মার্জিং এবং রিবেসিং দুটোই দুটি ব্রাঞ্চের কাজ একত্র করে; পার্থক্য হলো তারা কী রেকর্ড করে। একটি মার্জ দুটি ইতিহাসই রাখে এবং সেগুলোকে যুক্তকারী একটি কমিট যোগ করে, যা সৎ কিন্তু একটি ব্রেইডেড গ্রাফ তৈরি করে। একটি রিবেস আপনার কমিটগুলোকে পুনর্লিখন করে যাতে সেগুলো অন্য ব্রাঞ্চের উপরে লেখা হয়েছে বলে মনে হয়, যা একটি পরিষ্কার সোজা লাইন তৈরি করে কিন্তু কমিটের হ্যাশ পরিবর্তন করে — এবং এ কারণেই অন্যরা ইতিমধ্যে পুল করে নিয়েছে এমন কমিটে আপনি কখনো রিবেস করেন না।

কিছু ভুল হলে পুনরুদ্ধার

Git সম্পর্কে সবচেয়ে দরকারি বিষয় হলো এটি খুব কমই কমিট করা কাজ হারায়। যতক্ষণ একটি পরিবর্তন কোনো এক সময়ে কমিট হয়েছিল, git reflog আপনাকে হ্যাশ দেখাবে, আর git switch -c rescue <hash> এটি ফিরিয়ে আনবে। এই নিরাপত্তা জাল ভুল রিবেস, কমিটের পর দুর্ঘটনাবশত reset --hard এবং একটু বেশি উৎসাহে মুছে ফেলা ব্রাঞ্চ কভার করে।

বিপজ্জনক অপারেশনগুলো হলো যেগুলো কমিটহীন কাজে হাত দেয়: git reset --hard, পরিবর্তিত ফাইলে git checkout -- এবং git clean -fd। এসব পরিবর্তন কখনো রেকর্ড হয়নি, তাই রিফ্লগে নির্দেশ করার মতো কিছু নেই। যে অভ্যাস গড়ে তোলা উচিত তা হলো স্ক্র্যাচ ব্রাঞ্চে তাড়াতাড়ি এবং প্রায়ই কমিট করা, বা কোনো পরীক্ষার আগে git stash push করা। পরে স্কোয়াশ করে ফেলা একটি কমিটের কোনো খরচ নেই; বিকালের কমিটহীন কাজ ফিরে আসে না।

শেয়ার্ড ব্রাঞ্চে ইতিহাস পুনর্লিখনের চেয়ে git revert পছন্দ করুন। এটি একটি নতুন কমিট রেকর্ড করে যা পুরোনোটিকে বাতিল করে, তাই অন্য সবার ক্লোন বৈধ থাকে। --force-with-lease নিজের ফিচার ব্রাঞ্চের জন্য সংরক্ষণ রাখুন, এবং মনে রাখবেন এটি সাধারণ --force-এর চেয়ে অর্থবহভাবে নিরাপদ: আপনি শেষবার ফেচ করার পর রিমোট সরে গেলে এটি চলতে অস্বীকার করে, আর এটিই ঠিক সেই পরিস্থিতি যেখানে একটি সাধারণ ফোর্স পুশ নীরবে একজন সহকর্মীর কমিট ধ্বংস করত।

অভ্যন্তরীণভাবে তৈরি। চিট শিটটি কয়েক লাইন ভ্যানিলা JavaScript দিয়ে রেন্ডার ও ফিল্টার করা সাধারণ ডেটা; আপনি যা টাইপ করেন তা কোথাও পাঠানো হয় না।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

এই কমান্ডগুলো কি Windows, macOS এবং Linux-এ কাজ করে?
হ্যাঁ। প্রতিটি এন্ট্রি সাধারণ Git এবং তিনটি প্ল্যাটফর্মেই একইভাবে আচরণ করে, আপনি PowerShell, Command Prompt, Terminal বা যেকোনো Linux শেলে চালান না কেন। একমাত্র পার্থক্য যা আপনি লক্ষ্য করতে পারেন তা হলো লাইন-এন্ডিং হ্যান্ডলিং, যা core.autocrlf দ্বারা নিয়ন্ত্রিত, এবং স্পেস সম্বলিত আর্গুমেন্টের কোটিং নিয়ম।
git switch এবং git checkout-এর মধ্যে পার্থক্য কী?
git checkout ঐতিহাসিকভাবে দুটি সম্পর্কহীন কাজ করত: ব্রাঞ্চের মধ্যে যাওয়া এবং ফাইল পুনরুদ্ধার করা। Git 2.23 সেগুলোকে ভাগ করে ব্রাঞ্চের জন্য git switch এবং ফাইলের জন্য git restore করেছে। checkout এখনও কাজ করে এবং অবমূল্যায়িত নয়, কিন্তু switch এবং restore পরিষ্কার এবং দুর্ঘটনাবশত ভুল ব্যবহার করা অনেক কঠিন।
কখন মার্জের বদলে রিবেস করা উচিত?
ইতিহাস লিনিয়ার এবং রিভিউ পঠনযোগ্য রাখতে আপনার নিজের অপ্রকাশিত ফিচার ব্রাঞ্চটি সর্বশেষ main-এর উপর রিবেস করুন। ব্রাঞ্চটি শেয়ার্ড হলে, কমিটগুলো ইতিমধ্যে পুশ করা হলে, অথবা আপনি চাইলে যে ঐতিহাসিক রেকর্ড দেখায় দুটি কাজের ধারা সমান্তরালে চলেছিল, তখন মার্জ করুন।
আমি কীভাবে ভুলবশত মুছে ফেলা একটি কমিট পুনরুদ্ধার করব?
HEAD প্রতিটি অবস্থান দেখতে git reflog চালান, আপনি যে কমিটটি চান তার হ্যাশ খুঁজুন, তারপর git switch -c rescue <hash> চালান। এটি খারাপ রিবেস, হার্ড রিসেট বা মুছে ফেলা ব্রাঞ্চে হারানো কমিটের জন্য কাজ করে, যতক্ষণ গারবেজ কালেকশন না চলে, যা সাধারণত আপনাকে কমপক্ষে ৩০ দিন সময় দেয়।
git push --force-with-lease কি সত্যিই --force-এর চেয়ে নিরাপদ?
হ্যাঁ, অর্থবহভাবেই। সাধারণ --force শর্তহীনভাবে রিমোট ব্রাঞ্চকে ওভাররাইট করে। --force-with-lease প্রথমে যাচাই করে রিমোট এখনও আপনি শেষবার ফেচ করা কমিটে আছে কি না, এবং এদিকে অন্য কেউ পুশ করলে এটি বাতিল হয় — এটিই ঠিক সেই পরিস্থিতি যেখানে একটি ফোর্স পুশ একজন সহকর্মীর কাজ ধ্বংস করত।
আমি ফিল্টার বক্সে যা টাইপ করি তা কি আমার ব্রাউজার ছেড়ে যায়?
না। চিট শিটটি পৃষ্ঠায় এমবেড করা একটি ছোট ডেটা ব্লক এবং ফিল্টারটি একটি সাধারণ JavaScript স্ট্রিং ম্যাচ। পৃষ্ঠা লোড হওয়ার পর কোনো রিকোয়েস্ট, কোনো অ্যানালিটিক্স কল বা কোনো সার্ভার জড়িত থাকে না।