উত্স / হেড কীভাবে সেট হয়ে যায়?


144

উৎপাদিত রেফটিকে ট্র্যাক করার জন্য আমার একটি শাখা স্থাপন করা আছে। git checkout <branchname>সেই শাখায় স্যুইচ করে, এবং একটি git statusআমাকে দেখায় যে আমার শাখার উত্স থেকে কতদূর বা পিছনে রয়েছে, তবে আমি অবাক হয়েছি যে origin/HEADএখনও লক্ষ্য করে origin/master, এবং নাorigin/<branchname>

সুতরাং আমার প্রশ্নটি হল, কোন পরিস্থিতিতে উত্স / হেড সরানো হয়?

সম্পাদনা করুন:

উত্স / হেড কীভাবে সরানো যায় সে সম্পর্কে আমি উত্তরগুলির প্রশংসা করি , তবে আমার বাইরে এটি সুস্পষ্টভাবে বলার জন্য "জৈবিক" কী তা সরানো যায় সে সম্পর্কে আগ্রহী।

উদাহরণস্বরূপ, আমি যখন শাখাগুলি স্যুইচ করি তখন গিটটি আমি যে শাখায় যাচ্ছিলাম তা শিরোনাম পয়েন্ট করে তোলে, তাই আমি আশ্চর্য হয়েছি যে উত্স / হেড একই পদ্ধতিতে চলে না।


মনে রাখবেন যে এই প্রশ্নটি রিমোটগুলি সম্পর্কিত স্থানীয় প্রতীকী রেফারেন্স সম্পর্কে refs/origin/HEAD। এটি কীভাবে কোনও সংগ্রহস্থলের নিজস্ব প্রতীকী রেফারেন্স HEADসেট হয়ে যায় not
ক্লেক

উত্তর:


173

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

অরিজিনের হেড কেবল তখনই পরিবর্তন হবে যখন আপনি বা অন্য কেউ এটি রিমোট রিপোজিটরিতে বাস্তবে পরিবর্তন করেন , যা মূলত কখনই ঘটে না - আপনি স্থিতিশীল শাখায় (সম্ভবত মাস্টার) ডিফল্ট শাখা একটি সার্বজনীন রেপো স্থির থাকতে চান। উত্স / HEAD হ'ল স্থানীয় রেফ যে রিমোট রিপোজিটরিতে হেডের স্থানীয় কপির প্রতিনিধিত্ব করে। (এর পুরো নাম রেফস / রিমোটস / উত্স / হেড)

আমি মনে করি উপরোক্ত উত্তরগুলি যা আপনি আসলে জানতে চেয়েছিলেন, তবে আপনি এগিয়ে গিয়ে জিজ্ঞাসা করেছেন এমন প্রশ্নের উত্তর দেওয়ার জন্য ... আপনি যখন কোনও সংগ্রহশালা ক্লোন করেন তখন মূল / শিরোনাম স্বয়ংক্রিয়ভাবে সেট হয়ে যায়, এবং এটি সম্পর্কে এটি। উদ্ভট, যে এটি কমান্ড দ্বারা সেট করা হয়নিgit remote update - আমি বিশ্বাস করি এটির পরিবর্তনের একমাত্র উপায় হ'ল আপনি ম্যানুয়ালি এটিকে পরিবর্তন করেন। (পরিবর্তনের মাধ্যমে আমি একটি ভিন্ন শাখার দিকে ইঙ্গিত করছি; স্পষ্টত প্রতিশ্রুতিবদ্ধ যে এটি শাখাগুলি পরিবর্তিত হলে পরিবর্তনের দিকে ইঙ্গিত করে, যা আনতে / টানতে / রিমোট আপডেটে হতে পারে))


সম্পাদনা করুন : নীচে আলোচিত সমস্যাটি গিট 1.8.4.3 এ সংশোধন করা হয়েছে ; দেখতে এই আপডেটে


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

$ git remote show origin
* remote origin
  Fetch URL: ...
  Push  URL: ...
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    foo
    master

