আমার গিট রেপো কেন বিচ্ছিন্ন হেড অবস্থায় প্রবেশ করেছিল?


386

আমি আজ একটি বিচ্ছিন্ন মাথা দিয়ে শেষ করেছি, বর্ণিত একই সমস্যা: গিট পুশ আমার স্থানীয় পরিবর্তনগুলি সত্ত্বেও সবকিছু আপ টু ডেট বলে

আমি যতদূর জানি আমি সাধারণের বাইরে কিছু করি নি, কেবল স্থানীয় রেপো থেকে প্রতিশ্রুতিবদ্ধ এবং পুশ করি।

তাহলে আমি কীভাবে শেষ করলাম detached HEAD?


18
একটি দুর্গম শাখা পরীক্ষা করে দেখা হচ্ছে দুর্ঘটনাক্রমে এটি করার সবচেয়ে সাধারণ উপায়; আর একটি সাধারণ উপায় হল চেক আউট করা branch-name@{n}, এর নবম পূর্ববর্তী অবস্থান branch-name। তবে যাই হোক না কেন, এক পর্যায়ে অবশ্যই একটি হয়েছে git checkout <rev>। যদি এটি কোনও ঘণ্টা বাজায় না, তবে সম্ভবত আপনি যা করেছেন উল্লেখ করেছেন - যা করার চেষ্টা করেছেন git checkout <file>এবং দুর্ঘটনার দ্বারা একটি সংশোধন নির্দিষ্ট করতে সক্ষম হয়েছেন।
ক্যাসাবেল

3
বিচ্ছিন্ন হেডের অবস্থা পূর্বাবস্থায় ফেলার জন্য একটি গিট বিচ্ছিন্ন মাথা ঠিক করুন?

আমার রেপো এই অবস্থায় শেষ হয়েছিল যখন রিবেসিংয়ের সময় সংঘাতের মুখোমুখি হয়েছিল। ভাগ্যক্রমে গিট আমাকে জানিয়েছিল আমি দৌড়ানোর সময় কী করতে হবে git status:all conflicts fixed: run "git rebase --continue"
পল

2
আপনি ঘটনাক্রমে বা এর git checkout remotes/origin/my-branchপরিবর্তে টাইপ করলেও ঘটে । git checkout my-branchgit checkout origin/my-branch
অ্যাডাম Libuša

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

উত্তর:


280

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

একটি বিচ্ছিন্ন হেড সঙ্গে প্রতিশ্রুতিবদ্ধ দেখুন

যখন হেডকে আলাদা করা হয়, নামকরণ করা কোনও শাখা আপডেট না করা বাদে স্বাভাবিকের মতো কাজ করে। (আপনি এটি অনামী শাখা হিসাবে ভাবতে পারেন think)

বিকল্প পাঠ

উদাহরণস্বরূপ, আপনি যদি প্রথমে এটির সন্ধান ছাড়াই কোনও "রিমোট ব্রাঞ্চ" চেকআউট করেন তবে আপনি একটি আলাদা হেড দিয়ে শেষ করতে পারেন।

গিট দেখুন : মাথা বিচ্ছিন্ন না করে শাখা স্যুইচ করুন


গিট 2.23 (আগস্ট 2019) এর সাথে আপনাকে আর বিভ্রান্তিকর git checkoutআদেশ ব্যবহার করতে হবে না।

git switch এছাড়াও একটি শাখা চেকআউট করতে পারে এবং একটি পৃথক হেড পেতে পারে:

  • এটির একটি স্পষ্ট --detachবিকল্প রয়েছে

HEAD~3কোনও নতুন শাখা তৈরি না করে অস্থায়ী পরিদর্শন বা পরীক্ষার জন্য প্রতিশ্রুতিবদ্ধতা পরীক্ষা করতে :

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • এটি কোনও দূরবর্তী ট্র্যাকিং শাখা ভুল করে আলাদা করতে পারে না

দেখা:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

