গিটে হেড, ওয়ার্কিং ট্রি এবং ইনডেক্সের মধ্যে পার্থক্য কী?


486

কেউ কি আমাকে গিটের হেড, ওয়ার্কিং ট্রি এবং ইনডেক্সের মধ্যে পার্থক্য বলতে পারে?

আমি যা বুঝতে পারি তা থেকে এগুলি সমস্ত শাখার নাম। আমার ধারণা সঠিক?


সম্পাদন করা

আমি এটি খুঁজে পেয়েছি

একটি একক গিট সংগ্রহস্থল একটি নির্বিচার সংখ্যক শাখাকে ট্র্যাক করতে পারে তবে আপনার কার্যনির্বাহী গাছ তাদের মধ্যে একটির ("বর্তমান" বা "চেক আউট" শাখা) এর সাথে জড়িত এবং হেডটি সেই শাখার দিকে নির্দেশ করে।

এর অর্থ কি এই যে হেড এবং কার্যক্ষম গাছ সবসময় একই থাকে?


26
আপনার সম্পাদনা সম্মানের সাথে: একেবারে না। HEADবর্তমান শাখার ডগায় কমিট করা। আপনি যদি কেবল শাখাটি পরীক্ষা করে দেখেছেন, অর্থাত্ কোনও সংশোধিত ফাইল নেই, তবে এর বিষয়বস্তু কার্যকারী গাছের সাথে মিলে। আপনি যে কোনও কিছু সংশোধন করার সাথে সাথে এটি আর মেলে না।
ক্যাসাবেল

6
আমার মনে হয় আপনার এটি পড়তে হবে: চিন্তা- পছন্দ-a-git.net
আন্দ্রেজ দুś

5
আমিও Staging Areaসেই তালিকায় একটি যুক্ত করব । কি HEAD, Working Tree, IndexএবংStaging Area
সবুজ

2
@ জেফ্রোমির শেষ বাক্যটি আরও স্পষ্ট হবে:> আপনি যে কোনও কিছু সংশোধন করার সাথে সাথে, কাজ করা গাছ আর সেই
শিরোনামের সাথে

3
ভবিষ্যতে এগুলি পড়ার জন্য এই উত্তরগুলির সত্যিকার অর্থে কিছুটা বোঝার সর্বোত্তম উপায় হ'ল যা চলছে তা দেখার এবং অনুভূতি এবং দৃষ্টিভঙ্গি করে তোলা: এই গিটারটি
বিকেএসপুরগন

উত্তর:


577

এই বিষয়গুলি সম্পর্কে আরও কয়েকটি ভাল রেফারেন্স:

বিকল্প পাঠ

আমি সূচিটি চেকপয়েন্ট হিসাবে ব্যবহার করি ।

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

মন্তব্য:

  1. কর্মক্ষেত্র (উৎস) এর তালিকা গাছ ফাইল যেগুলি আপনি দেখতে এবং সম্পাদনা করুন।

  2. সূচক একটি একক, বড়, বাইনারি ফাইল <baseOfRepo>/.git/index, যা বর্তমান শাখায় সমস্ত ফাইল, তাদের তালিকা SHA1 চেকসাম, সময় স্ট্যাম্প এবং ফাইল নাম - এটা ফাইল একটি কপি সঙ্গে অন্য ডাইরেক্টরি নয়।

  3. স্থানীয় সংগ্রহস্থলে একটি লুকানো ডিরেক্টরি (হয় .git) একজন সহ objectsডিরেক্টরির একটি সংকুচিত "ফোঁটা" ফাইল হিসাবে রেপো প্রতিটি ফাইল এর সব সংস্করণ (স্থানীয় শাখা এবং দূরবর্তী শাখা কপি) অংশগ্রহণ করেন।

রেপো ফাইলগুলির পৃথক অনুলিপি হিসাবে চিত্রটিতে উপস্থাপিত চারটি 'ডিস্ক' ভাবেন না।

বিকল্প পাঠ

এগুলি মূলত গিট কমিটের জন্য রেফারেন্স হিসাবে নামকরণ করা হয়। দুটি বড় ধরণের রেফ রয়েছে: ট্যাগ এবং হেড।

  • ট্যাগগুলি নির্দিষ্ট রেফারেন্স যা ইতিহাসের একটি নির্দিষ্ট পয়েন্ট চিহ্নিত করে, উদাহরণস্বরূপ v2.6.29।
  • বিপরীতে, মাথা বরাবর প্রকল্প বিকাশের বর্তমান অবস্থান প্রতিফলিত করতে সর্বদা সরানো হয়।

বিকল্প পাঠ

