গিটে হেড কি?


232

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

হেড কী, আমি এটি দিয়ে কী করতে পারি এবং আমার কোন ভুল এড়ানো উচিত?



1
গীত v1.8.4 থেকে শুরু করে ব্যবহারের জন্য নিচের সব উত্তর HEADবা headএখন ব্যবহার করতে পারেন @স্থানে HEADপরিবর্তে। আপনি কেন এটি করতে পারেন তা জানতে এই উত্তরটি (শেষ বিভাগ) দেখুন ।

3
গিট-স্কেম থেকে : গিটের শিরোনাম হ'ল বর্তমান শাখা রেফারেন্সের পয়েন্টার, যা আপনার করা শেষ প্রতিশ্রুতি বা আপনার কার্যনির্বাহী ডিরেক্টরিতে চেক আউট করা সর্বশেষ প্রতিশ্রুতির দিকে নির্দেশক। এর অর্থ হ'ল এটি আপনার পরবর্তী প্রতিশ্রুতির পিতা-মাতা হবেন। এটিকে হেড হিসাবে মনে করা আপনার পক্ষে সর্বশেষতম প্রতিশ্রুতির স্ন্যাপশট generally
কাজী ইরফান

উত্তর:


185

হেড বর্তমানে চেক আউট শাখায় সর্বশেষ প্রতিশ্রুতিবদ্ধতার একটি উল্লেখ reference


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


1
তাহলে আপনার দুটি মাথা থাকতে পারে কেন?
ই-সন্তুষ্ট

1
@ ই-সন্তুষ্ট: কখনও কখনও আপনি শাখাগুলি প্রধান হিসাবে উল্লেখ করা দেখতে পাবেন - সেগুলিতে সঞ্চিত থাকে refs/heads। লোয়ার-কেস হেড HEADযদিও থেকে আলাদা is আমার উত্তর এটি কিছুটা স্পষ্ট করে।
ক্যাসাবেল

7
@ ই-সন্তুষ্ট: এটি রেজেক্স নয়। ^যে বর্তমান এক আগে কমিট - জন্য "আগে কমিট" শুধু Git এর স্বরলিপি হয়। (যদি বর্তমানটি মার্জ হয় তবে এটি প্রথম পিতামাতার ব্যবহার করে))
ক্যাসাবেল ২

1
@ ই-সন্তুষ্ট: কমিটগুলি নির্দিষ্ট করার সমস্ত উপায় সম্পর্কে আরও তথ্যের জন্য গিট-রেভ-তালিকার জন্য ম্যান পৃষ্ঠার সুনির্দিষ্ট সংশোধনী বিভাগটি দেখুন - এটি কেবল একটি ছোট্ট অংশ piece kernel.org/pub/software/scm/git/docs/…
ক্যাসাবেল

1
না, যখন রেভ এবং হেড একই অঙ্গীকারের দিকে ইঙ্গিত করছে, কোনও পার্থক্য নেই। এমনকি আপনি রেভ বা হেডের পরিবর্তে কমিট আইডি (SHA-1 মান) লিখতে পারেন। এবং উদ্বিগ্ন হবেন না, আপনি আমাদের প্রশ্নগুলি দ্বারা উত্ত্যক্ত করবেন না :) (আমাকে কমপক্ষে: পি)
po

87

HEAD বর্তমানে চেক আউট করা কমিটের একটি রেফ (রেফারেন্স)।

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

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

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


6
এটি এমন কিছু যা আমি বুঝতে পারি না। যদি আপনি একটি দূরবর্তী শাখা চেকআউট করেন তবে আপনি কেন "বিচ্ছিন্ন হেড" দিয়ে শেষ করবেন। আপনি কেন আপনার রিমোটের সাথে মিলে আপনার স্থানীয় রেপোতে শাখাটিতে স্বয়ংক্রিয়ভাবে লাফ দেবেন না?
ই-সন্তুষ্ট

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

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