বনাম নতুন git switchকমান্ড ব্যবহার করে :

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

যদি আপনি একটি দূরবর্তী শাখা ট্র্যাক করে একটি নতুন স্থানীয় শাখা তৈরি করতে চান:

git switch <branch> 

যদি <branch>খুঁজে পাওয়া না যায় তবে <remote>একটি মিলের নামের সাথে একটি দূরবর্তী (কল করুন ) এর সাথে ট্র্যাকিং শাখা উপস্থিত রয়েছে , সমান হিসাবে বিবেচনা করুন

git switch -c <branch> --track <remote>/<branch>

আর কোন ভুল!
আর অবাঞ্ছিত হেড!


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

এই ভিজ্যুয়াল গাইডে, এখানে এই ব্যাখ্যা রয়েছে: git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage."ফাইলগুলি মঞ্চে অনুলিপি করা হয়" এর অর্থ কী? আমি ভেবেছিলাম ফাইলগুলি প্রতিশ্রুতিবদ্ধ, যার অর্থ মঞ্চটি সাফ?
সর্বোচ্চ

16
প্রকৃতপক্ষে, আপনি যখনই তার SHA1 দ্বারা কোনও প্রতিশ্রুতি চেক আউট করবেন তখনই আপনি একটি বিচ্ছিন্ন হেড পাবেন, এটি কোনও শাখার ডগায় থাকুক বা না থাকুক ; বিযুক্ত হেড না পেয়েই আপনি যে ধরণের জিনিসটি চেকআউট করতে পারেন তা হ'ল একটি শাখার নাম। উদাহরণ হিসেবে বলা যায়, যদিও mastered489উপরে চিত্রে, git checkout ed489আপনি একটি বিচ্ছিন্ন মাথা, যখন দেব git checkout masterনা।
ম্যাসিফিল

8
"You can think of this as an anonymous branch":) আমি
সাদৃশ্যটি


117

আমি এখনই দুর্ঘটনাক্রমে এটি পুনরুত্পাদন করেছি:

  1. দূরবর্তী শাখা তালিকাভুক্ত

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. আমি স্থানীয়ভাবে একটি চেকআউট করতে চাই, তাই আমি পেস্ট কাটা:

    git checkout origin/Feature/f1234
    
  3. Presto! পৃথকভাবে হেডের অবস্থা

    You are in 'detached HEAD' state. [...])
    

সমাধান # 1:

origin/এটি পরীক্ষা করার সময় আমার শাখার নির্দিষ্ট অংশের সামনে অন্তর্ভুক্ত করবেন না :

git checkout Feature/f1234

সমাধান # 2:

যোগ -bপরামিতি, যা দূরবর্তী থেকে একটি স্থানীয় শাখা তৈরি করে

git checkout -b origin/Feature/f1234 অথবা

git checkout -b Feature/f1234 এটি স্বয়ংক্রিয়ভাবে উত্সে ফিরে আসবে


14
এটি প্রায় দুর্দান্ত উত্তর, তবে আপনি কেন বিচ্ছিন্ন মাথাব্যবস্থায় পড়েছেন তা ব্যাখ্যা করতে ব্যর্থ।
হংসী

5
আমি সম্মত তবে এটি যে সমাধানটি আমি খুঁজছিলাম তা সরবরাহ করে। ধন্যবাদ !!
কিলমাজিং

আমি এই অন্য উত্তরে দেখেছি যে git checkout -b Feature/f1234<=> git branch Feature/f1234এবং git checkout Feature/f1234
আর্মফুট

