"শাখা প্রশাখা বিনামূল্যে" গিটের অর্থ কী?


27

"ব্রাঞ্চিং ফ্রি ইজ" গিটের অর্থ কী?

অন্যান্য সংস্করণ নিয়ন্ত্রণ সিস্টেমের তুলনায় গিটের উল্লেখ করা হলেও আমি এটি অনেক শুনেছি hear

আমার সাথে অন্যদের ( এসভিএন ইত্যাদি) মোকাবিলার সুযোগ (? ) নেই, তাই অন্যের মধ্যে কীভাবে "ব্যয়বহুল" শাখা করা হচ্ছে?

উত্তর:


28

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

গিটের কী ধরণের ওভারহেড রয়েছে তা পরীক্ষা করে কেন গিটটি এত "সস্তা" তা খতিয়ে দেখি:

শাখাগুলি কীভাবে গিটে প্রয়োগ করা হয়?

গিট সংগ্রহস্থল, .gitবেশিরভাগই ফাইলগুলির সাথে ডিরেক্টরি থাকে যা মেটাডেটা ব্যবহার করে যা গিট ব্যবহার করে। আপনি যখনই গিটে একটি শাখা তৈরি করেন, উদাহরণস্বরূপ git branch {name_of_branch}, কয়েকটি জিনিস ঘটে:

  • স্থানীয় শাখায় একটি রেফারেন্স তৈরি করা হয়েছে: .git/refs/heads/{name_of_branch}
  • স্থানীয় শাখার জন্য একটি ইতিহাস লগ তৈরি করা হয়েছে: .git/logs/refs/heads/{name_of_branch}

এটি মূলত এটি, বেশ কয়েকটি পাঠ্য ফাইল তৈরি করা হয়। আপনি যদি পাঠ্য ফাইল হিসাবে রেফারেন্সটি খোলেন বিষয়বস্তুগুলি শাখাটি নির্দেশ করছে যে প্রতিশ্রুতিবদ্ধতার আইডি-শ হবে be নোট করুন যে ব্রাঞ্চিংয়ের জন্য আপনাকে কোনও কমিট করার প্রয়োজন হয় না কারণ তারা অন্য ধরণের অবজেক্ট। শাখা এবং প্রতিশ্রুতি উভয়ই গিটের মধ্যে "প্রথম শ্রেণির নাগরিক" এবং একটি উপায় হ'ল শাখা থেকে প্রতিশ্রুতিবদ্ধ সম্পর্কটিকে একটি সংমিশ্রণের পরিবর্তে একটি সংহতি হিসাবে ভাবা। যদি আপনি কোনও শাখা অপসারণ করেন তবে কমিটগুলি এখনও "ঝোলা" হিসাবে উপস্থিত থাকবে। যদি আপনি দুর্ঘটনাক্রমে কোনও শাখা মুছে ফেলে থাকেন তবে আপনি সর্বদা শায়ে-আইডিতে ঝুলন্ত বাম দেখতে পাওয়া (এবং যতক্ষণ না গিটটি এখনও কোনও আবর্জনা সংগ্রহ করেনি) সন্ধান করতে git-lost-foundবা git-fsck --lost-foundশাখা-আইডিতে একটি শাখা তৈরি করার চেষ্টা করতে পারে ।

সুতরাং গিট কীভাবে আপনি কোন শাখায় কাজ করছেন তা ট্র্যাক করবে? উত্তরটি .git/HEADফাইলটির সাথে রয়েছে, যা আপনি masterশাখায় থাকলে এই জাতীয় সাজান ।

ref: refs/heads/master

শাখাগুলি স্যুইচ করা সহজভাবে .git/HEADফাইলের রেফারেন্স পরিবর্তন করে এবং তারপরে কমিটে সংজ্ঞায়িত সংখ্যার সাথে আপনার ওয়ার্কস্পেসের বিষয়বস্তু পরিবর্তন করতে এগিয়ে যায়।

এটি অন্যান্য সংস্করণ নিয়ন্ত্রণ সিস্টেমে কীভাবে তুলনা করে?

ইন Subversion শাখা সংগ্রহস্থলের মধ্যে ভার্চুয়াল ডিরেক্টরি হয় । তাই শাখার সহজতম উপায় হ'ল এটি একটি লাইনারের সাহায্যে দূরবর্তীভাবে করা svn copy {trunk-url} {branch-url} -m "Branched it!"। এসভিএন যা করবে তা নিম্নলিখিত:

  • উত্স ডিরেক্টরিটি অনুলিপি করুন, উদাহরণস্বরূপ trunk, একটি লক্ষ্য ডিরেক্টরিতে,
  • অনুলিপিটির ক্রিয়াকে চূড়ান্ত করতে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ।

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

এসভিএন , অর্থাৎ svn switch, শাখাগুলি স্যুইচ করার জন্য কমান্ডটি সত্যই svn updateছদ্মবেশে রয়েছে। ভার্চুয়াল ডিরেক্টরি ধারণার জন্য ধন্যবাদ কমান্ডটি গিটের চেয়ে এসএনএন-তে কিছুটা নমনীয়। আপনার কর্মক্ষেত্রের সাব ডিরেক্টরিগুলি অন্য একটি সংগ্রহস্থল url মিরর করতে স্যুইচ করা যেতে পারে। নিকটতম জিনিসটি ব্যবহার করা হবে git-submoduleতবে এটি ব্যবহার করা শাখা প্রশাখার থেকে শব্দার্থগতভাবে একেবারেই আলাদা। দুর্ভাগ্যক্রমে এটি একটি ডিজাইনের সিদ্ধান্ত যা গিটের তুলনায় এসভিএন-তে কিছুটা ধীরগতির করে দেয় কারণ এটি প্রতিটি ওয়ার্কস্পেস ডিরেক্টরি যা কোন রিমোট-ইউআরএলটি মিরর করছে তা যাচাই করতে হবে। আমার অভিজ্ঞতায়, গিট এসভিএন এর চেয়ে শাখাগুলি স্যুইচ করার পক্ষে দ্রুত।

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

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