অদ্ভুতভাবে, যদিও হেডের মুদ্রণটির ধারণাটি এইভাবে মুছে ফেলা হবে যদি রিমোটে জিনিসগুলি পরিবর্তিত হয় (যেমন foo অপসারণ করা হয়), এটি আসলে আপডেট হয় না refs/remotes/origin/HEAD। এটি সত্যই অদ্ভুত পরিস্থিতিতে নিয়ে যেতে পারে। বলুন যে উপরের উদাহরণে উত্স / হেড প্রকৃতপক্ষে ফু-র দিকে ইঙ্গিত করেছিল এবং এরপরে উত্সের ফু শাখাটি সরানো হয়েছিল। আমরা তখন এটি করতে পারি:

$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
 x [deleted]         (none)     -> origin/foo
   (refs/remotes/origin/HEAD has become dangling)

যদিও রিমোট শো জানে যে হেড প্রধান, তবে এটি কোনও কিছুই আপডেট করে না। বাসি ফু শাখাটি সঠিকভাবে ছাঁটাই করা হয়েছে, এবং হেড ঝাঁকুনিতে পরিণত হয় (অস্তিত্বহীন শাখার দিকে ইঙ্গিত করে), এবং এটি এখনও মাস্টারকে নির্দেশ করার জন্য এটি আপডেট করে না। আপনি যদি এটি ঠিক করতে চান তবে ব্যবহার করুন git remote set-head origin -a, যা উপরের মতো স্বয়ংক্রিয়ভাবে উত্সের হেড নির্ধারণ করে এবং তারপরে যথাযথ দূরবর্তী শাখায় নির্দেশ করার জন্য প্রকৃতপক্ষে উত্স / হেড সেট করে।


@ জেফ্রমি দুর্দান্ত উত্তর! কেবল একটি মন্তব্য: আপনি লিখেছেন যে শিরোনাম একটি প্রতীকী রেফ, যা প্রতিশ্রুতিবদ্ধ না করে সরাসরি একটি শাখার দিকে ইঙ্গিত করে [...] , তবে সম্পূর্ণতার জন্য এটি "বিচ্ছিন্ন হেড রাষ্ট্র" উল্লেখযোগ্য হতে পারে।
jub0bs

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

এটি কমপক্ষে 5 বার পড়েছেন এবং এখনও এর কিছুটা বুঝতে পারেন না
krb686

7
git remote set-head origin -aআমার জন্য কাজটি করেছেন
শুজিটো

75

এটি আপনার স্থানীয় রেপোর মালিক হিসাবে আপনার সেটিংস। এটিকে এভাবে পরিবর্তন করুন:

git remote set-head origin some_branch

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

রিমোট সেট-হেডের জন্য ম্যানুয়াল এন্ট্রি এ সম্পর্কে কিছু ভাল তথ্য সরবরাহ করে।

সম্পাদনা: জোর দেওয়ার জন্য: আপনি এটিকে না বললে, কেবলমাত্র "সরানো" হবে মাস্টার শাখার নামকরণের মতো ঘটনা , যা আমি "জৈব" বলে মনে করি না। সুতরাং, আমি জৈবিকভাবে বলব এটি সরানো হয় না।


1
সম্পাদনার জোর এখানে পুরোপুরি সঠিক নয়। আপনি যদি কোনও স্থানীয় অনুলিপি থেকে মাস্টার ব্রাঞ্চে না থেকে ক্লোন করেন তবে এটি পরিবর্তন করতে পারে।
এমফায়ার

আমি কোনও ক্লোনটিকে "চলমান" হিসাবে বিবেচনা করি না, তবে আমি অনুমান করি যে আমরা এতে একমত হতে পারি না :)
eis

24

"অর্গানিকভাবে" উত্স / হেড সরানো কী?

  • git clone এটিকে একবার যেখানে স্পর্শ করা হয়েছে সেখানেই এটি সেট করে
    • এটি ক্লোনিংয়ের পরে চেকআউট করার জন্য এটি ডিফল্ট শাখা হিসাবে কাজ করে git clone