1
ডিফল্টরূপে এটি উত্স হিসাবে দেখায়, সুতরাং যখন আপনি দেবেন origin/branchname, তখন আপনাকে এটির origin/origin/branchnameপ্রথমটি বলা হয় যে আপনি ব্যবহার করেন এমন প্রত্যন্ত নাম -b, যদি আপনি এটি একটি anonymousশাখা তৈরি করেন না যা আলাদা হয়। একইভাবে -bঅন্য কোনও দূরবর্তী থেকে চেক করার জন্য আপনাকে প্যারামিটারটি উল্লেখ করতে হবে অন্যথায় গিটের কোনও নতুন দূরবর্তী থেকে এটি জানার উপায় নেই, এটি সন্ধান করবে origin/remote/branchname
garg10may

তুমি সাধু!
হার্ভে লিন

12

চেষ্টা

git reflog 

এটি আপনাকে কীভাবে আপনার হেড এবং শাখা পয়েন্টারগুলি অতীতে স্থানান্তরিত করেছিল তার একটি ইতিহাস দেয়।

যেমন:

88ea06b হেড @ {0}: চেকআউট: ডেভেলপমেন্ট থেকে রিমোটস / অরিজিন / সোনারাইসফাইচার e47bf80 হেড @ {1} এ সরান: উত্সকে টানুন অগ্রসর করুন: দ্রুত এগিয়ে

এই তালিকার শীর্ষটি হ'ল একটি পুনর্গঠন যার ফলে একটি সনাক্ত হওয়া প্রধান রাষ্ট্রের মুখোমুখি হতে পারে ... একটি দূরবর্তী ট্র্যাকিং শাখা পরীক্ষা করে।


7

এটি পুনরায় চেক-আউট ফাইলগুলির মাধ্যমে আপনার করা পরিবর্তনগুলি পূর্বাবস্থায় ফেলার চেষ্টা করার এবং সিনট্যাক্সটি সঠিকভাবে না পাওয়ার ক্ষেত্রে সহজেই ঘটতে পারে।

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


5

আপনার যদি শাখা হিসাবে একই নামে কোনও ট্যাগ থাকে তবে এটি ঘটতে পারে।

উদাহরণ: "রিলিজ / 0.1" যদি ট্যাগের নাম হয়, তবে

git checkout release/0.1

"রিলিজ / 0.1" এ পৃথক হেড উত্পাদন করে। আপনি যদি প্রকাশ / 0.1 টি একটি শাখার নাম হিসাবে প্রত্যাশা করেন তবে আপনি বিভ্রান্ত হবেন।


1
হ্যাঁ. কিন্তু আপনি কিভাবে এটি ঠিক করবেন? আপনি কিভাবে শাখার একটি চেকআউট করবেন?
মার্টিন

5

Detached HEAD এর অর্থ যা বর্তমানে যাচাই করা হয়েছে তা কোনও স্থানীয় শাখা নয়।

কিছু পরিস্থিতি যার ফলে একটি Detached HEADরাষ্ট্রের ফলাফল হবে :

  • যদি আপনি একটি দূরবর্তী শাখা চেকআউট করেন , বলুন origin/master। এটি একটি পঠনযোগ্য শাখা। সুতরাং, origin/masterএটি থেকে কোন প্রতিশ্রুতি তৈরি করার সময় নিখরচায় অর্থাত্‍ অর্থাত্ কোনও শাখার সাথে সংযুক্ত নয়।

  • যদি আপনি একটি নির্দিষ্ট ট্যাগ চেকআউট করেন বা প্রতিশ্রুতিবদ্ধ হন । এখান থেকে নতুন প্রতিশ্রুতি দেওয়ার সময়, এটি আবার মুক্ত-ভাসমান হবে , অর্থাত্ কোনও শাখার সাথে সংযুক্ত নয়। মনে রাখবেন যে যখন কোনও শাখাটি চেক আউট করা হয় তখন নতুন কমিট সবসময় স্বয়ংক্রিয়ভাবে ডগায় স্থাপন করা হয়।

    আপনি যখন ফিরে যেতে চান এবং সেখান থেকে কাজ শুরু করার জন্য একটি নির্দিষ্ট প্রতিশ্রুতি বা ট্যাগ চেকআউট করতে চান, আপনি সেই প্রতিশ্রুতি থেকে শুরু করে একটি নতুন শাখা তৈরি করতে পারেন এবং এটির মাধ্যমে স্যুইচ করতে পারেন git checkout -b new_branch_name। এটি Detached HEADরাষ্ট্রকে প্রতিরোধ করবে কারণ আপনার এখন একটি শাখা পরীক্ষা করা হয়েছে এবং প্রতিশ্রুতিবদ্ধ নয়।


