বিচ্ছিন্ন হেড অবস্থায় তৈরি করা গিট কমিটের সাথে কী ঘটে?


137

এটাই হযেছিল:

আমার একটি শাখা আছে। এ শাখায় এআই একগুচ্ছ পরিবর্তন করেছে। আমি কোডটি নিয়ে সন্তুষ্ট ছিলাম না, তাই আমি শাখা এ-তে পূর্ববর্তী প্রতিশ্রুতিটি পরীক্ষা করে দেখলাম then আমি কি এই কোডটি হারিয়েছি?


আপনি যখন "আমি শাখা এ-তে পূর্ববর্তী প্রতিশ্রুতিটি পরীক্ষা করে দেখেছি" বলছেন, তখন আপনার অর্থ কি "আমি শাখা এটিকে পূর্ববর্তী প্রতিশ্রুতিতে রিসেট করেছি"? অর্থাত্ আপনি আসলে git resetচেয়ে না git checkout?
সিবি বেইলি

না, আমি চেকআউট ব্যবহার করেছি। রিফ্লগ কাজ করেছে।
মাউসিমো

আপনি যদি চেকআউট ব্যবহার করেন তবে আপনি বিচ্ছিন্ন হয়ে HEADথাকবেন এবং শাখা এ আগের প্রতিশ্রুতিতে থাকতে পারত। ঠিক কোন আদেশ আপনি চালিত করেছেন?
সিবি বেইলি

1
আমি ওএসএক্স লায়নটিতে সোর্সট্রি জিআইটি জিইআই ব্যবহার করছিলাম। আমি শাখা A তে ছিলাম এবং শাখা এ-এর পূর্বের প্রতিশ্রুতিগুলির একটি চেকআউট চালিয়েছিলাম আমি তারপরে কোড পরিবর্তন করেছি এবং প্রতিশ্রুতিবদ্ধ (শাখা এ)। আমি বিশ্বাস করি আমার একটি আলাদা মাথা ছিল HE
মৌসিমো

ঠিক আছে, আমি মনে করি আপনি তখন বিভ্রান্ত হয়ে পড়েছিলেন যখন আপনি বলেছিলেন যে আপনি শাখা এতে আরও একগুচ্ছ পরিবর্তন করেছেন
সিবি বেইলি

উত্তর:


185

পুরানো প্রতিশ্রুতি এখনও রিলগ অবধি আছে।

git reflog

এটি কমিটগুলির একটি তালিকা প্রদর্শন করবে এবং "হারানো" প্রতিশ্রুতি সেখানে থাকা উচিত। আপনি এটিকে একটি নতুন শাখায় পরিণত করতে পারেন। উদাহরণস্বরূপ, যদি SHA-1 ba5a739 হয় তবে আপনি পুরানো কমিটের সাথে "নতুন-শাখা" নামে একটি নতুন শাখা তৈরি করতে পারেন:

git branch new-branch ba5a739

নোট করুন যে ডাটাবেস ছাঁটাই করা হলে "হারিয়ে যাওয়া" কমিটগুলি মুছে ফেলা হবে।


3
আমি একই জিনিসটি করেছি এবং হার্ট অ্যাটাক হয়েছে ভেবে এটি হারিয়ে গেছে। তথ্যের জন্য ধন্যবাদ!
চেজ

14
git cherry-pick [SHA]বিচ্ছিন্ন প্রধান রাজ্যে থাকাকালীন আপনি দুর্ঘটনাক্রমে প্রতিশ্রুতিবদ্ধ ক্ষেত্রে
কমিটকে

3
বিকল্পভাবে আপনি একটি বিদ্যমান শাখায় স্যুইচ করতে পারেন এবং "গিট মার্জড হেড @ {n}" n রিফ্লগে তালিকাভুক্ত "হারানো" কমিটের সাথে মিলিয়ে করতে পারেন।
eaykin

আপনি কি জানেন pruneযে প্রতিশ্রুতি বার্তাগুলিতে উল্লেখ করা হচ্ছে এমন বিচ্ছিন্ন কমিটগুলিও যদি মুছে ফেলবে? বা এটি তাদের পৌঁছনীয় করে তোলে ?
কামাফেদার

@ কামাফেদার: আমি মনে করি না যে এটি তাদের কাছে পৌঁছনীয় ble
ডায়েটারিচ এপ্প

63

ইতিমধ্যে উল্লিখিত হিসাবে আপনার প্রতিশ্রুতিগুলি এখনও রিফ্লাগে উপলব্ধ। অন্যান্য উত্তরের পাশাপাশি, এখানে একটি নতুন শাখা তৈরি এবং মার্জ না করে সরাসরি আপনার বর্তমান শাখায় বিচ্ছিন্ন হেডের প্রতিশ্রুতি গ্রহণ করার উপায় এখানে রয়েছে :

  1. বিচ্ছিন্ন হেড স্টেটে আপনি যে কমিট করেছেন তার SHA-1 হ্যাশগুলি দেখুন

    git reflog
    
  2. তারপরে কার্যকর করুন, সমস্ত কমিট হ্যাশ সহ প্রাচীনতম থেকে অতি সাম্প্রতিকতম আদেশিত:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    উদাহরণস্বরূপ, যদি আমার কেবল একটি থাকে, "প্রথম 7 অক্ষর" শর্ট হ্যাশ ফর্ম্যাটটিতে দেওয়া হয়:

    git cherry-pick a21d053
    

