মূলঃ Here are all the Git commands I used last week, and what they do., লেখকঃ Sam Corcos

অন্যান্য নতুন ইউজারদের মত, আমিও গিট শেখা শুরু করেছিলাম স্ট্যাকওভারফ্লোতে গিট কমান্ডগুলি খুঁজে, সেখানের উত্তরগুলিকে কপি-পেস্ট করার মাধ্যমে, সেগুলি আসলে কি করে তা না বুঝেই।

0qFQGxysX9XwKkft-6Sq0C4JyqfpRLzwvBkZ
ছবির ক্রেডিটঃ XKCD

আমার এখনও মনে আছে যে আমি ভাবতাম, "সবথেকে বহুলব্যবহৃত গিট কমান্ডগুলি এবং সেগুলি কেন গুরুত্বপূর্ণ তার একটি তালিকা থাকলে কতই না ভাল হত!"

আজ বছরখানিক পরে আমি নিজেই এমন একটি তালিকা তৈরী করতে বসেছি, যেখানে কমান্ডের পাশাপাশি বেশ কিছু বেস্ট প্র্যাক্টিস থাকবে যা ইন্টারমইডিয়েট থেকে অ্যাডভান্সড ডেভেলপারদেরও কাজে আসবে।

তালিকাটিকে বাস্তবসম্মত রাখার জন্য, আমি গত সপ্তাহে যেসব গিট কমান্ড ব্যবহার করেছি, সেগুলিকে ভিত্তি হিসেবে ধরছি।

প্রায় সব ডেভলাপারই গিট এবং গিটহাব ব্যবহার করেন। কিন্তু সাধারণ ডেভলাপারেরা সম্ভবত নিচের তিনটি কমান্ডই ৯৯% সময় ব্যবহার করে থাকেনঃ

git add --all
git commit -am "<message>"
git push origin master

একা একা  বা কোন হ্যাকাথনে বা ছোটখাটো কোন প্রোজেক্টে কাজ করার জন্য এই তিনটি কমান্ডই যথেষ্ট। তবে যখন স্ট্যাবিলিটি এবং মেইন্টেন্যান্স এর গুরুত্ব বাড়তে থাকে তখন কমিট ক্লীনআপ করা, একটি ব্রাঞ্চিং স্ট্র্যাটেজি ঠিক করা, এবং সঙ্গতিপূর্ণ কমিট মেসেজ লেখা আরও গুরুত্বপূর্ণ হয়ে পড়ে।

বিগিনারদের বুঝার সুবিধার্থে আমি প্রথমে বহুল ব্যবহৃত গিট কমান্ডগুলির তালিকা দিয়ে শুরু করবো এবং তারপর আরও অ্যাডভান্সড ফাংশনালিটি ও বেস্ট প্র্যাক্টিসের দিকে আগাবো।

প্রতিনিয়ত ব্যবহার করা কমান্ডগুলি

কোনো একটি রিপোজিটরিতে (রিপো) গিট ইনিশিয়ালাইজ করার জন্য নিম্নোক্ত কমান্ডটি চালাতে হবে। যদি আপনি গিট ইনিশিয়ালাইজ না করেন তাহলে আপনি ঐ রিপোতে গিট এর কোনো কমান্ডই ব্যবহার করতে পারবেন না।

 git init

যদি আপনি গিটহাব ব্যবহার করেন এবং আপনার কোডগুলিকে একটি অনলাইন রিপোতে রাখেন, তাহলে আপনি একটি remote রিপো ব্যবহার করছেন। রিমোট রিপোগুলোর ডিফল্ট নাম (একে alias ও বলা হয়) হিসেবে origin ব্যবহার করা হয়। যদি আপনি গিটহাব থেকে কোনো প্রোজেক্ট কপি করেন তাহলে সেটিতে ইতিমধ্যেই একটি origin আছে। git remote -v কমান্ডটি ব্যবহার করে আপনি origin এর URL টি দেখতে পারেন।

যদি আপনি আপনার নিজের গিট রিপো ইনিশিয়ালাইজ করে সেটিকে গিটহাব রিপোর সাথে সংযুক্ত করতে চান, তাহলে আপনাকে গিটহাবে একটি রিপো তৈরী করে, তার URL টি কপি করে git remote and origin <URL> কমান্ডটি চালাতে হবে। এখানে URL এর স্থানে গিটহাব থেকে প্রাপ্ত "<URL>" ব্যবহার করতে হবে। এরপর থেকে, আপনার রিমোট রিপোতে কোড add, commit, এবং push করতে পারবেন।