উত্স থেকে মাথা কি উপস্থাপন করে?

  • খালি সংগ্রহস্থলগুলিতে (প্রায়শই "সার্ভারগুলিতে" সংগ্রহস্থল) এটি ডিফল্ট শাখার জন্য চিহ্নিতকারী হিসাবে কাজ করে, কারণ git cloneএটি এ জাতীয় উপায়ে ব্যবহার করে
  • নন-বেয়ার স্টোরগুলিতে (স্থানীয় বা দূরবর্তী), এটি সংগ্রহস্থলের বর্তমান চেকআউট প্রতিফলিত করে

উত্স / হেড সেট করে?

  • git clone এনে সেট করে
  • এটি git fetchঅন্য কোনও রেফারেন্সের মতো আপডেট হলে তা বোধগম্য হবে, তবে তা তা নয়
  • git remote set-head origin -a এনে সেট করে
    • দূরবর্তীটিকে "ডিফল্ট শাখা" বিবেচনা করে স্থানীয় জ্ঞান আপডেট করতে দরকারী

তুচ্ছ বস্তু

  • origin/HEAD রিমোটের সাথে যোগাযোগ না করে অন্য কোনও মানতেও সেট করা যেতে পারে: git remote set-head origin <branch>
    • আমি এটির জন্য পরীক্ষার ব্যতীত কোনও ব্যবহারের ক্ষেত্রে দেখতে পাচ্ছি না
  • দুর্ভাগ্যক্রমে কিছুই রিমোটে হেড সেট করতে সক্ষম নয়
  • গিটের পুরানো সংস্করণগুলি জানতে পারে না যে কোন শাখা শিরোনামটি রিমোটের দিকে নির্দেশ করে, যা কেবল শেষ পর্যন্ত হ্যাশ করে থাকে: সুতরাং এটি কেবল আশা করে একই শাখার দিকে নির্দেশ করে একটি শাখার নাম বেছে নিয়েছে

আমি এর উল্লেখ হারিয়ে ফেলেছিলাম origin/HEADএবং আপনার সমাধানটি সহায়তা করেছে। ধন্যবাদ!
java_dude

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

@ মিচাওয়েডেনম্যান কেন স্থানীয়ভাবে কনফিগার করা শর্টকাট হবে? স্থানীয়ভাবে কনফিগার করা শর্টকাট origin/HEADএকটি খারাপ নাম। এবং এটি git cloneএকটি "স্থানীয়ভাবে কনফিগার করা শাখা" এর সাথে ডিফল্ট হিসাবে একটি দূরবর্তী নাম ব্যবহার করে যা এটিরও দ্বন্দ্ব করে। নন-বেয়ার স্টোরগুলিতে এটি রিমোটের বর্তমান ব্যবহার করাও বোধগম্য নয় HEAD
রবার্ট সিমার

10

দাবি অস্বীকার : এটি জেফ্রমি'র উত্তরের একটি আপডেট , যা আমি আগ্রহীদের কিছুটা সময় বাঁচাতে লিখছি।

