Git বনাম SVN
মূল পার্থক্যটা হলো আর্কিটেকচারে: Git হলো distributed (বিকেন্দ্রীভূত), আর SVN হলো centralized (কেন্দ্রীভূত) ভার্সন কন্ট্রোল সিস্টেম। এই একটা পার্থক্য থেকেই বাকি সব পার্থক্য এসেছে।
১. আর্কিটেকচার
SVN (Centralized): একটাই কেন্দ্রীয় সার্ভার থাকে যেখানে পুরো রিপোজিটরি ও তার ইতিহাস সংরক্ষিত থাকে। ডেভেলপাররা শুধু working copy চেক আউট করে। সার্ভার ডাউন থাকলে commit, log দেখা, branch করা—কিছুই করা যায় না।
Git (Distributed): প্রতিটা ডেভেলপারের কাছে পুরো রিপোজিটরির সম্পূর্ণ কপি থাকে—সব ইতিহাসসহ। ইন্টারনেট ছাড়াই commit, branch, merge, history দেখা—সব করা যায়। GitHub/GitLab আসলে শুধু একটা "সম্মত" কেন্দ্রীয় কপি, টেকনিক্যালি বাধ্যতামূলক কিছু না।
২. Branching এবং Merging
এটা সম্ভবত সবচেয়ে বড় ব্যবহারিক পার্থক্য।
SVN-এ branch মানে আসলে ডিরেক্টরির কপি (/branches/feature-x)। Branch তৈরি করা ভারী কাজ মনে হয়, আর merge করা ঐতিহাসিকভাবে বেশ যন্ত্রণাদায়ক ছিল (যদিও পরের ভার্সনগুলোতে উন্নতি হয়েছে)।
Git-এ branch হলো স্রেফ একটা commit-এর দিকে pointer—তৈরি করতে মিলিসেকেন্ড লাগে। এজন্যই feature branch, Git Flow, trunk-based development—এসব workflow Git-এর সাথে এত স্বাভাবিকভাবে কাজ করে। Merge করাও অনেক স্মার্ট, কারণ Git পুরো history graph জানে।
৩. Commit এবং ডেটা মডেল
- SVN ট্র্যাক করে ফাইলের পরিবর্তন (deltas), আর revision number গুলো ক্রমিক (r1, r2, r3...)।
- Git প্রতিটা commit-এ পুরো প্রজেক্টের একটা snapshot সংরক্ষণ করে (ভেতরে অপটিমাইজড), আর প্রতিটা commit চিহ্নিত হয় SHA-1 hash দিয়ে। এই content-addressable মডেলের কারণে ডেটার integrity নিশ্চিত হয়—history-তে কেউ চুপিচুপি কিছু বদলালে hash বদলে যাবে।
৪. গতি (Performance)
Git-এ প্রায় সব অপারেশন লোকাল—তাই log, diff, blame, branch switching খুবই দ্রুত। SVN-এ অনেক অপারেশনের জন্য সার্ভারে network round-trip লাগে।
৫. Staging Area
Git-এর একটা ইউনিক ফিচার হলো staging area (index)। আপনি বেছে বেছে ঠিক করতে পারেন কোন পরিবর্তনগুলো পরের commit-এ যাবে (git add -p দিয়ে একটা ফাইলের আংশিক পরিবর্তনও stage করা যায়)। SVN-এ এমন কিছু নেই—working copy-তে যা বদলেছেন, সবই commit হয়।
৬. যেখানে SVN এখনো এগিয়ে
সততার খাতিরে বলা দরকার, SVN-এরও কিছু সুবিধা আছে:
- বড় বাইনারি ফাইল: SVN বড় binary asset (গেম ডেভেলপমেন্ট, ডিজাইন ফাইল) ভালো হ্যান্ডেল করে। Git-এ এর জন্য Git LFS লাগে।
- Partial checkout: SVN-এ রিপোজিটরির শুধু একটা সাবডিরেক্টরি checkout করা যায় সহজে (Git-এ sparse checkout আছে, তবে জটিলতর)।
- সূক্ষ্ম access control: ডিরেক্টরি-লেভেলে read/write permission দেওয়া SVN-এ সহজ।
- সরল মানসিক মডেল: Sequential revision number আর একটাই "সত্যের উৎস"—নতুনদের জন্য বোঝা সহজ।
অন্যান্য সিস্টেম প্রসঙ্গে
- Mercurial (hg): Git-এর মতোই distributed, তবে ইন্টারফেস সহজ। Git-এর জনপ্রিয়তার কাছে হেরে গেছে (যদিও Meta এখনো ব্যবহার করে)।
- Perforce: বড় enterprise ও গেম স্টুডিওতে জনপ্রিয়, বিশাল রিপো ও বাইনারি ফাইলের জন্য।
- CVS: SVN-এর পূর্বসূরি, এখন কার্যত অবসোলিট।