নিম্নোক্ত কোডব্লকের শেষ কমান্ডটি রিমোট রিপজিটরি পরিবর্তন করার কাজে ব্যবহৃত হয়। ধরুন আপনি অন্যজনের একটি রিপো কপি করেছেন এবং আপনি সেই রিপো এর মালিকের রিমোট রিপোজিটরি টি পরিবর্তন করে আপনার নিজের গিটহাব একাউন্টে নিতে চান। এর জন্য আপনি git remote add origin এর মতই একই প্রসেস অনুসরণ করবেন, শুধুমাত্র add এর বদলে set-url ব্যবহার করতে হবে।

git remote -v
git remote add origin <url>
git remote set-url origin <url>

কোনো রিপো কপি করার জন্য সবচেয়ে বেশি ব্যবহৃত পদ্ধতি হল git clone <URL> কমান্ডটি। এখানে "<URL>" এর যায়গায় রিমোট রিপজিটরির URL টি ব্যবহার করতে হবে।

মনে রাখবেন রিমোট রিপোজিটরি টি যেই একাউন্ট থেকে ক্লোন করেছেন সেই একাউন্টের সাথেই সংযুক্ত থাকবে। তাই আপনি যদি অন্য কারো রিপো ক্লোন করে থাকেন তাহলে তার origin পরিবর্তন না করা পর্যন্ত সেই রিপোতে আপনি কোন কিছু পুশ করতে পারবেন না।

git clone <url>

গিট নিয়ে কাজ করতে গেলে আপনাকে ব্রাঞ্চ ব্যবহার করতে হবে। যদি আপনি ব্রাঞ্চ সম্পর্কে না জেনে থাকেন তাহলে সামনে এগোনোর আগে আপনার উচিৎ গিট ব্রাঞ্চ নিয়ে একটি বিস্তারিত আর্টিকেল (যেমন এটি) পড়ে নেওয়া।

git branch কমান্ডটি আপনার লোকাল মেশিনের সব ব্রাঞ্চ এর একটি তালিকা প্রদান করে। যদি আপনি একটি নতুন ব্রাঞ্চ তৈরী করতে চান, তবে আপনি git branch <name> ব্যবহার করতে পারেন, যেখানে <name> হল নতুন ব্রাঞ্চটির নাম, যেমন "master" ব্রাঞ্চ।

ইতমধ্যে তৈরি করা হয়েছে এমন কোন ব্রাঞ্চ এ যাওয়ার জন্য git checkout <name> কমান্ডটি ব্যবহার করতে পারেন। git checkout -b <name> কমান্ডটি ব্যবহার আপনি একটি নতুন ব্রাঞ্চ তৈরি কর সাথে সাথে সেটায় চেকআউট করতে পারেন। বেশিরভাগ ইউজারই আলাদা আলাদা ভাবে ব্রাঞ্চ তৈরি এবং চেকআউট করার পরিবর্তে এই কমান্ডটি ব্যবহার করে।

git branch
git branch <name>
git checkout <name>
git checkout -b <name>

ধরা যাক আপনি "develop" নামে একটি ব্রাঞ্চে বেশ কিছু কাজ করেছেন এবং আপনি সেগুলিকে master ব্রাঞ্চে মার্জ করতে চান তাহলে আপনি git merge <branch> কমান্ডটি ব্যবহার করতে পারেন। এক্ষেত্রে আপনাকে প্রথমে master ব্রাঞ্চে চেকআউট করে নিতে হবে, তারপরে git merge develop কমান্ড ব্যবহার করে ডেভলাপ ব্রাঞ্চটিকে মাস্টার ব্রাঞ্চ এর সাথে মার্জ করে ফেলতে হবে।

git merge <branch>

যদি আপনি একাধিক মানুষজনের সাথে কাজ করেন, তাহলে এমন পরিস্থিতির সম্মুখীন হতে পারেন, যেখানে দেখবেন রিপোটিকে গিটহাবে আপডেট করা হয়েছে, কিন্তু সেই আপডেটগুলি আপনার লোকাল মেশিনে নেই। যদি এমনটা কখনও হয়, তাহলে আপনি git pull origin <branch> কমান্ড ব্যবহার করে রিমোট রিপোতে সম্প্রতি যেসব পরিবর্তন করা হয়েছে সেগুলিকে লোকাল রিপোতে নয়ে আসতে পারবেন।

git pull origin <branch>

