আপনি যদি আমাকে জিজ্ঞাসা করেন ডেভেলপমেন্ট এর জগতে সবচেয়ে ইউজফুল টুল কোনটা, তাইলে আমি চোখ বন্ধ করে বলবো গিট। আমার সাথে আরো অনেকেই হয়তো একমত হবেন। তবে গিট আসলে কতটা গুরুত্বপূর্ন আর ইউজফুল তা বলার অপেক্ষাই রাখে না। আমি আজকে ব্যাসিকালি গিট নিয়েই আলোচনা করবো। আর গিটহাব নিয়েও একটু আলোচনা থাকবে। গিট আর গিটহাব নিয়ে যাদের কনফিউশান আছে, এই দুইটা আসলে ভিন্ন দুইটা জিনিস। এখানে মেইন কাজ গিট এর।
গিট শিখার সময় সবার মধ্যে কমন যে প্রশ্নটা প্রথমেই মাথায় আসে, গিট কেন ইউজ করবো? কেন বারবার আমাকে কমান্ডলাইনে কমান্ড দিতে হবে। কেন আমাকে এই এক্সট্রা আরেকটা জিনিস ঢুকাতে হবে আমার প্রোজেক্টে। এটা কি আসলে টাইম ওয়েস্ট না? প্রথমে সবার মাথায় এটাই আসে, কারন এটার গুরুত্ব আর কাজ সম্পর্কে ধারনা না থাকলে এটাকে অতিরিক্ত একটা টুল হিসাবেই মনে হবে। আমারও প্রথমে তাই মনে হয়েছিলো। আর তাই আমি আজকে যাতে সবাই এটার গুরুত্বটা অন্তত বুঝতে পারে সেরকম উদাহরণ দিয়ে লিখার চেষ্টা করবো।
আমি লিখা শেষ করার পর দেখলাম অনেক বড় হয়ে গেছে, তাই পুরোটাকে তিনটা পর্বে ভাগ করেছি।
আর শুরু করার আগে আরেকটা কথা বলতে চাইঃ
আমি এখানে যে অ্যাপ্রোচগুলো নিয়েছি এগুলা ছাড়াও সেইম কাজ অনেকভাবে, অনেকরকম কমান্ড দিয়ে করা যায় গিট এ। তাই অন্যকোথাও অন্যরকম কিছু দেখে কনফিউজ হওয়ার কোনো কারণ নাই…
নিচের এই পিকচারটা খেয়াল করুন। আমরা অনেকেই এটার সাথে পরিচিত। এটা যদিও অনেকগুলা ফটোশপ ফাইল, তবে সেইম ব্যাপার আমাদের যেকোনো প্রোজেক্টের ক্ষেত্রেও ঘটে। একটা কাজেরই বিভিন্ন আপগ্রেডেড ভার্শন। এই পিকটা দেখার পর প্রথমে আমারও ইমোশনাল ফিলিং আসছিলো। আহা! আসলেই অনেক স্ট্রাগল করতে হয় এই কারণে। কিন্তু এখন দেখলে হাসি আসে… কেন?
কারণ গিট হলো ভার্শন কন্ট্রোল সিস্টেম। গিটের অনেকগুলো কাজের মধ্যে প্রধান এবং প্রাইমারী কাজ হচ্ছে আপনার প্রোজেক্টের প্রত্যেকটা চেঞ্জ ট্র্যাক করে রাখা আপনার মন মত। আপনাকে বারবার প্রোজেক্টের নতুন ভার্শনের জন্য নতুন করে আগের প্রোজেক্ট কপি করে আরেকটা নতুন ফোল্ডারে/ডিরেক্টরিতে রাখতে হবে না। আপনি জাস্ট কয়েকটা গিট এর কমান্ড দিয়েই চাইলে আপনি আপনার প্রোজেক্টের ট্র্যাক করা আগের ভার্শনে চলে যেতে পারবেন। আবার একদম নতুন ভার্শনেও চলে আসতে পারবেন। এর জন্যে আপনার একটা ডিরেক্টরিই থাকবে, প্রত্যেকটা ফাইলেরও একটা কপিই থাকবে আপনার প্রোজেক্টের ডিরেক্টরিতে। আপনাকে আপনার প্রোজেক্টের ভার্শন চেঞ্জ করার জন্যে কোনো ফাইলে হাত দিতে হবে না। সব গিট করে দিবে। এখন গিট ইউজ করলে খুব সহজেই উপরের উদাহরনে একটা ফাইলই থাকতো, কিন্তু চাইলে আবার আমরা গিট কমান্ডের সাহায্যে আগের ভার্শনগুলোতেও যেতে পারবো।
এখন এছাড়াও গিট ব্রাঞ্চ সিস্টেম রয়েছে যেটার প্রধান কাজ হলো, আমরা মাঝেমধ্যে আমাদের প্রোজেক্টে নতুন অজানা কোনো ফিচার অ্যাড করতে চাই। অনেকক্ষেত্রে দেখা যায় আমাদের এই ফিচারটা কেমন লাগবে সেটা সম্পর্কে ধারনা নাই। ভাবি হয়তো একবার ফিচারটা অ্যাড করে নিয়ে দেখলে বলা যাবে আসলে ফিচারটা প্রোজেক্টের সাথে যায় কি যায় না। সেক্ষেত্রে গিট ছাড়া হয়তো আমরা আমাদের মেইন প্রোজেক্টেই সেটা অ্যাড করতাম। তারপর টেস্ট করতাম কেমন হয়েছে সেটা দেখার জন্যে। তারপর ভালো না লাগলে আবার সব জায়গায় গিয়ে গিয়ে ম্যানুয়ালী নতুন লেখা কোডগুলো মুছে ফেলতে হতো, ফাইল ডিলেট করতো হতো। আর ভালো লাগলে ব্যাস এভাবেই রেখে দিতে হতো। কিন্তু গিট এ ব্রাঞ্চিং এর মাধ্যমে আমরা আমাদের প্রোজেক্টের আরেকটা ব্রাঞ্চ ক্রিয়েট করি কিছু কমান্ড দিয়ে। তারপর সেখানে আমরা আমাদের নতুন ফিচার টেস্ট করি। তারপর ভালো লাগলে সে ব্রাঞ্চ মেইন প্রোজেক্টের সাথে মার্জ করে ফেলি, আর ভালো না লাগলে সে ব্রাঞ্চ থেকে আবার মেইন প্রোজেক্টে চলে আসি। এক্ষেত্রে আমরা যেহেতু অন্য ব্রাঞ্চে কাজ করেছি, তাই মেইন প্রোজেক্টে কোনো হাতই দেওয়া হয় নাই। জাস্ট ইজিলি কয়েকটা কমান্ড দিয়েই আবার মেইন প্রোজেক্টে চলে আসতে পারবো। আর ম্যানুয়ালী আমাদের কোড মুছে ফেলা বা ফাইল ডিলেট করা কিছুই করা লাগবে না।
গিটহাব ব্যাসিকালি হোস্টিং সার্ভিস। তবে একটু স্পেশাল। কেমন স্পেশাল? হ্যাঁ ঠিক অনুমান করতে পেরেছেন, এটা গিট ভার্শন কন্ট্রোল সিস্টেমের জন্যে হোস্ট প্রোভাইড করে। আর সাথে কিছু ইউজার ইন্টারফেসও প্রোভাইড করে গিটের কাজগুলো করার জন্যে। এখন গিটহাবই একমাত্র হোস্ট প্রোভাইডার না এখানে, আরো যেমন বিটবাকেট, গিটল্যাবসহ আরো অনেক আছে। কিন্তু আমি এখানে গিটহাব হাইলাইট করেছি কারণ গিটহাবেই অনেক বড় বড় ওপেন সোর্স অনেক প্রোজেক্ট রয়েছে। তবে বিটবাকেট, গিটল্যাবও ছোটো ছোটো টীমের জন্যে অনেক ইউজফুল।
এখন এগুলোতে আমার প্রোজেক্ট হোস্ট করে কি লাভ? হ্যাঁ ঠিক, সেটাই এখন খুলে বলবো কেন আমাদের এজন্যে হোস্টিং প্রোভাইডারও লাগবে। আমাদের প্রোজেক্টে মাঝেমধ্যে একাধিক ডেভেলপার থাকে। বা টিমওয়ার্ক করলে একাধিক ডেভেলপাররা একই প্রোজেক্টের উপর কাজ করে। এখন আমরা চাইলে আমাদের প্রোজেক্টের ভার্শন কন্ট্রোল সিস্টেমসহ আমাদের বাকি টিমমেটদের সাথে শেয়ার করতে পারবো এইধরনের হোস্ট ইউজ করে, বা গিটহাব/বিটবাকেট/গিটল্যাব দিয়ে। আমার টিমমেটরাও আমার সেইম প্রোজেক্টটা পাবে, চাইলে আমার আগের ভার্শনগুলোও দেখতে পারবে, আবার চাইলে নিজেও নতুন আরেকটা ভার্শন অ্যাড করে আবার গিটহাবের মাধ্যমে শেয়ার করতে পারবে। আর আমি আবার গিটে কমান্ড দিয়ে সে ভার্শন আমার লোকাল ডিস্কে নিয়ে আসতে পারবো। এখন গিটহাবে প্রোজেক্ট এভাবে ওপেনও রাখা যায় আবার চাইলে প্রাইভেট প্রোজেক্টও রাখা যায়। গিটহাবে অনেক প্রোজেক্টের দেখবেন কয়েক হাজার ডেভেলপার কন্ট্রিবিউট করেছে একটা প্রোজেক্টে।
এখানে গিটহাবে হোস্ট করা একটা প্রোজেক্ট- রিঅ্যাক্ট এর কন্ট্রিবিউটর ১ হাজারেরও বেশী। তো গিট আর গিটহাব যুক্ত হয়ে এই ফ্লেক্সিবিলিটিটা দিয়েছে সবাইকে যাতে একটা প্রোজেক্ট যেকেউ চাইলে কন্ট্রিবিউট করতে পারে।
আর গিটের আরেকটা বড় ফিচার হচ্ছে মার্জিং। গিট অনেক স্মার্ট তাই একই ফাইলের উপর কয়েকজন ডেভেলপার কাজ করলে গিট সবার কাজগুলো সেই একটা ফাইলেই মার্জ করে ফেলতে পারে অটোম্যাটিকালি(অনেক সময় ম্যানুয়াল অ্যাপ্রোচ লাগে, তবে অনেক ইজিলি করা যায়)।
প্রসঙ্গত উল্লেখ্য, গত ৪ জুন, ২০১৮ ইং তারিখে টেক জায়ান্ট মাইক্রোসফট ৭.৫ বিলিয়ন ডলারের বিনিময়ে কিনে নেয় গিটহাবকে।
গিট ইউজ করতে চাইলে অবশ্যই আপনাকে গিট এখান থেকে ডাউনলোড করে ইন্সটল করতে হবে আপনার সিস্টেমে। আপনার অপারেটিং সিস্টেম যেটাই হউক না কেন, সবার জন্যই গিট এভেইলেবল।
সেটাপ প্রসেসে আমি বিস্তারিত যাবো না। খুবই সিম্পল, যদি কিছু বুঝতেও না পারেন জাস্ট নেক্সট নেক্সট দিয়ে সেটাপ প্রসেস কমপ্লিট করুন।
সেটাপ করা শেষ হলে একটা গিট ব্যাশ (Git Bash) অ্যাপ্লিকেশন পাবেন। এটা কমান্ড লাইন। এটা ওপেন করলে কমান্ড দেওয়ার উইন্ডো পাবেন, এখানে আপনি ইউনিক্স-লাইক অপারেটিং সিস্টেমের কমান্ড ইউজ করতে পারবেন। এজন্যে আপনার আগের কিছু লিনাক্স/ইউনিক্স এর কমান্ডের সাথে পরিচয় থাকলে ইজিলিই এখানে ইউজ করতে পারবেন। অথবা আজকে এখানে যে যে কমান্ডগুলো ইউজ করবো সেগুলো কোনটা কিভাবে কাজ করে সেগুলো শিখে ফেললেই আপাতত আপনি গিট ইউজ করতে পারবেন। এখন আপনি চাইলে আপনার কম্পিউটারে থাকা সব কমান্ড লাইন/টার্মিনাল থেকেই এখন গিট চালাতে পারবেন। আপনার পছন্দের কমান্ড লাইন/টার্মিনাল ওপেন করে নিচের কমান্ডটি লিখুনঃ
git --version
এটা এরকম কিছু আউটপুটে আপনার গিটের ভার্শন দেখাবেঃ
গিটের গ্লোবাল কিছু কনফিগারেশন করে নিতে হবে সবকিছু শুরু করার আগে। খুবই সিম্পল। জাস্ট আপনার কমান্ড লাইনটা ওপেন করে নিচের কমান্ডগুলো নিজের নাম এবং ইমেইল দিয়ে সেটাপ করে নিন। নিচের কমান্ডগুলো গিট এর গ্লোবাল কনফিগারেশন। অর্থাৎ আপনার সিসটেমে যত প্রজেক্টে গিট ইউজ করবেন তার সবগুলোতে ইউজারের নাম আর ইমেইল হিসাবে এগুলোই ইউজ করবে।
git config --global user.name "Zonayed Ahmed"
git config --global user.email "[email protected]"
ঠিক এভাবেই আপনি আপনার নাম আর আপনার ইমেইল দিবেন এখানে। ব্যাস কাজ কমপ্লিট।
কিন্তু আপনি যদি চান একাধিক প্রজেক্টের জন্য একাধিক নাম ও ইমেইল থাকবে তাহলে global কীওয়ার্ড ও তার আগের হাইফেন দুটো কেটে দিন। যেমন আপনার পিসিতে অফিসের একটা প্রজেক্ট আছে আবার আপনার পারসোনাল একটা প্রজেক্ট আছে। অফিসের প্রজেক্টটি রাখা আছে গিটহাবের আপনার অফিসের অ্যাকাউন্টে। আপনি সেই অ্যাকাউন্টে অ্যাক্সেস করেন আপনার অফিসের ইমেইল দিয়ে। আর আপনার পারসোনাল গিটহাব অ্যাকাউন্ট খোলা হয়েছিল আপনার পারসোনাল ইমেইল দিয়ে। তাহলে আপনার প্রজেক্টে যদি গ্লোবাল ইউজার নেম আর ইমেইল সেট করা থাকে তখন কিন্তু সব প্রজেক্টেই আপনার একই নাম ও একই ইমেইল দেখাবে। এজন্য গ্লোবাল ইউজার নেম, ইমেইল ইউজ না করা যেতে পারে।
//পারসোনাল প্রজেক্টের জন্য পারসোনাল ইমেইল ইউজ করে গিট কনফিগার করা হয়েছে
git config user.name "Zonayed Ahmed"
git config user.email "[email protected]"//অফিসের প্রজেক্ট কনফিগার করা হয়েছে অফিসের ইমেইল দিয়ে
git config user.name "Zonayed Ahmed"
git config user.email "[email protected]"
গিটে ডিরেক্টরিকেই ব্যাসিকালি রিপোজিটরি (Repository) বা শর্টকাটে অনেকে ‘রিপো (Repo)’ বলে। আপনার অলরেডি প্রোজেক্ট আছে এমন কোনো প্রোজেক্টে গিট স্টার্ট করতে চাইলে প্রথমে আপনার গিট ব্যাশ বা আপনার যেকোনো কমান্ড লাইন থেকেই সে প্রোজেক্টের ডিরেক্টরিতে যেতে হবে। সে ক্ষেত্রে আপনি যদি গিটের সেটাপের সময় কোনো অপশন পরিবর্তন করে না থাকেন তাহলে আপনার প্রোজেক্টের ভিতরে রাইট ক্লিক করলে দেখবেন Git Bash Here নামে একটা অপশন দেখাবে। এটাতে আপনার কাঙ্ক্ষিত প্রোজেক্ট ডিরেক্টরির ভিতর থেকে ক্লিক করলে এই ডিরেক্টরিতে গিট ব্যাশ ওপেন হবে যেখানে আপনি কমান্ড লিখতে পারবেন।
এখন ধরি আপনার Desktop এ একটা ডিরেক্টরি আছে learning-git
নামে। ভিতরে কিছু ফাইল আছে। এটাই আপনার প্রোজেক্ট, এখানেই আমরা গিট স্টার্ট করতে চাই। তাহলে আমি আমার কমান্ড লাইন এই ডিরেক্টরি ওপেন করে নিচের এই কমান্ড লিখবোঃ
git init
আমি learning-git
ডিরেক্টরির ভিতর থেকে git init
কমান্ড রান করলাম যেহেতু আমি এটার ভিতরের সবকিছুই ট্র্যাক করতে চাই। ব্যাস এখন এই ডিরেক্টরির ভিতরে গিটের রিপো সেটাপ হয়ে গেলো। এখন থেকে গিট সব ট্র্যাক করা শুরু করতে পারবে, এই ডিরেক্টরির ভিতরে যতো ফাইল/ফোল্ডার আছে সব। তবে ট্র্যাক করলেও গিট সেগুলোকে ভার্শন হিসাবে স্টোর করবে না। তারজন্যে আপনাকেই স্পেসেফিকলি বলে দিতে হবে কোনটা কোনটা কখন কিভাবে সেইভ করতে হবে।
আমার এই ডিরেক্টরির ভিতরে দুইটা .txt
ফাইল আছে। এগুলো এখন আমি চাচ্ছি গিট ভার্শন হিসাবে সেইভ করে রাখুক। তারজন্যে আমাদের দুইটা স্টেজ ক্রস করতে হবে। প্রথমে গিট আপনার উল্লেখিত ফাইলকে স্টেজিং এরিয়াতে নিবে, তারপর আবার আপনি চাইলে সেটা ফাইনাল হিসাবে আপনার গিট রিপোতে কমিট করতে পারবেন। এই দুই স্টেজের জন্য পৃথক পৃথক দুইটা কমান্ড ইউজ করতে হবে।
তার আগে আমরা গিটের বর্তমান অবস্থা দেখতে চাচ্ছি, যেটাকে বলে বর্তমান স্ট্যাটাস দেখতে চাচ্ছি কোন কোন ফাইল ট্র্যাক করা হয় নি বা কোন ফাইল স্টেজিং এ আছে। সেজন্যে নিচের এই কমান্ড ইউজ করতে হবেঃ
git status
আমার এই ডিরেক্টরিতে দুইটা ফাইল আছে QnA.txt
আর friend-list.txt
নামে। আমি যেহেতু মাত্রই গিট ইনিশিয়েট করলাম এই প্রোজেক্টে তাই দুইটা ফাইলই এখানে আন-ট্র্যাকড দেখাচ্ছে। আর সাথে কিছু হিন্টও দিয়ে দিচ্ছে কিভাবে ফাইলগুলো ট্র্যাক করতে হবে।
আমি প্রথম QnA.txt
ফাইলটা ট্র্যাক করতে চাই বা যেটাকে বলে স্টেজিং এরিয়াতে নিতে চাই। সেজন্যে আমাকে এভাবে কমান্ড দিতে হবেঃ
git add QnA.txt
এখন আপনার ফাইল কোনো ডিরেক্টরির ভিতরে হলে তাহলে সেভাবে ফাইলের রেফারেন্স দিতে হতো git add <Your file>
এভাবে। এখন আবার git status দিলে দেখবেন কারেন্ট স্ট্যাটাসঃ
git status
এখানে এখন দুইটা সেকশন দেখাচ্ছে। যেটা ট্র্যাক করেছি সেটা এখন উপরে দেখাচ্ছে Changes to be committed সেকশন এ। আর নিচে আগের সেই আন-ট্র্যাকড ফাইলটাই দেখাচ্ছে। যাই হোক এই মুহূর্তে আপনার ফাইল QnA.txt
স্টেজিং এরিয়াতে আছে, তাই এখন কমিট করলে গিট শুধুমাত্র এই ফাইলটাকেই ভার্শন হিস্টোরীতে রাখবে। আর যেটা এখনো ট্র্যাক করা হয় নাই সেটাকে নিয়ে কিছু করবে না। এখন যদি আমরা চাই যে এই ডিরেক্টরির ভিতরের সব আন-ট্র্যাকড ফাইলকে ট্র্যাক করতে একটা কমান্ড দিয়ে তাহলে এভাবে দিতে হবেঃ
git add --all
অথবা
git add .
এখন git status
দিলে দেখবেন সব ট্র্যাক হয়ে গেছে, মানে স্টেজিং এরিয়াতে আছে। কোনো ফাইল আন-ট্র্যাকড নাই। আগের QnA.txt
এখনো স্টেজিং এ আছে, যেহেতু এটা আমরা এখনো কমিট করি নাই। আর সাথে এখন friend-lists.txt
ও চলে আসছে। এখন কমিট করলে দুইটা মিলেই পুরোটার একটা ভার্শন রাখবে গিট।
কমিট হচ্ছে আপনি ফাইনাল সিদ্ধান্ত নিবেন আপনার ট্র্যাক করা চেঞ্জেসগুলোকে গিট রিপোতে রাখতে। এখন কমিট করতে চাইলে, প্রত্যেক কমিটের সাথে একটা ম্যাসেজও দিতে হয় যাতে পরবর্তিতে একদিন পরে বা এক বছর পরে বুঝতে সুবিধা হয় অমুক কমিটটা কি কারণে করা হয়েছিলো। সবকিছু এক লাইনে এভাবে হবেঃ
git commit -m "QnA and Friend Lists Added"
এখানে QnA and Friend Lists Added
হচ্ছে আমাদের এই কমিটের ম্যাসেজ। কমান্ড দেওয়া হলে এরকম ম্যাসেজ দেখতে পাবেনঃ
***আপনি স্টেজিং এরিয়ারে নেওয়ার আগে কোনোকিছু কমিট করতে পারবেন না।
এই পর্ব এই পর্যন্তই, পরের পর্ব দেখার আমন্ত্রণ রইলো। যদি বেশী হয়ে গেছে মনে করেন তাহলে এখানে ব্রেকও নিতে পারেন। আবার পরে পরের পর্বে জাম্প করতে পারবেন…