(দ্রষ্টব্য: টিমো হুভিনেনের মন্তব্য অনুসারে , সেই তীরগুলি যেটি প্রতিশ্রুতিবদ্ধ তা নয়, এটি কার্যপ্রবাহের ক্রম , মূলত প্রথমটি প্রতিশ্রুতিবদ্ধ এবং শেষটি কোথায় তা ती চিহ্ন দেখায় )1 -> 2 -> 3 -> 414

এখন আমরা জানি প্রকল্পে কী হচ্ছে।
তবে এখনই কী ঘটছে তা জানতে, এই মুহুর্তে হ্যাড নামে একটি বিশেষ রেফারেন্স রয়েছে। এটি দুটি প্রধান উদ্দেশ্যে কাজ করে:

  • এটি গিটকে বলেছে যে আপনি যখন চেকআউট করবেন তখন থেকে ফাইলগুলি নিয়ে যাওয়ার প্রতিশ্রুতি দেয় এবং
  • এটি গিটকে বলে যে আপনি যখন প্রতিশ্রুতিবদ্ধ তখন নতুন কমিটগুলি কোথায় রাখবেন।

আপনি যখন git checkout refএটি চালনা করেন তখন আপনার HEADমনোনীত রেফের দিকে ইঙ্গিত করে এবং এ থেকে ফাইলগুলি বের করে। আপনি যখন git commitএটি চালান এটি একটি নতুন কমিট অবজেক্ট তৈরি করে, যা কারেন্টের সন্তানের হয়ে ওঠে HEAD। সাধারণত HEADএকটি মাথা দেখায়, তাই সবকিছু ঠিকঠাক কাজ করে।

বিকল্প পাঠ


20
অনেক সময় গিট সম্পর্কে পড়ার পরে আমি কখনই এটি পুরোপুরি বুঝতে পারি না আমি সত্যিই হতাশ হয়ে পড়েছি আমি এফ শব্দটি ব্যবহার করতে চাই; কিন্তু আমি সম্প্রদায়! আপনি মাথা উল্লেখ করেছেন তবে উপরের চিত্রগুলিতে সর্বদা একক শিরোনাম থাকে যেখানে বাকি চ ** এনজি হেড থাকে? "সাধারনত হেড একটি শিরোনামকে নির্দেশ করে, তাই সবকিছু ঠিকঠাক কাজ করে।" আমি আপনাকে এটি অনুরোধ করতে অনুরোধ করছি, statementর বিবৃতি।
নেকটিভি

12
@neckTwi মাথা বর্তমান কমিট আপনি (সাথে কাজ করেন, stackoverflow.com/a/964927/6309 )। এটি সাধারণত "শাখা প্রধান" এর মধ্যে একটি (শাখাগুলি দ্বারা বর্ণিত কমিটগুলির মধ্যে একটি, যা বলা শাখাগুলির উপস্থাপন করে )। তবে আপনি যে কোনও প্রতিশ্রুতি চেকআউট করতে পারেন (এবং কাজ করতে পারেন)। : আপনি চেকআউট একটি কমিট যা (শাখা) মাথা এক না হয়, আপনি একটি "বিচ্ছিন্ন মাথা" মোডে আছেন stackoverflow.com/a/3965714/6309
VonC

1
@ ইম্রে আমি সম্মতি জানাই, তবে 5 বছর আগে এই ছবিগুলি আমি খুঁজে পেয়েছি ( hades.name/blog/2010/01/28/… )
ভোনসি

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

1
@ পিট আমি সম্মত। ক্যাশে এবং সূচক মধ্যে পার্থক্য আরো জানার জন্য, আমার অন্যান্য উত্তর দেখার stackoverflow.com/a/6718135/6309
VonC

136

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

এই অধ্যায়টি থেকে চিত্রটি এখানে তুলে ধরা হচ্ছে:

স্থানীয় অপারেশনস - ওয়ার্কিং ডিরেক্টরি বনাম স্টেজিং এরিয়া (ইনডেক্স) বনাম গিট রিপোজিটরি (হেড)

উপরের চিত্রটিতে "ওয়ার্কিং ডিরেক্টরী" "ওয়ার্কিং ট্রি" এর সমান, "স্টেজিং এরিয়া" গিট "ইনডেক্স" এর একটি বিকল্প নাম, এবং বর্তমানে চেক আউট ব্রাঞ্চকে এইচএইডি পয়েন্ট দেয়, যা সর্বশেষে প্রতিশ্রুতি দেওয়ার জন্য নির্দেশ দেয় " গিট ডিরেক্টরি (সংগ্রহশালা) "

মনে রাখবেন যে git commit -a পরিবর্তনের মঞ্চ হবে এবং এক পদক্ষেপে প্রতিশ্রুতিবদ্ধ।


1
"একটি ছবি হাজার শব্দের সমান". ধন্যবাদ জাকুব .. এবং লিঙ্কটির জন্য ধন্যবাদ।
জয়েস বাবু

