যদি আমি সেগুলি সঠিকভাবে বুঝতে পারি (এবং আমি প্রত্যেকের বিশেষজ্ঞের থেকে অনেক দূরে) তবে তাদের মুলত প্রত্যেকটির আলাদা আলাদা দর্শন থাকে। আমি প্রথম 9 মাস ধরে ম্যুর্যুয়ালাল ব্যবহার করেছি। এখন আমি 6 জন্য গিট ব্যবহার করেছি।
এইচজি হ'ল সংস্করণ নিয়ন্ত্রণ সফ্টওয়্যার। এটির মূল লক্ষ্যটি হ'ল এক টুকরো সফ্টওয়্যার সংস্করণ ট্র্যাক করা।
গিট একটি সময় ভিত্তিক ফাইল সিস্টেম। এটির লক্ষ্যটি একটি ফাইল সিস্টেমে অন্য মাত্রা যুক্ত করা। বেশিরভাগের কাছে ফাইল এবং ফোল্ডার থাকে, গিট সময় যোগ করে। ভিসিএস এর নকশার একটি উপ-উত্পাদন হওয়ায় এটি দুর্দান্ত কাজ করার ঘটনা ঘটে।
এইচজি-তে, পুরো প্রকল্পটির ইতিহাস রয়েছে যা এটি বজায় রাখার চেষ্টা করে। ডিফল্টরূপে আমি বিশ্বাস করি যে এইচজি সমস্ত ব্যবহারকারীদের দ্বারা সমস্ত পদক্ষেপে সমস্ত পরিবর্তন চায় যখন ধাক্কা এবং টান হয়।
গিটের মধ্যে কেবলমাত্র পুকুরের অবজেক্ট এবং এই ট্র্যাকিং ফাইলগুলি (শাখা / মাথা) রয়েছে যা নির্ধারণ করে যে কোন বস্তুর কোন সেট কোনও নির্দিষ্ট অবস্থায় ফাইলের গাছকে উপস্থাপন করে। গিট ঠেলা বা টানানোর সময় আপনি যে নির্দিষ্ট শাখাগুলি ধাক্কা বা টানছেন তার জন্য প্রয়োজনীয় বস্তুগুলি কেবল প্রেরণ করে যা সমস্ত বস্তুর একটি ছোট উপসেট।
যতদূর গিট সম্পর্কিত, কোনও "1 প্রকল্প" নেই। আপনার কাছে একই রেপোতে 50 টি প্রকল্প থাকতে পারে এবং গিটের যত্ন নেই। প্রত্যেকে একই রেপোতে আলাদাভাবে পরিচালনা করতে এবং সূক্ষ্মভাবে জীবনযাপন করতে পারে।
শাখাগুলির এইচজি ধারণাটি মূল প্রকল্পের শাখা বা শাখাগুলি থেকে শাখা ইত্যাদি G গিটের এমন ধারণা নেই। গিটের একটি শাখা গাছের একটি রাজ্য, সবকিছু গিটের একটি শাখা। কোন শাখাটি অফিসিয়াল, কারেন্ট বা সর্বাধিক নবীনতার গিটের কোনও অর্থ নেই।
আমি জানি না যে এটি কোনও ধারণা তৈরি করেছে কিনা। আমি ছবি আঁকতে পারলে এইচজি হ'ল এটির মতো দেখতে যেখানে প্রতিশ্রুতিবদ্ধ কo
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
একটি গাছ যার একক শিকড় এবং ডালগুলি এর থেকে নেমে আসছে। যদিও গিট এটি করতে পারে এবং প্রায়শই লোকেরা সেভাবে এটি ব্যবহার করে যা প্রয়োগ করা হয় না। একটি গিট ছবি, যদি এমন কিছু থাকে তবে সহজেই এটি দেখতে পারা যায়
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
আসলে কিছু উপায়ে এটি গিটে শাখা প্রদর্শন করাও বোধগম্য নয়।
একটি বিষয় যা আলোচনার জন্য খুব বিভ্রান্তিকর, গিট এবং পার্থক্যযুক্ত উভয়েরই একটি "শাখা" বলে কিছু আছে তবে তারা দূর থেকে একই জিনিস নয়। যখন বিভিন্ন রেপোসের মধ্যে দ্বন্দ্ব থাকে তখন পার্কে একটি শাখা আসে। গিটের একটি শাখা দৃশ্যত এইচজি মধ্যে একটি ক্লোন এর অনুরূপ। তবে একটি ক্লোন, যদিও এটি একইরকম আচরণ দিতে পারে তা সম্ভবত একই রকম নয়। ক্রোমিয়াম রেপো যা বরং বড় এটি ব্যবহার করে আমাকে গিট বনাম এইচজি চেষ্টা করে দেখুন।
$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'
real 0m1.759s
user 0m1.596s
sys 0m0.144s
এবং এখন এইচজি ক্লোন ব্যবহার করে
$ time hg clone project/ some-clone/
updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real 0m58.196s
user 0m19.901s
sys 0m8.957
দুজনেই হট রান। অর্থাৎ আমি তাদের দু'বার দৌড়েছি এবং এটি দ্বিতীয় রান। এইচজি ক্লোন আসলে গিট-নতুন-ওয়ার্কডিরের মতো। এঁরা দু'জনই পুরোপুরি নতুন একটি কার্যকারী দিরকে প্রায় এমনভাবে তৈরি করেন যেন আপনি টাইপ করেছেন cp -r project project-clone
। গিটে নতুন শাখা তৈরির মতো নয়। এটি অনেক বেশি ভারী ওজন। এইচজি-তে গিটের ব্রাঞ্চিংয়ের সত্যিকারের সমতুল্য হলে আমি জানি না এটি কী।
আমি বুঝতে পারি কিছু স্তরে এইচজি এবং গিট সম্ভবত একই রকম কাজ করতে সক্ষম হবে। যদি তাই হয় তবে যে ওয়ার্কফ্লো তারা আপনাকে নিয়ে যায় তার মধ্যে এখনও একটি বিশাল পার্থক্য রয়েছে। গিটে, আদর্শ ওয়ার্কফ্লো হ'ল প্রতিটি বৈশিষ্ট্যের জন্য একটি শাখা তৈরি করা।
git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support
এটি স্রেফ 3 টি শাখা তৈরি করেছে, প্রতিটি মাস্টার নামে একটি শাখা বন্ধ করে দিয়েছে। (আমি নিশ্চিত যে এই 2 টির পরিবর্তে 1 টি লাইন তৈরি করার কিছুটা উপায় আছে)
এখন আমি একটি কাজ করতে
git checkout fix-game-save-bug
এবং কাজ শুরু। জিনিসগুলি প্রতিশ্রুতিবদ্ধ করা ইত্যাদি ক্রোমের মতো বড় কোনও প্রকল্পেও শাখাগুলির মধ্যে স্যুইচিং প্রায় তাত্ক্ষণিক। আমি আসলে জানি না কীভাবে এইচজি করতে হয়। এটি আমি যে কোনও টিউটোরিয়াল পড়েছি তার অংশ নয়।
অন্য একটি বড় পার্থক্য। গিটের মঞ্চ।
গিটের একটি মঞ্চ সম্পর্কে এই ধারণা রয়েছে। আপনি এটি একটি লুকানো ফোল্ডার হিসাবে ভাবতে পারেন। আপনি যখন প্রতিশ্রুতিবদ্ধ হন কেবল তখনই আপনি প্রতিশ্রুতিবদ্ধ হন যা মঞ্চে রয়েছে, আপনার কার্যক্ষম গাছের পরিবর্তন নয়। এটা অদ্ভুত লাগতে পারে। আপনি যদি আপনার কার্যকারী বৃক্ষের সমস্ত পরিবর্তন করতে চান তবে আপনি যা করতে চান git commit -a
যা সমস্ত পরিবর্তিত ফাইলগুলি মঞ্চে যুক্ত করে এবং তারপরে তাদের প্রতিশ্রুতি দেয়।
তখন মঞ্চের বিন্দু কী? আপনি নিজের কমিটগুলি সহজেই আলাদা করতে পারবেন। কল্পনা করুন যে আপনি joypad.cpp এবং গেমসএভ.সি.পি সম্পাদনা করেছেন এবং আপনি সেগুলি আলাদাভাবে প্রতিশ্রুতিবদ্ধ করতে চান
git add joypad.cpp // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp // copies to stage
git commit -m "fixed game save bug"
মঞ্চে একই ফাইলের কোন নির্দিষ্ট লাইনগুলি অনুলিপি করতে চান তা নির্ধারণের জন্য গিটের এমনকি কমান্ড রয়েছে যাতে আপনি সেই প্রতিশ্রুতিগুলি পৃথকভাবে পৃথক করেও নিতে পারেন। আপনি এটি কেন করতে চান? কারণ পৃথক প্রতিশ্রুতিবদ্ধ হিসাবে অন্যরা কেবল তাদের পছন্দসই টানতে পারে বা যদি কোনও সমস্যা হয় তবে তারা সমস্যাটি কেবল প্রতিশ্রুতি ফিরিয়ে দিতে পারে।