1.1 প্রথম পদক্ষেপ – ভার্সন কন্ট্রোলের ভূমিকা

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

ভার্সন কন্ট্রোল

“ভার্সন কন্ট্রোল” কি আর কেনইবা এটাকে গুরুত্ব দেয়া উচিত? ভার্সন কন্ট্রোল হল একটি স্বয়ংক্রিয় সংস্করন ব্যাবস্থা, যা এক বা একাধিক ফাইলের মধ্যে সকল ধরনের পরিবর্তন বা সম্পাদনা ধারাবাহিকভাবে লিপিবদ্ধ করে রাখে যাতে করে পরবর্তীতে যে কোন পরিবর্তন তুলে এনে তা পর্যালেচনা, পূনঃমূল্যায়ন বা পুনরুদ্ধার ইত্যাদি সহজেই সম্পাদন করা যায়। এই বইতে উদাহারন হিসাবে সফ্টওয়ার সোর্স কোডের ফাইলগুলোকে “ভার্সন কন্ট্রোল” ফাইল হিসাবে ব্যবহার করা হয়েছে যদিও প্রায় সব ধরনের ফাইলই গিটের আওতাভুক্ত করা যায়।

আপনি যদি গ্রাফিক বা ওয়েব ডিজাইনার হয়ে থাকেন এবং আপনি একটি ইমেজ বা লেআউট ফাইলের সর্বশেষ সম্পাদনা সহ পূর্বে যত ধরনের পরিবর্তন বা পরিমার্জন আনা হয়েছে সব একসাথে রেখে দিতে চান (স্বভাবিকভাবেই আপনার সেটা চাওয়া উচিত), একটি ভার্সন কন্ট্রোল সিস্টেম(VCS – Version Control System) ব্যাবহার করা হবে আপনার জন্য সবচেয়ে উত্তম পন্থা। এটা আপনার যেকোন ফাইলকে বা পুরো প্রজেক্টকেই পূর্ববর্তী যে কোন সংস্করনে বা ভার্সনে ফিরে যেতে সাহায্য করবে। শুধু তাই নয়, পরিবর্তনগুলোর একটার সাথে আরেকটা তুলনা করা, পর্যালোচনা বা পুনঃমূল্যায়ন করা, কে কখন কোথায় কোন ফাইলে কি পরিবর্তন করেছে এবং কেন করেছে, কোন পরিবর্তনের ফলে প্রজেক্টের সমস্যা হচ্ছে এই সবই আপনি দেখতে পারবেন। কার্যতঃ ভার্সন কন্ট্রোল সিস্টেম ব্যবহার করার মানেই হচ্ছে আপনি যদি কোন ফাইল ভুলবশতঃ বা কোন কারনে ক্ষতিগ্রস্ত করে ফেলেন বা হারিয়ে ফেলেন, তা সহজেই পুনরুদ্ধার করতে পারবেন। আর এসকল সুবিধাই আপনি পাচ্ছেন সিস্টেমের উপর তেমন বাড়তি চাপ না ফেলেই।

লোকাল ভার্সন কন্ট্রোল সিস্টেম

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

এই সমস্যা মোকাবেলায় প্রোগ্রামাররা বহু পূর্বেই লোকাল ভার্সন কন্ট্রোল সিস্টেম তৈরী করেছেন। এই ভার্সন কন্ট্রোল সিস্টেম গুলোর অধীনে কোন ফাইলের পরিবর্তন হলে, সেই পরিবর্তনগুলো একটি ডাটাবেজে সংরক্ষন করা হতো।
চিত্র ১: লোকাল ভার্সন কন্ট্রোল
RCS এই ধরনের লোকাল ভার্সন কন্ট্রোল সিস্টেম টুলগুলোর মধ্যে একটি অন্যতম টুল, যা এখনো পর্যন্ত অনেক কম্পিউটারে ব্যাবহৃত হচ্ছে। RCS এর ভার্সন কন্ট্রোল পদ্ধতিটা বেশ চমৎকার। এটি ফাইল পরিবর্তনের পূর্বের এবং পরের এই দুইয়ের মধ্যে পার্থক্য বা patch গুলোকে এমন একটি কায়দায় সংরক্ষণ করে যেন পরবর্তীতে যে কোন সময় ফাইলের যেকোন ভার্সনে পুনরুদ্ধার করা যায়।

সেন্ট্রালাইজড ভার্সন কন্ট্রোল সিস্টেম্স