5
দ্রষ্টব্য: আজকাল working treeপছন্দ হয় বলে মনে working directoryহয়। Github.com/git/git/commit/…
ভোনসি

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

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

@ বিনারাস: এই জাতীয় চিত্রের পাইকারি প্রজননে বিপদটি হ'ল এটি কোনও লেখক / বইয়ের দ্বারা তৈরি "ভুল উপস্থাপনা" প্রচার করার কাজ করে। আমি মনে করি এটি এখানে আক্ষরিক বনাম কার্যকরী ব্যাখ্যার কেস: আক্ষরিক অর্থে, সূচকটি আসলে রেপোতে অন্তর্ভুক্ত থাকে যদি আপনি রেজিও .git ফোল্ডারের অধীনে সমস্ত কিছু সংজ্ঞায়িত করেন। কার্যকরী অর্থে, তবে সূচকটি গিটকে রেপোতে ডিএজি বজায় রাখতে সহায়তা করে এবং এর বাহ্যিক বলে মনে করা যেতে পারে।
জাজিমভ

64

আপনার কার্যনির্বাহী গাছটি বর্তমানে আপনি যে ফাইলগুলিতে কাজ করছেন তা আসলে।

HEADশাখার নির্দেশক বা প্রতিশ্রুতিবদ্ধ যে আপনি সর্বশেষে পরীক্ষা করে দেখেছেন, এবং এটি তৈরির ক্ষেত্রে কোন নতুন প্রতিশ্রুতির পিতামাতা হবেন। উদাহরণস্বরূপ, আপনি যদি masterশাখায় রয়েছেন তবে তারপরে HEADনির্দেশ করবে masterএবং আপনি যখন প্রতিশ্রুতিবদ্ধ হবেন তখন সেই নতুন অঙ্গীকারটি সংশোধন করে যে সংশোধন করেছে তার বংশধর হবে masterএবংmaster বিন্দু থেকে আপডেট করা হবে নতুন কমিট।

সূচক একটি উপস্থাপনকারী এলাকা যেখানে নতুন কমিট প্রস্তুত হয়। মূলত, সূচির বিষয়বস্তু হ'ল নতুন প্রতিশ্রুতিতে যা যা হবে (যদিও আপনি যদি git commit -aএটি করেন তবে এটি স্বয়ংক্রিয়ভাবে ফাইলে সমস্ত পরিবর্তন যুক্ত করবে যা গিট কমিট করার আগে সূচক সম্পর্কে জেনে থাকে, সুতরাং এটি আপনার কার্যকারী গাছের বর্তমান বিষয়বস্তুগুলি সম্পাদন করবে )। git addআপনার সূচকগুলিতে কার্যকারী ট্রি থেকে ফাইলগুলি যুক্ত বা আপডেট করবে।


ব্রায়ান ব্যাখ্যার জন্য অনেক ধন্যবাদ। সুতরাং, কার্যক্ষম গাছটিতে সমস্ত আপত্তিহীন পরিবর্তন রয়েছে। আমি যদি গিট কমিট-এ দিয়ে আমার পরিবর্তনগুলি সম্পাদন করি তবে সেই নির্দিষ্ট সময়ে আমার কার্যকরী বৃক্ষ এবং সূচি এক হবে। আমি যখন আমার কেন্দ্রীয় রেপোতে চাপ দেই তখন তিনটিই একই হবে। আমি কি সঠিক?
জয়েস বাবু

3
পছন্দ করেছেন আপনার কার্যক্ষেত্রের গাছে এমন ফাইল থাকতে পারে যার সম্পর্কে গিট জানে না এবং সেগুলি নিয়ে প্রতিশ্রুতিবদ্ধ হবে না git commit -a(আপনার এগুলি যুক্ত করতে হবে git add), সুতরাং আপনার কার্যকারী ট্রিতে অতিরিক্ত সূচি থাকতে পারে যা আপনার সূচক, আপনার স্থানীয় রেপো, বা আপনার দূরবর্তী রেপো নেই।
ব্রায়ান ক্যাম্পবেল

2
@ বিনোদ: কার্যনির্বাহী গাছ এবং সূচক বিনা প্রতিশ্রুতি ছাড়াই একই হয়ে উঠতে পারে (গিটটি কার্যকারী বৃক্ষ থেকে সূচি আপডেট করে এবং গিট চেকআউট <সূচি> সূচক থেকে কার্যকারী ট্রি আপডেট করে)। HEADঅতি সাম্প্রতিক প্রতিশ্রুতি বোঝায়, সুতরাং যখন আপনি প্রতিশ্রুতিবদ্ধ হন, আপনি HEADআপনার নতুন প্রতিশ্রুতিতে আপডেট হচ্ছেন যা সূচকের সাথে মেলে matches পুশ করার সাথে এর তেমন কিছু করার নেই - এটি আপনার স্থানীয় রেপোতে দূরবর্তী ম্যাচের শাখাগুলিতে শাখা করে।
ক্যাসাবেল