3
@ ই-সন্তুষ্ট: সাধারণ উত্তরটি হ'ল git rebase <branch> HEAD। এটি সর্বশেষ সাধারণ পূর্বপুরুষ <branch>এবং এর সন্ধান করবে HEADএবং তারপরে সেখান থেকে সমস্ত HEADকমান্ড করবে এবং সেগুলি প্রয়োগ করবে (তাদের পুনর্বাসিত করবে) <branch>। এটি প্যাচ হিসাবে প্রয়োগ করে এটি মূলত এটি করে, সুতরাং যদি দুটি শাখা সত্যিই আলাদা হয় তবে বিবাদ হতে পারে। তবে যদি <branch>কোনও পূর্বপুরুষ হয় HEAD(যেমন আপনি সঠিক জায়গায় ছিলেন, ভুলে গিয়েছিলেন যে আপনি বিচ্ছিন্ন হয়ে যাবেন HEAD) তবে রিবেসটি কেবলমাত্র একটি দ্রুত এগিয়ে ফেলা মার্জ।
ক্যাসাবেল

3
এটি গিট হেডের সর্বাধিক স্পষ্ট এবং নির্ভুল বিবরণ যা আমি দেখেছি, কিছুক্ষণ অনুসন্ধানের পরে।
LarsH

21

আমি সর্বদা ভেবেছিলাম HEAD~55 এর আগে কমিট করা উচিত। তবে এটি কমান্ডের জিও অংশ বহন করে না। এটি শুধুমাত্র কমান্ডের অংশ / 'কোথায়' রেফারেন্স বহন করে ।

সাধারণ পদে এটির প্রশ্নের উত্তর দিতে ব্যবহার করা হয়: আমার কোথায় যাওয়া উচিত? কোন প্রতিশ্রুতি?

  • HEAD এর অর্থ (বর্তমানের প্রতিশ্রুতি) commit
  • HEAD~1 মানে (রেফারেন্স) 1 কমিট আগে
  • HEAD~ ALSO এর অর্থ (রেফারেন্স) 1 কমিট করার আগে
  • HEAD~87 এর অর্থ (এর রেফারেন্স) 87 আগে কমিট করে

ব্যবহার:

  • git checkout HEAD~1 আসলে 1 টি প্রতিশ্রুতি / রেফারেন্সে GO / চেকআউট হবে
  • git reset HEAD~3 আপনার সর্বশেষ 3 টি কমিটকে অস্বীকার করবে - পরিবর্তনগুলি সরিয়ে না ফেলে, অর্থাৎ আপনি শেষ 3 টি করা সমস্ত পরিবর্তন একসাথে দেখতে পাবেন, আপনার পছন্দ না হওয়া বা এতে যুক্ত হওয়া কোনও কিছু সরিয়ে ফেলুন এবং তারপরে সেগুলি আবারও প্রতিশ্রুতিবদ্ধ।
  • git reset --hard HEAD~3আপনার শেষ প্রতিশ্রুতি অস্বীকার করবে এবং তাদের পরিবর্তনগুলি সরিয়ে দেবে । এটি সম্পূর্ণরূপে এই পরিবর্তনগুলি সরিয়ে ফেলবে। আরো জানার জন্য দেখুন এখানে
  • git diff HEAD~3 সর্বশেষ 3 টি কমিটের পরিবর্তনগুলি পরীক্ষা করার জন্য

3
আমার নিজের জবাব ফিরে আসছে :)
মধু

15

গিটে হেড পয়েন্টার

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

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

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

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


0

সহজ কথায়, বর্তমানে চেক-আউট শাখায় শেষ প্রতিশ্রুতিবদ্ধতার একটি উল্লেখ হ'ল হেড।

হেডকে "বর্তমান শাখা" হিসাবে ভাবুন। যখন আপনি গিট চেকআউট দিয়ে শাখাগুলি স্যুইচ করেন, তখন হেড সংশোধনগুলি নতুন শাখার ডগায় নির্দেশ করতে পরিবর্তিত হয়।

আপনি কি করিয়া হেড ইঙ্গিত করিয়া দেখিতে পারেন:

cat .git/HEAD

হেডের পক্ষে কোনও নির্দিষ্ট সংশোধনী উল্লেখ করা সম্ভব যা কোনও শাখার নামের সাথে সম্পর্কিত নয়। এই পরিস্থিতিতে একটি বিচ্ছিন্ন হেড বলা হয়।

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