3

একটি সাধারণ দুর্ঘটনাজনক উপায় হ'ল git checkout headটাইপ টাইপ হিসাবে একটি করাHEAD

এটা চেষ্টা কর:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

যা দেয়

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme

Longair.net/blog/2012/05/07/the- Most - confusing - git - terminology ("" প্রধান "এবং" মাথা "দেখুন)
ভোনসি

@ ভনসি: এই লিঙ্কটির জন্য ধন্যবাদ। আমি গিট প্রশিক্ষণ প্রস্তুত করছি এবং আমি কেন এটি মাঝে মাঝে এত বিভ্রান্তিকর তাও উল্লেখ করতে চাই। আমার কাছে ইতিমধ্যে প্রচুর উদাহরণ রয়েছে ( checkout -bযা দেখতে চেকআউটের মতো দেখায় তবে আসলে শাখাগুলি) তবে অন্য একটি তালিকা কেবল স্বাগত।
টমাস ওয়েলার

2

গিট বিচ্ছিন্ন মাথা অবস্থায় যাওয়ার অন্য উপায়টি হল একটি দূরবর্তী শাখায় প্রতিশ্রুতিবদ্ধ হওয়ার চেষ্টা করা। কিছুটা এইরকম:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

মনে রাখবেন যে আপনি যদি এটি করেন তবে উত্স / ফু চেকআউট করার পরবর্তী কোনও প্রচেষ্টা আপনাকে আবার একটি বিচ্ছিন্ন মাথা অবস্থায় ফেলে দেবে!

সমাধানটি হ'ল আপনার নিজস্ব স্থানীয় ফু শাখা তৈরি করা যা মূল / ফুকে ট্র্যাক করে, তারপরে allyচ্ছিকভাবে চাপ দিন।

এটি আপনার মূল সমস্যার সাথে সম্ভবত কোনও সম্পর্কযুক্ত নয়, তবে এই পৃষ্ঠাটি "গিট বিচ্ছিন্ন মাথা" এর জন্য গুগল হিটগুলিতে বেশি এবং এই দৃশ্যটি মারাত্মকভাবে ডকুমেন্টেড।


এই পরিস্থিতিটি উপরের ওউনের উপরের উত্তর সম্পর্কে কী বলেছে বলে মনে হয় - যেখানে "উত্স / ফু" কেটে পেস্ট করা গিটকে "উত্স / উত্স / ফু" হিসাবে ভাবায়।
mvanle

1

যখন আপনি একটি প্রতিশ্রুতি চেকআউট git checkout <commit-hash> বা কোনও দূরবর্তী শাখায় আপনার হেড আলাদা হয়ে যায় এবং এটিতে একটি নতুন প্রতিশ্রুতি তৈরি করার চেষ্টা করবে।

যে শাখাগুলি বা ট্যাগ দ্বারা অ্যাক্সেসযোগ্য নয় এমন কমিটগুলি আবর্জনা সংগ্রহ করা হবে এবং 30 দিনের পরে সংগ্রহস্থল থেকে সরানো হবে।

এটি সমাধানের আরেকটি উপায় হ'ল সদ্য নির্মিত প্রতিশ্রুতিবদ্ধতার জন্য একটি নতুন শাখা তৈরি করা এবং এটিতে চেকআউট করা। git checkout -b <branch-name> <commit-hash>

এই নিবন্ধটি ব্যাখ্যা করে যে আপনি কীভাবে পৃথক হেডের স্থানে যেতে পারেন ।

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