লোকাল ভার্সন কন্ট্রোল যখন মুটামুটি বেশ প্রচলিত হয়ে গেল। ধীরে ধীরে মানুষের চাহিদার ধরনও বদলাতে থাকল। ডেভেলপাররা তখন অন্য কোন ডেভেলপার যারা কিনা অন্য কোন সিস্টম ব্যাবহার করছে তাদেরকে সহযোগীতা করার প্রয়োজন বোধ করতে লাগলো। এই প্রয়োজন মেটানোর জন্যই পরবর্তীতে সেন্ট্রালাইজড ভার্সন কন্ট্রোল সিস্টমের আবির্ভাব হল। তারই ধারাবাহিকতায় CVS, Subversion, এবং Perforce এর মত কিছু ভার্সন কন্ট্রোল সিস্টমের উদয় হলো যা একটি সার্ভার ব্যাবহার করে সেখানে ফাইলের বিভিন্ন ভার্সন এবং ফাইলগুলোর সংশ্লিষ্ট ক্লাইন্ট সহকারে চমৎকারভাবে সংরক্ষিত থাকে। ক্লাইন্টরা তাদের প্রয়োজনমত তাদের যেকোন ফাইল তার যে কোন ভার্সনে সেই সেন্ট্রাল সার্ভার থেকে তুলে আনতে বা চেক আউট করতে পারে এবং কাজ শেষ করে আবার সেই সেন্ট্রাল সার্ভারে সংরক্ষন বা চেক ইন করতে পারে। বহু বছর যাবৎ এই সেন্ট্রালাইজড ব্যাবস্থাই বেশ সফলতার সাথে মানুষ ব্যাবহার করে আসছে।
চিত্র ২: সেন্ট্রালাইজড ভার্সন কন্ট্রোল
এই সেন্ট্রালাইজড ব্যাবস্থা লোকাল ব্যাবস্থার চেয়ে অনেকগুলো বাড়তি সুবিধা আমাদের জন্য উম্মুক্ত করে দেয়। যেমন, কোন একটা নির্দিষ্ট প্রজেক্টের ডেভেলপাররা অন্য ডেভেলপাররা কি করছেন সে সম্বন্ধে একটা নির্দিষ্ট ধারনা পেতে পারেন। যারা আডমিন আছেন তারা খুব সহজেই প্রজেক্টের কে কোথায় কি ধরনের কাজ করতে পারবেন সে ব্যাপারে সূক্ষাতিসূক্ষ পর্যায় পর্যন্ত নিয়ন্ত্রন করতে পারেন।

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

অবশিষ্ট থাকবে কেবলমাত্র ডেভেলপাররা সর্বশেষ যে ভার্সনটি তাদের লোকাল কম্পিউটারে চেক আউট বা কপি করে রেখেছিল সেটাই। লোকাল ভার্সন কন্ট্রোল সিস্টেমও (Local VCSs) একই ধরনের ঝুকির মধ্যে থাকে। কার্যতঃ আপনি যখনই একটা কোন নির্দিষ্ট জায়গায় আপনার সমস্ত কাজ সংরক্ষন করবেন, সবসময়ই আপনি একসঙ্গে সবকিছু হারিয়ে ফেলার ঝুঁকির মধ্য দিয়ে যাবেন।

ডিস্ট্রিবিউটেড ভার্সন কন্ট্রোল সিস্টেম্স

লোকাল ব্যাবস্থাপনার যে সহজাত ঝুঁকি, সেটা দুর করার জন্যই ডিস্ট্রিবিউটেড ভার্সন কন্ট্রোল সিস্টেম্স এর আবির্ভাব হয়েছে। কিছু জনপ্রিয় টুল যেমন গিট্ (Git), মার্কারিয়াল (Mercurial), বাজার (Bazaar) এবং ডার্কস্ (Darcs), এগুলো তৈরী হয়েছে ডিস্ট্রিবিউটেড ভার্সন কন্ট্রোল ব্যাবস্থা অনুসরন করেই। এই ব্যাবস্থাপনায়, ক্লাইন্টরা যে কেবল সর্বশেষ ভার্সন চেক আউট করতে পারবেন শুধু তাই নয়, তাদের কম্পিউটারে আসলে ফাইলগুলোর শুরু থেকে শেষ পর্যন্ত যা যা পরিবর্তন সাধিত হয়েছে তার সমস্তটাই কপি হয়ে যায়। এভাবে সবার কাছে মুটামুটি একই জিনিসের কপি থাকার কারনে কখনো যদি কোন একটা সার্ভার বিকল হয়ে যায় বা কোন ফাইল নষ্ট হয়ে যায়, ডিস্ট্রিবিউটেড ভার্সন কন্ট্রোল ব্যাবস্থার কারনে, অন্য একটা কম্পিউটার থেকে স্বয়ংক্রিয়ভাবে পুরো প্রজেক্ট বা নষ্ট হয়ে যাওয়া ফাইল সার্ভারে পুনরুদ্ধার করা যায় অতি সহজেই। কার্যতঃ প্রতিটা ক্লোন-ই, পুরো রিপোজিটরি বা কোন ফাইলের পরিবর্তন ইতিহাস সহ সম্পূর্ণ একটা তথ্যভান্ডার। সহজভাবে বলতে গেলে, প্রতিটা ক্লাইন্ট কম্পিউটারই মূল সার্ভারের একটা করে ক্লোন।