কোন ফাইল পরিবর্তন বা ট্র্যাক করা হয়েছে তা দেখার জন্য আপনি git status কমান্ডটি ব্যবহার করতে পারেন। প্রত্যেক ফাইলে পরিবর্তিত লাইনের সংখ্যা দেখার জন্য আপনি git diff কমান্ডটি ব্যবহার করতে পারেন।

git status
git diff --stat

এডভান্সড কমান্ড এবং বেস্ট প্র্যাক্টিস

দ্রুতই আপনি এমন একটি পর্যায়ে পৌঁছে যাবেন যেখানে আপনি নিজেই চাইবেন যেন আপনার কমিটগুলো দেখতে সুন্দর এবং সামঞ্জস্যপূর্ণ হয়। আপনার কমিটগুলিকে আরও সহজপাঠ্য করতে বা ভুলবশত পুশ করা কমিট রিভার্ট করতে আপনার গিট হিস্টরি নিয়ে ঘাঁটাঘাঁটি করতে হতে পারে।

git log কমান্ডটি আপনাকে কমিট হিস্টোরিগুলো দেখার সুযোগ করে দেয়। আপনি যদি আপনার সকল কমিটের হিস্টোরি দেখতে চান তাহলে এই কমান্ডটি ব্যবহার করবেন।

আপনার কমিটগুলির মেসেজ এবং একটি হ্যাশ থাকবে। হ্যাশ হল অনেকগুলি এলোমেলো সংখ্যা এবং অক্ষর দ্বারা গঠিত একটি রাশি। হ্যাশের একটি উদাহরণ এমন হতে পারেঃ c3d882aa1aa4e3d5f18b3890132670fbeac912f7

git log

মনে করুন আপনি এমন কিছু পুশ করলেন যা আপনার অ্যাপকে অকেজো করে ফেলল। এখন এই অ্যাপটিকে ঠিকঠাক করে নতুন আরেকটি পুশ করার থেকে আপনি আপনার কমিটটিকে undo করে ফেলতে পারেন।

আপনি যদি পুরনো কোন কমিট থেকে আপনার অ্যাপটিকে চেকআউট করতে চান তাহলে সেই কমিটের হ্যাশটিকে সরাসরি ব্রাঞ্চের নাম এর বদলে ব্যবহার করলেই হবে। এটি করলে আপনার অ্যাপটি কারেন্ট ভার্শন থেকে ডিটাচ (কারণ আপনি কারেন্ট ভার্শনে কাজ না করে একটি পুরনো রেকর্ড পরিবর্তন করছেন)।

git checkout c3d88eaa1aa4e4d5f

অতঃপর, আপনি যদি সেই পুরনো ব্রাঞ্চে কিছু পরিবর্তন করে সেটিকে আবার পুশ করতে চান তাহলে আপনাকে একটি force push করতে হবে।

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

git push -f origin master

কোন কোন সময় সবকিছুকে একটি কমিটের অন্তর্ভূক্ত করা যুক্তিসঙ্গত হয় না। হতে পারে এপনি নতুন কিছু টেস্ট করার আগে আপনার কাজের অগ্রগতি সেভ করে রাখতে চান বা সম্ভবত আপনি কোনো কিছু ভুল করে ফেলেছেন এবং সেই ভুল এর বিব্রতকর অবস্থা থেকে নিজেকে বাঁচাতে আপনার ভার্সন হিস্টোরিতে সেই ভুলটি রাখতে চান না। এসব কাজের জন্য, আমাদের কাছে git rebase কমান্ডটি রয়েছে।

মনে করুন আপনার লোকাল মেশিনের হিস্টোরিতে (যা এখনও গিটহাবে পুশ দেয়া হয় নি) ৪ টি কমিট রয়েছে যেটায় আপনি অনেক কিছু পরিবর্তন করেছেন। যার ফলে আপনার কমিটগুলি দেখতে বেশ কফিউজিং লাগছে।এক্ষেত্রে আপনি rebase ব্যবহার করে সবগুলি কমিটকে একটি সংক্ষিপ্ত কমিটের মধ্যে নিয়ে আসতে পারেন।

git rebase -i HEAD~4

উপরের কমান্ড ব্যবহার করা মাত্রই আপনার কম্পিউটারের ডিফল্ট এডিটর ওপেন হয়ে যাবে (এক্ষেত্রে Vim যদি না আপনি আপনার কম্পিউটারের ডিফল্ট এডিটর হিসেবে অন্যকোনো এডিটর সেট করে থাকেন)। আপনার কমিটগুলি পরিবর্তন করার ক্ষেত্রে আপনি অনেক কয়টি অপশন পাবেন যা নিচের কোডগুলির মত দেখাতে পারেঃ

