Vivasoft-logo

1.3 প্রথম পদক্ষেপ – গিট কি?

গিট কি?

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

পার্থক্য নয় বরং স্ন্যাপশট

অন্যান্য ভার্সন কন্ট্রোল সিস্টেম যেমন সাবভার্সন বা এই ধরনের অন্যান্যগুলোর সঙ্গে গিটের মূল পার্থক্যই হলো, ডেটা নিয়ে দৃষ্টিভঙ্গি। একধরনের সিস্টেম আছে (সাবভার্সন এবং এর অনুরুপ) যা কিনা একটা ফাইলে যত পরিবর্তন হয় তার একটা তালিকা তৈরী করে সেটা সংরক্ষন করে। আবার আরেক ধরনের সিস্টেম আছে (সিভিএস, সাবভার্সন, পারফোর্স, বাজার এবং অনুরুপ) যা ডেটাগুলোকে কতগুলো ফাইল এবং কালক্রমে ফাইলগুলোতে যে পরিবর্তন আনা হয়েছে তার সেট হিসাবে দেখে। এগুলোকে সাধারনত ডেল্টা বেসড (Delta based) ভার্সন কন্ট্রোল বলা হয়।
চিত্রঃ ৪ প্রতিটা ফাইলের মূল ভার্সনে কালক্রমে পরিবর্তনগুলো যেভাবে সংরক্ষন করা হয়
গিট কিন্তু ডেটাকে এইভাবে দেখে না। গিট তার ডেটাকে অনেকটাই ছোটখাটো একটা ফাইল সিস্টেমের স্ন্যাপশটের সিরিজ হিসাবে দেখে (a series of snapshots of a miniature filesystem)। গিটের কোন প্রজেক্টে যখনই আপনি কমিট করেন বা কোন পরিবর্তন আনেন তখনই সে ওই প্রজেক্টের ঐ মুহূর্তে প্রতিটা ফাইলের অবস্থার একটা ছবি সংক্ষন করে, সেইসাথে এই চিত্রটির একটা রেফারেন্সও সংরক্ষন করে রাখে। আরও ভাল উপায় হিসাবে, যদি ফাইলগুলি পরিবর্তিত না হয় তবে গিট ফাইলটিকে আবার সংরক্ষণ করে না বরং এটি ইতিমধ্যে সংরক্ষিত পূর্ববর্তী অপরিবর্তিত ফাইলের একটি লিঙ্ক সংরক্ষণ করে। গিট এই ডেটাগুলিকে স্ন্যাপশটের একটি ধারার (stream of snapshots) মতো চিন্তা করে।
চিত্রঃ ৫। সময়ের সাথে সাথে প্রজেক্টের ডেটার স্ন্যাপশট সংরক্ষন।
এখানেই গিটের সাথে অন্যান্য ভিসিএসের মৌলিক পার্থক্য। যেখানে অন্যান্য বেশিরভাগ সিস্টমই পূর্ববর্তী কোন না কোন মডেলের অনুলিপিমাত্র সেখানে গিটের এই অনন্য সাধারন বৈশিষ্ট ভার্সন কন্ট্রোলের জগতে এক নতুন দিকনির্দশনা প্রদান করে। ভার্সন কন্ট্রোল নিয়ে যারা ভাবনা চিন্তা করেন তাদেরকে নতুন করে ভাবার প্রনোদনা দেয়। তাই গিটকে একটি সাধারণ ভিসিএস হিসাবে না দেখে “শক্তিশালী কিছু টুলযুক্ত ছোট ফাইল সিস্টেম” হিসাবে দেখলেই বেশি যুক্তিসঙ্গতঃ হবে। গিট ব্রাঞ্চিং অধ্যায়ে ডেটাকে স্ন্যাপশটের একটি ধারা (stream of snapshots) হিসাবে চিন্তা করার সুবিধাগুলো নিয়ে আরো বিস্তারিত আলোচনা থাকবে।

প্রায় সব অপারেশনই আসলে লোকাল

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

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

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

অবিচ্ছেদ্য গিট

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

চেকসামিং (Checksumming) এর জন্য গিট SHA-1 নামের একটি কৌশল ব্যাবহার করে। SHA-1 হচ্ছে ৪০ দৈর্ঘের একটি হেক্সাডেসিমাল সংখ্যা (0-9 এবং a-f) যা কিনা ফাইলের কন্টেন্টের উপর এবং ফোল্ডার বিন্যাসের উপর ভিত্তি করে গননা করা হয়। একটি SHA-1 শব্দ দেখতে এরকম দেখায়ঃ