45

কাজের গাছ

আপনার কার্যকারী গাছটি বর্তমানে আপনি যে ফাইলগুলিতে কাজ করছেন তা।

গিট সূচক

  • গিট "সূচক" হ'ল যেখানে আপনি ফাইলগুলি গিট সংগ্রহস্থলের কাছে প্রতিশ্রুতিবদ্ধ রাখতে চান।

  • সূচকটি ক্যাশে , ডিরেক্টরি ক্যাশে , বর্তমান ডিরেক্টরি ক্যাশে নামে পরিচিত , মঞ্চ অঞ্চল , মঞ্চযুক্ত ফাইল

  • গিট সংগ্রহস্থলগুলিতে ফাইলগুলি "প্রতিশ্রুতিবদ্ধ" (চেকইন) করার আগে আপনাকে প্রথমে গিট "সূচক" এ ফাইলগুলি স্থাপন করতে হবে।

  • সূচকটি হয় না পরিশ্রমী ডিরেক্টরি: আপনি এই ধরনের একটি কমান্ড টাইপ করতে পারেন git status, এবং Git আপনাকে বলতে হবে আপনার কাজ ডিরেক্টরির মধ্যে ফাইল Git সূচক যোগ করা হয়েছে (উদাহরণস্বরূপ, ব্যবহার করে git add filenameকমান্ড)।

  • সূচকটি গিট সংগ্রহস্থল নয়: গিট সূচীতে ফাইলগুলি এমন ফাইল যা আপনি গিট কমিট কমান্ড ব্যবহার করলে গিট গিট সংগ্রহস্থলের কাছে প্রতিশ্রুতিবদ্ধ।


1
নোট করুন যে গিট 2.5 একাধিক কার্যকারী গাছ আনবে ( স্ট্যাকওভারফ্লো . com / a / 30185564 / 6309 )। +1
ভোনসি

3
আমি নিশ্চিত নই যে "সূচকটি কার্যনির্বাহী ডিরেক্টরি নয়" 100% সঠিক। এটি "সূচকটি কার্যনির্বাহী ডিরেক্টরি নয়, তবে এতে সম্পূর্ণ কার্যনির্বাহী ডিরেক্টরি + আপনি পরবর্তী প্রতিশ্রুতিবদ্ধ হতে চান এমন পরিবর্তনগুলি অন্তর্ভুক্ত করা উচিত" should প্রুফ? reset --hard HEADআপনার সূচকটি == আপনার কার্যনির্বাহী গাছ তা নিশ্চিত করতে একটি গিটের ভাণ্ডারে যান । তারপরে: mkdir history && git checkout-index --prefix history/ -aফলাফলটি আপনার history/ডিরেক্টরিতে আপনার সম্পূর্ণ কার্যকারী গাছের নকল । এর গিট ইনডেক্স> = গিট ওয়ার্কিং ডিরেক্টরি
অ্যাডাম কুরকিউইজ

3
সূচকটি কার্যনির্বাহী ডিরেক্টরি নয় এবং কার্যকারী ডিরেক্টরিটি অন্তর্ভুক্ত করতে হবে না। সূচকটি গিট সংগ্রহস্থলের মধ্যে কেবলমাত্র একটি ফাইল যা আপনার প্রতিশ্রুতিবদ্ধ করতে চান তা তথ্য সঞ্চয় করে।
বুন

3
"" সূচক "কার্যকারী গাছের সামগ্রীর একটি স্ন্যাপশট ধারণ করে, এবং এটিই এই স্ন্যাপশটটি পরবর্তী প্রতিশ্রুতিগুলির বিষয়বস্তু হিসাবে নেওয়া হয় Thus সুতরাং কার্যকরী ডিরেক্টরিতে কোনও পরিবর্তন করার পরে, এবং কমিট কমান্ড চালানোর আগে, আপনি "( git-scm.com/docs/git-add ) ইনডেক্সে কোনও নতুন বা পরিবর্তিত ফাইল যুক্ত করতে অ্যাড কমান্ডটি অবশ্যই ব্যবহার করতে হবে
অ্যান্থ

3
@AdamKurkiewicz: প্রমাণ বিফল হয় আপনাকে প্রথমে echo untracked-data > untracked-file, আগে অথবা পরে git reset --HARDএবং git checkout-indexধাপ। আপনি দেখতে পাবেন যে untracked ফাইল না মধ্যে historyডিরেক্টরি। আপনি সূচক এবং কার্য-গাছ উভয়কেই স্বাধীনভাবে সংশোধন করতে পারেন, যদিও প্রথম কার্য-বৃক্ষকে স্পর্শ না করে সূচি পরিবর্তন করা শক্ত (ব্যবহারের প্রয়োজন git update-index --index-info)।
torek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.