প্রথমে আসুন স্পষ্ট করা যাক শিরোনাম কী এবং এটি আলাদা হওয়ার সময় এর অর্থ কী।
বর্তমানে চেক আউট করা কমিটের প্রতীকী নাম হেইড। যখন হেডকে বিচ্ছিন্ন না করা হয় ("সাধারণ" 1 পরিস্থিতি: আপনার একটি শাখা চেক আউট করা হয়), তখন হেড আসলে একটি শাখার "রেফ" নির্দেশ করে এবং শাখা অঙ্গীকারের দিকে নির্দেশ করে। মাথা এইভাবে একটি শাখার সাথে "সংযুক্ত" থাকে। যখন আপনি একটি নতুন প্রতিশ্রুতিবদ্ধ করেন, তখন প্রধান শাখাটি নির্দেশ করে যে শাখাটি নতুন প্রতিশ্রুতিতে নির্দেশ করে তা আপডেট করা হয়। হেড স্বয়ংক্রিয়ভাবে অনুসরণ করে যেহেতু এটি কেবল শাখায় নির্দেশ করে।
git symbolic-ref HEADফলন refs/heads/master
"মাস্টার" নামে পরিচিত শাখাটি চেক আউট করা হয়েছে।
git rev-parse refs/heads/masterফলন 17a02998078923f2d62811326d130de991d1a95a
হ'ল মাস্টার ব্রাঞ্চের বর্তমান টিপ বা "প্রধান"।
git rev-parse HEADএছাড়াও ফলন 17a02998078923f2d62811326d130de991d1a95a
এটি "প্রতীকী রেফ" হওয়ার অর্থ এটি। এটি অন্য কিছু রেফারেন্সের মাধ্যমে কোনও বস্তুর দিকে নির্দেশ করে।
(সিম্বলিক রেফগুলি মূলত প্রতীকী লিঙ্ক হিসাবে প্রয়োগ করা হয়েছিল, তবে পরে অতিরিক্ত ব্যাখ্যা দিয়ে প্লেইন ফাইলগুলিতে পরিবর্তিত হয়েছে যাতে সেগুলি প্ল্যাটফর্মগুলিতে সিলেলিক্স না করে ব্যবহার করা যেতে পারে।)
আমাদের আছে HEAD→ refs/heads/master→17a02998078923f2d62811326d130de991d1a95a
যখন হেডকে আলাদা করা হয়, তখন এটি সরাসরি একটি প্রতিশ্রুতিতে নির্দেশ করে — পরিবর্তে কোনও শাখার মাধ্যমে অপ্রত্যক্ষভাবে তার দিকে ইঙ্গিত করে। আপনি কোনও বিচ্ছিন্ন হেডকে নামবিহীন শাখায় থাকার কথা ভাবতে পারেন।
git symbolic-ref HEAD সঙ্গে ব্যর্থ fatal: ref HEAD is not a symbolic ref
git rev-parse HEADফলন 17a02998078923f2d62811326d130de991d1a95a
যেহেতু এটি একটি প্রতীকী রেফ নয়, এটি অবশ্যই নিজের দায়বদ্ধতার দিকে নির্দেশ করবে।
আমাদের আছে HEAD→17a02998078923f2d62811326d130de991d1a95a
একটি বিচ্ছিন্ন হেডের সাথে মনে রাখার গুরুত্বপূর্ণ বিষয়টি হ'ল এটি যে প্রতিশ্রুতি নির্দেশ করে তা যদি অন্যথায় অযৌক্তিক হয় (অন্য কোনও রেফ এটি পৌঁছতে পারে না), তবে আপনি যখন অন্য কোনও প্রতিশ্রুতি চেক আউট করবেন তখন এটি "জটলা" হয়ে উঠবে। অবশেষে, এ জাতীয় ঝুঁকিপূর্ণ কমিটগুলি আবর্জনা সংগ্রহের প্রক্রিয়াটির মাধ্যমে ছাঁটাই করা হবে (ডিফল্টরূপে সেগুলি কমপক্ষে 2 সপ্তাহের জন্য রাখা হয় এবং হেডের রিফ্লোগ দ্বারা রেফারেন্স করে দীর্ঘ সময় রাখা যেতে পারে)।
1
একটি বিচ্ছিন্ন হেডের সাথে "স্বাভাবিক" কাজ করা পুরোপুরি ঠিক আছে, রিফ্লগের বাইরে থাকা ইতিহাসের মাছটিকে এড়াতে আপনি কী করছেন সে সম্পর্কে আপনাকে কেবল নজর রাখতে হবে।
ইন্টারেক্টিভ রিবেসের মধ্যবর্তী পদক্ষেপগুলি একটি পৃথক হেড (আংশিকভাবে সক্রিয় শাখার পুনর্বিবেগ দূষিত এড়ানোর জন্য) দিয়ে সম্পন্ন করা হয়। আপনি যদি পুরো রিবেস অপারেশন শেষ করেন, তবে এটি রিবেস অপারেশনের সংখ্যক ফলাফলের সাথে আপনার মূল শাখাকে আপডেট করবে এবং হেডকে মূল শাখায় পুনরায় সংযুক্ত করবে। আমার অনুমান যে আপনি কখনই রিবেস প্রক্রিয়া সম্পূর্ণরূপে সম্পন্ন করেননি; এটি আপনাকে এক বিচ্ছিন্ন হেড দিয়ে ছেড়ে দেবে যে প্রতিশ্রুতির দিকে ইঙ্গিত করছে যা সবেমাত্র রিবেস অপারেশন দ্বারা প্রক্রিয়া করা হয়েছিল।
আপনার পরিস্থিতি থেকে পুনরুদ্ধার করতে, আপনার একটি শাখা তৈরি করা উচিত যা আপনার বিচ্ছিন্ন হেড দ্বারা বর্তমানে নির্দেশিত প্রতিশ্রুতিগুলিকে নির্দেশ করে:
git branch temp
git checkout temp
(এই দুটি কমান্ড সংক্ষেপে হিসাবে সংক্ষিপ্ত করা যেতে পারে git checkout -b temp)
এটি আপনার হেডকে নতুন tempশাখায় পুনরায় সংযুক্ত করবে ।
এরপরে, আপনার বর্তমান কমিট (এবং এর ইতিহাস) এর সাথে তুলনা করা উচিত যে সাধারণ শাখায় আপনি কাজ করছেন বলে আশা করছেন:
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(আপনি সম্ভবত লগ বিকল্পগুলি নিয়ে পরীক্ষা করতে চাইবেন: সম্পূর্ণ লগ বার্তা ইত্যাদি দেখতে যোগ করুন -p, ছেড়ে দিন --pretty=…)
আপনার নতুন tempশাখাটি দেখতে ভাল masterলাগলে আপনি এটি আপডেট করতে (যেমন) আপডেট করতে চাইতে পারেন :
git branch -f master temp
git checkout master
(এই দুটি কমান্ড সংক্ষেপে হিসাবে সংক্ষিপ্ত করা যেতে পারে git checkout -B master temp)
তারপরে আপনি অস্থায়ী শাখাটি মুছতে পারেন:
git branch -d temp
শেষ অবধি, আপনি সম্ভবত পুনঃপ্রকাশিত ইতিহাসটি এগিয়ে নিতে চাইবেন:
git push origin master
--forceনতুন কমিটের কাছে যদি দূরবর্তী শাখাটি "দ্রুত-ফরওয়ার্ড" না করা যায় (যেমন আপনি বাদ পড়েছেন বা কিছু বিদ্যমান প্রতিশ্রুতি পুনরায় লিখেছেন, অথবা ইতিহাসের কিছুটা পুনর্লিখন লিখেছেন) তবে আপনাকে এই কমান্ডের শেষের দিকে চাপ দিতে হবে push
আপনি যদি রিবেস অপারেশনের মাঝামাঝি থাকেন তবে সম্ভবত আপনার এটি পরিষ্কার করা উচিত। ডিরেক্টরিটি সন্ধান করে কোনও রিবেস প্রক্রিয়াধীন ছিল কিনা তা আপনি পরীক্ষা করতে পারেন .git/rebase-merge/। আপনি কেবলমাত্র সেই ডিরেক্টরি মুছে ফেলার মাধ্যমে অগ্রগতি রিবেসটি ম্যানুয়ালি পরিষ্কার করতে পারেন (উদাহরণস্বরূপ যদি আপনি সক্রিয় রিবেস অপারেশনের উদ্দেশ্য এবং প্রসঙ্গটি মনে না রাখেন)। সাধারণত আপনি ব্যবহার করবেন git rebase --abort, তবে এটি কিছু অতিরিক্ত পুনরায় সেট করে যা আপনি সম্ভবত এড়াতে চান (এটি মাথাটি মূল শাখায় ফিরে যায় এবং এটিকে পুনরায় সেট করে দেয় মূল প্রতিশ্রুতিতে, যা আমরা উপরে কিছু কাজ পূর্বাবস্থায় ফিরিয়ে আনব)।