Unset

24b9da6552252987aa493b52f8696cd6d3b00373

গিট এই ধরনের হ্যাশ কোড (hash code) এত ব্যাবহার করে যে আপনি সর্বত্র এর দেখা পাবেন। কর্যতঃ গিট তার ডাটাবেজে কোন কিছু ফাইলের নাম ধরে সংরক্ষন না করে এই হ্যাশ কোড আকারে সংরক্ষন করে।

গিট কেবলই ডেটা সংযুক্ত করে

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

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

তিন অবস্থা

একটু মনোযোগ দিয়ে খেয়াল করুন – গিট সম্বন্ধে শিক্ষালাভ আরেকটু সহজ ও কার্যকর কারার জন্য এর কিছু মৌলিক বিষয়ের দিকে নজর দেওয়া জরুরী। গিটের অধীনে ফাইলগুলো তিনটি অবস্থার মধ্যে থাকে যেমন মডিফাইড (modified), স্টেজড (staged) এবং কমিটেড (committed):
  • Modified বলতে বুঝায় আপনি আপনার ফাইলগুলোর মধ্যে কিছু পরিবর্তন করেছেন কিন্তু এখনো সেটা কমিট করা হয়নি।
  • Staged বলতে বুঝায় বর্তমান ভারসনে আপনার পরিবর্তিত ফাইলগুলোর মধ্যে কোন একটা ফাইলকে পরবর্তী স্ন্যাপশট কমিটের জন্য চিহ্নিত বা mark করেছেন।
  • Committed বলতে বুঝায় আপনার ডেটা লোকাল ডাটাবেজে নিরাপদ অবস্থায় সংরক্ষিত আছে।


আমরা এখন গিট প্রজেক্টের তিনটি প্রধান সেকশন নিয়ে আলোচনা করব। সেগুলো হলঃ ওয়ার্কিং ট্রি (The working tree), স্টেজিং এরিয়া (The staging area) এবং গিট ডিরেক্টরি (The Git directory)।
চিত্রঃ৬। ওয়ার্কিং ট্রি, স্টেজিং এরিয়া, এবং গিট ডিরেক্টরি।
ওয়ার্কিং ট্রি হচ্ছে প্রজেক্টের কোন একটা ভার্সনের একটা সিঙ্গেল চেক আউট (single checkout) বা লোকাল কপি। এই ফাইলগুলোকে গিট ডিরেক্টরির কমপ্রেসড (Compressed) ডাটাবেজ থেকে তুলে এনে আপনার কম্পিউটারে রাখা হয়েছে। এই কপির উপরই আপনি কাজ করবেন।

স্টেজিং এরিয়া হলো একটি ফাইল যা সাধারনত আপনার গিট ডিরেক্টরিতে থাকে। আপনার পরবর্তী কমিটে কি কি জিনিস থাকবে সে ব্যাপারে প্রয়োজনীয় কিছু তথ্য উপাত্ত এই ফাইলে সংরক্ষিত থাকে। গিটের ভাষ্যমতে (Git parlance) এর টেকনিক্যাল নাম হচ্ছে ইনডেক্স (index)। এটি স্টেজিং এরিয়া নামেও বেশ পরিচিত।

গিট ডিরেক্টরিতে গিট আপনার প্রজেক্ট সংক্রান্ত যাবতীয় মেটাডেটা (metadata) এবং অবজেক্ট ডেটাবেস (object database) সংরক্ষন করে রাখে। এটা হচ্ছে গিটের সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনি যখন অন্য কোনো কম্পিউটার থেকে কোনো রিপোজিটরি কপি করেন তখন মূলতঃ এই গিট ডিরেক্টরিটি-ই কপি হয়।
গিটের ওয়ার্কফ্লো মুটামুটি নিম্নরুপঃ ১। আপনার যত কাজ আপনি আপনার লোকাল ওয়ার্কিং এরিয়া  (working area) তে সম্পাদন করবেন। ২। পরবর্তী কমিটে কি কি পরিবর্তন অন্তর্ভূক্ত হবে সেগুলো বেছে বেছে ঠিক করে ওগুলোকে স্টেজিং এরিয়াতে আনবেন। ৩। আপনি কমিট করবেন। যে সমস্ত ফাইল স্টেজিং এরিয়াতে আছে শুধুমাত্র সেগুলোর স্ন্যাপশটই গিট ডিরেক্টরিতে স্থায়ীভাবে সংরক্ষিত হয়ে থাকবে।

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