অন্য একটি উদাহরণ হিসাবে, এ Mercurial , একটি DVCS যেমন একটু ভিন্ন শুরু আউট শাখাবিন্যাস এবং তৈরি / অন্তক নামে শাখা পৃথক করে প্রয়োজন। তত্পর ডেভেলপারদের উন্নয়ন পরবর্তী বাস্তবায়িত বুকমার্ক অনুকরণমূলক Git এর একই শাখাবিন্যাস মডেল যদিও করতে headsবলা হয় tipsএবং branchesহয় bookmarksতত্পর পরিভাষা পরিবর্তে।


কি দারুন. "ব্যয়বহুল" ব্যাখ্যার জন্য অনেক ধন্যবাদ।
laggingreflex

2
আপনার নিজস্ব উত্স থেকে: This command causes a near-instantaneous commit in the repository, creating a new directory in revision 341. The new directory is a copy of /calc/trunk.- আপনি স্পষ্টভাবে প্রতিটি ফাইলের একটি অনুলিপি তৈরি না করলেই শাখা তৈরি করা এসভিএন-তে তুচ্ছ।
ববসন

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

2
@ স্পোক - স্যুইচিং, অবশ্যই। এবং একটি প্রতিশ্রুতি অবশ্যই প্রয়োজন। আমার যে সমস্যাটি হয়েছিল তাতে কিছুটা স্পষ্ট করতে আমি একটি সম্পাদনা করেছি। আপনি যদি পছন্দ করেন তবে তা নির্দ্বিধায় অনুভব করুন।
ববসন

20

একটি শাখার আসল ব্যয় এটি মার্জ করে। গিট অন্যান্য কয়েকটি উত্স নিয়ন্ত্রণ সিস্টেমের চেয়ে এটিকে সহজ করে তোলে। স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন কীভাবে এবং / বা কেন গিটে এসভিএন-এর চেয়ে ভাল মার্জ করা হচ্ছে?


5
কঠোরভাবে, গিট কেবলমাত্র কিছু অন্যান্য এসসিএম এর চেয়ে সহজ করে তোলে ।
ডোনাল ফেলো

10

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

এসভিএন-তে ব্রাঞ্চিং বিশেষভাবে ব্যয়বহুল নয় - এটি কেবল একটি অনুলিপি, যা খুব সস্তা প্রতিশ্রুতিবদ্ধ। এসভিএন এর একটি কেন্দ্রীয় সংগ্রহস্থল মডেল রয়েছে, সুতরাং এটি একটি নেটওয়ার্ক অ্যাক্সেস, তবে ভয়ঙ্কর নয়।

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


4
গিটের সাথে, এটি অঙ্গীকারের চেয়েও কম - একটি শাখা কেবল একটি লেবেল। এবং এসভিএন সিভিএসের মতো ব্যয়বহুল বলে মনে হয়, কারণ তারা উভয়ই সমস্ত ফাইল অনুলিপি করে।
ইজকাটা

8
@ ইজকাটা: যদি আমরা ব্যবহারকারীর দৃষ্টিকোণ থেকে দেখি - হ্যাঁ, বাস্তবায়ন (এবং কার্য সম্পাদন) দৃষ্টিকোণ থেকে সমস্ত ফাইল অনুলিপি করা হয়েছে - না, অনুলিপি সম্পর্কে কেবল একটি রেকর্ড যুক্ত করা হয়েছে।
maxim1000

@ ইজকাটা মন্তব্য করতে খুব বেশি - আমার উত্তর দেখুন।
gbjbaanb

6
@ ইজকাটা এসভিএন পয়েন্টার এবং রেফারেন্স তৈরি করে, এটি সমস্ত কিছু অনুলিপি করে না।
অ্যারন ম্যাকআইভার

2
একটি গীত শাখা না একটি কমিট, এটা ঠিক একটি রেফারেন্স এর একটি কমিট যে কাছাকাছি অন্যান্য করে অবাধে সরানো যাবে না। গিট রেপোকে কেবল কমিটের গাছ হিসাবে এবং শাখাগুলি নোটগুলির মতো শাখাগুলি বিবেচনা করুন যা সেই গাছের বিভিন্ন কমিটে অবাধে স্থানান্তরিত হতে পারে।
40XUserNotFound

5

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

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


5

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

গিটের শাখাগুলি মূলত একটি প্রতিশ্রুতিতে নির্দেশকারী লেবেল এবং সুতরাং উপরোক্ত সমস্যাগুলি এড়ানো।


1

"ফ্রি / সস্তার / ব্যয়বহুল" এর আরেকটি দিক হ'ল শাখা প্রশস্তকরণের নিম্ন প্রবাহের পরিণতিগুলি মোকাবেলায় বিকাশকারী সংস্থাগুলির ক্ষেত্রে কত ব্যয় হয়; অর্থাৎ শাখা থেকে পরিবর্তনগুলি মার্জ করার প্রক্রিয়া।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.