remote HEAD is ambiguousজেফ্রোমি তার উত্তরে যে বার্তাটি উল্লেখ করেছে আমি তার প্রতিলিপি তৈরি করতে ব্যর্থ চেষ্টা করেছি (গিট ২.০.১ এ ) ; তাই আমি কিছুটা খনন করেছি ( https://github.com/git/git ক্লোন করে এবং লগটি অনুসন্ধান করে)। এটা যে ব্যবহৃত হত

Determining HEAD is ambiguous since it is done by comparing SHA1s.

In the case of multiple matches we return refs/heads/master if it
matches, else we return the first match we encounter. builtin-remote
needs all matches returned to it, so add a flag for it to request such.

( 4229f1fa325870d6b24fe2a4c7d2ed5f14c6f77127 ফেব্রুয়ারী, 2009 তারিখে প্রতিশ্রুতিবদ্ধ , এর সাথে পাওয়া গেছেgit log --reverse --grep="HEAD is ambiguous" )

যাইহোক, প্রশ্নে অস্পষ্টতাটি তখন থেকে সরিয়ে নেওয়া হয়েছে :

One long-standing flaw in the pack transfer protocol used by "git
clone" was that there was no way to tell the other end which branch
"HEAD" points at, and the receiving end needed to guess.  A new
capability has been defined in the pack protocol to convey this
information so that cloning from a repository with more than one
branches pointing at the same commit where the HEAD is at now
reliably sets the initial branch in the resulting repository.

(প্রতিশ্রুতিবদ্ধ 9196a2f8bd46d36a285bdfa03b4540ed3f01f671, 8 ই নভেম্বর, 2013 এর সাথে পাওয়া গেছে git log --grep="ambiguous" --grep="HEAD" --all-match)

সম্পাদনা ( টোরকে ধন্যবাদ ):

$ git name-rev --name-only 9196a2f8bd46d36a285bdfa03b4540ed3f01f671
tags/v1.8.4.3~3

এর অর্থ হ'ল, আপনি যদি গিট ভি 1.8.4.3 বা তার পরে ব্যবহার করছেন তবে আপনার কোনও দ্ব্যর্থহীন-রিমোট-হেড সমস্যাটি চলবে না।


1
গিট উত্সে থাকা ট্যাগগুলির উপর ভিত্তি করে, এই ফিক্সটি গিট সংস্করণে 1.8.4.3 এবং এর পরে প্রয়োগ হয়।
টেরিক

@ রবার্টসিমার আমি নিশ্চিত নই, তবে হ্যাঁ, আমিও তাই মনে করি।
jub0bs

8

মনে রাখবেন এখানে দুটি স্বতন্ত্র গিট রেপো রয়েছে যার বিষয়ে আমরা কথা বলছি। আপনার কোড সহ আপনার স্থানীয় রেপো এবং অন্য কোথাও রিমোট চলছে।

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

আপনার কম্পিউটারের (স্থানীয় রেপো) দূরবর্তী গিট রেপোতে হেড পয়েন্টার পরিবর্তন করার কোনও ব্যবসা নেই। উদাহরণস্বরূপ এটি অন্য কোনও বিকাশকারী দ্বারা মালিকানা পেতে পারে।

আরও একটি বিষয়, আপনার কম্পিউটারটি মূল / XXX কে কী বলেছে তা হ'ল শেষ আনার সময় আপনার কম্পিউটারের দূরবর্তী অবস্থান সম্পর্কে বোঝা।

সুতরাং কি "জৈবিকভাবে" উত্স / হেড আপডেট করবে? এটি দূরবর্তী গিট রেপোতে ক্রিয়াকলাপ হবে। আপনার স্থানীয় রেপো নয়।

জনগণ উল্লেখ করেছেন

গিট সিম্বলিক-রেফ হেড রেফস / হেড / আমার_অর্থ_ব্রাঞ্চ

সাধারণত, যখন কোনও টিম ডেভলপমেন্ট টিমের ব্যবহারের জন্য কোনও সার্ভারে একটি ভাগ করা সেন্ট্রাল গিট রেপো থাকে তখন তা ব্যবহৃত হয়। এটি দূরবর্তী কম্পিউটারে চালিত একটি আদেশ হবে be আপনি এটিকে দূরবর্তী গিট রেপোতে ক্রিয়াকলাপ হিসাবে দেখতে পাবেন।


1
দুঃখিত, আমি যদি একটু পুনরাবৃত্তি করি আমি কেবল এই সত্যটি উল্লেখ করতে চাই যে গিটটি একটি বিতরণযোগ্য সংস্করণ নিয়ন্ত্রণ ব্যবস্থা এবং যেমন দুটি রেপো স্বাধীন।
পাবলো মাউরিন

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