এটি আপনার বর্তমান শাখায় নতুন প্রতিশ্রুতি তৈরি করবে, বিচ্ছিন্ন-হেড-কমিট হ্যাশ প্রতি একটি অঙ্গীকার যা আপনি কমান্ডটিতে উল্লেখ করেছেন। এটি মূল প্রতিশ্রুতি বার্তা গ্রহণ করে।


11

আপনি নিখুঁত কমান্ডের সাথে হারিয়ে যাওয়া (ঝুলন্ত) কমিট করতে পারেন:

git fsck --lost-found

দ্রষ্টব্য, যদি আপনার বর্তমান মাথাটি দায়বদ্ধ হয়ে ঝুঁকছে তবে তা হারানো হিসাবে তালিকাভুক্ত নয়।

আপনি গিট- fsck (1) ম্যানুয়াল পৃষ্ঠাতে আরও তথ্য পেতে পারেন

তারপরে আপনি সেই হারানো প্রতিশ্রুতিতে শাখা তৈরি করতে পারেন:

git branch new-branch ba5a739

আমি প্রথম "গিট রিফ্লগ" কমান্ডটি ব্যবহার করেছি তারপরে একটি উপ-মডুলের জন্য "গিট ব্রাঞ্চ নতুন-শাখা বা5a739", এটি কাজ করেছিল।
ondermerol

7

আপনার কার্যক্ষম ডিরেক্টরিটির রাজ্যের জন্য গিট পার্লান্স একটি " বিচ্ছিন্ন হেড "। এখানে git reflogসেভ করে তোলে এমন আরও একটি জায়গা ।

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

আমি যদি অন্য একটি শাখা চেকআউট করার চেষ্টা করি, গিট -১. 1..৫.১ একটি সহায়ক পরামর্শ দেয়।

it গিট চেকআউট মাস্টার
সতর্কতা: আপনি 1 টি প্রতিশ্রুতি রেখে চলেছেন, সংযুক্ত নেই
আপনার কোন শাখা:

  বিচ্ছিন্ন হেড সম্পর্কে আমার প্রতিশ্রুতি 0b40dd6

আপনি যদি একটি নতুন শাখা তৈরি করে এগুলি রাখতে চান তবে এটি ভাল সময় হতে পারে
এর সাথে এটি করতে:

 গিট শাখা নতুন_ব্রঞ্চ_নাম 0b40dd65c06bb215327863c2ca10fdb4f904215b

শাখা 'মাস্টার' এ স্যুইচ করা হয়েছে

তথ্য এবং লিঙ্কের জন্য ধন্যবাদ। লিঙ্কটি আমাকে বুঝতে সাহায্য করেছিল যে কী ঘটছে।
মৌসিমো

6

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


4

গিটার রেপোতে আপনার বিচ্ছিন্ন মাথাটিকে লিঙ্ক করতে এই পদক্ষেপগুলি অনুসরণ করুন

  1. git checkout "your branch with path but without remote name"

যেমন দূরবর্তী নামটি যদি উৎপত্তি হয় এবং শাখার নামটি bugfix/somebranchব্যবহার করা হয়git checkout bugfix/somebranch

  1. git reflog কমিট এসএইএ'র তালিকাটি আপনার বিচ্ছিন্ন শাখার তালিকা থেকে তালিকাভুক্ত করুন।

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

সব সেট!!


2

সোর্সট্রি-তে, আমি পাই যে গিট রিফ্লাগ কাজ করে না, সুতরাং জিইউআই ব্যবহার করে এটি কীভাবে করা যায় তা বুঝতে পেরেছিলাম।

প্রথমে কমান্ডের ইতিহাসে কোনও বার্তা সন্ধান করে "হারিয়ে যাওয়া" প্রতিশ্রুতিটি অনুসন্ধান করার চেষ্টা করুন (দেখুন: কমান্ড আউটপুট দেখান)। আপনি যে প্রতিশ্রুতিটি হারিয়েছেন তার পরে এটি "স্যুইচিং শাখা" কমান্ডে থাকবে এবং আপনি 1234567 কমিট আইডির মাধ্যমে কমিট মন্তব্যটি দেখতে পাবেন।

সেই প্রতিশ্রুতি আইডিটি পরবর্তী পদক্ষেপে নিয়ে যান।

উপরের সরঞ্জামদণ্ডে "ব্রাঞ্চ" বোতামটি হিট করুন এবং আপনার একটি ডায়ালগ "নতুন শাখা" পাওয়া উচিত যেখানে আপনি একটি নির্দিষ্ট প্রতিশ্রুতি নির্দিষ্ট করতে পারেন। সেই কমিট আইডিটিকে সেখানে রাখুন, একটি নতুন শাখার নাম নির্দিষ্ট করুন, তৈরি করুন শাখাকে হিট করুন এবং আপনার হারিয়ে যাওয়া প্রতিশ্রুতি সহ একটি নতুন শাখা পাওয়া উচিত!

এটি আমার জন্য কিছু হারিয়ে যাওয়া কাজ ফিরিয়ে এনেছে!

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