pick 130deo9 oldest commit message
pick 4209fei second oldest commit message
pick 4390gne third oldest commit message
pick bmo0dne newest commit message

এসব গুলোকে একসাথে করার জন্য আমাদের "pick" অপশনকে পরিবর্তন করে "fixup" (কোডের নিচের ডকুমেন্টেশনে যেভাবে বলা থাকবে) করতে হবে যেন আপনার আগের কমিট মেসেজগুলি চলে যায় এবং কমিটগুলি একত্র হয়ে যায়। মনে রাখবেন, Vim এ আপনাকে "a" অথবা "i" কী প্রেস করতে হবে টেক্সট কে এডিট করার জন্য। টেক্সট সেইভ করা এবং ক্লোজ করার জন্য আপনাকে escape কী চাপতে হবে তারপর "shift + z + z" চাপতে হবে।

pick 130deo9 oldest commit message
fixup 4209fei second oldest commit message
fixup 4390gne third oldest commit message
fixup bmo0dne newest commit message

এটি আপনার সব কমিটগুলিকে মার্জ করে ফেলবে একটি কমিটে যেটায় মেসেজ হিসেবে "oldest commit message" থাকবে।

এর পরবর্তী ধাপটি হল আপনার কমিট মেসেজগুলি রিনেম করা। এটি আসলে পুরোটাই আপনার নিজের উপরে নির্ভর করে, কিন্তু আপনি যতক্ষন পর্যন্ত একটি নির্দিষ্ট প্যাটার্ন ঠিকভাবে অনুসরণ করে যাচ্ছেন ততক্ষন পর্যন্ত যাই করুন না কেন, সবকিছুই ঠিকঠাক থাকবে। এক্ষেত্রে আপনি Google for Angular.js এর কমিট গাইডলাইন টি অনুসরণ করতে পারেন।

কমিট মেসেজগুলো পরিবর্তন করার জন্য, amend ফ্ল্যাগটি ব্যবহার করতে হবে।

git commit --amend

এটিও Vim টেক্সট এডিটর ওপেন করবে, এবং টেক্সট এডিট করা, সেইভ করার নিয়মগুলো আগের মতই থাকবে, যেমনটা উপরে বলেছি। এখানে উপরের গাইডলাইন অনুসরণ করে একটি ভাল কমিট মেসেজের উদাহরণ দেওয়া হলঃ

feat: add stripe checkout button to payments page

- add stripe checkout button
- write tests for checkout

গাইডলাইনে বলা type গুলি ব্যবহার করার একটি সুবিধা হল, এর ফলে চেঞ্জ লগ লেখা অনেক সহজ হয়ে যায়। আপনি footer এও এসব তথ্যগুলো অন্তর্ভূক্ত করে দিতে পারেন (আবারো মনে করিয়ে দিচ্ছি, এসবই গাইডলাইনে স্পষ্ট করে বলা আছে)।

উল্লেখ্যঃ আপনি যদি একাধিক ডেভেলপারের সাথে একই প্রোজেক্ট কাজ করেন তাহলে আপনার উচিৎ rebase এড়িয়ে চলা। আপনি যদি সকলের মাঝে ভার্শন হিস্টরি পরিবর্তন করতে থাকেন তাহলে এমন বাগ এর সৃষ্টি হতে পারে যা ট্র্যাক করা অত্যন্ত কষ্টসাধ্য হবে।

গিট এর অসংখ্য কমান্ড রয়েছে তবে এই আর্টিকেলে উল্লেখিত কমান্ডগুলি, প্রোগ্রামার হিসেবে আপনার প্রথম কয়েক বছরের জন্য যথেষ্ট হবে।

Sam Corcos একজন লিড ডেভলাপার এবং Sightline Maps ও LearnPhoenix.io এর একজন সহ-প্রতিষ্ঠাতা। Sightline Maps 3D প্রিন্টিং topographical মানচিত্রের জন্য সবচেয়ে পরিচিত প্ল্যাটফর্ম, এবং LearnPhoenix.io, ফিনিক্স এবং রিঅ্যাক্টের সাথে স্কেলেবল প্রোডাকশন অ্যাপ তৈরি করার জন্য একটি উন্নতমানের টিউটোরিয়াল ওয়েবসাইট।