একটি পুরানো প্রতিশ্রুতি পরীক্ষা করা এবং মাস্টার শাখায় মাথা বজায় রাখা?


85

বর্তমানে অন্য গিট কমিটে স্যুইচ করার জন্য (একই শাখায় ... আসলে, মাস্টার শাখায়!), আমি কমান্ডটি সম্পাদন করছি

git checkout ea3d5ed039edd6d4a07cc41bd09eb58edd1f2b3a

এখন, প্রতিবার আমি এই গিটটি করি যখন আমাকে বলে যে আমি এখন এক বিচ্ছিন্ন মাথা নিয়ে এসেছি। আমি কীভাবে কোনও পুরানো প্রতিশ্রুতিতে যেতে পারি এবং এখনও একই শাখায় মাথা বজায় রাখতে পারি?


4
আপনি যে কমান্ডটি ব্যবহার করার পর, আপনার মস্তিস্ক সুত্র পরিবর্তন যে কমিট। এটি হেডটি অন্য কোথাও নির্দেশ করাও বোধগম্য নয়।
গ্রেগ হিউগিল

গিটের বার্তা থেকে আমি যা বুঝতে পারি তা থেকে এটি কোথাও নির্দেশ করছে , যা অনাকাঙ্ক্ষিত।
ইলিজিয়াম

4
বার্তা গীত শো আপনি যখন কোনো নির্দিষ্ট খুঁজে বার করো কমিট যে ভালো বলছেন "মাথা এখন ea3d5ed হয় ...", যা আপনাকে বলে যে মাথা হয় কোথাও প্রতি নির্দেশ। এটি কেবল কোথাও ইঙ্গিত করছে যার শিরোনাম ব্যতীত অন্য কোনও নাম নেই (এই মুহুর্তে, যেহেতু একটি git checkoutঅন্য প্রতিশ্রুতি বা শাখার নাম হেডকে সেই নতুন জায়গায় নিয়ে যাবে)।
গ্রেগ হিউগিল

প্রদত্ত উত্তরগুলি কি এটিকে পর্যাপ্তরূপে ব্যাখ্যা করে, বা এমন কিছু আছে যা আমরা আরও পরিষ্কার করতে পারি? আমি যদি আপনার প্রশ্নের উত্তর না দেয় তবে আমি আপনার জন্য আমার উত্তর পরিষ্কার করে খুশি হব।
ব্রায়ান ক্যাম্পবেল

আপনি যদি এখানে হেডকে সম্পূর্ণ অপরিবর্তিত রাখার সময় অন্য কোন প্রতিশ্রুতি পরীক্ষা করার উপায়ের সন্ধান করতে এসেছিলেন (উদাহরণস্বরূপ কোনও পুরানো প্রতিশ্রুতিতে ফিরে যেতে): এটি git revert --no-commit 0766c053..HEADকরবে, 0766c053আপনি যে প্রতিশ্রুতিটি যাচাই করতে চান will এটি স্ট্যাকওভারফ্লো . com/a/21718540/525872 থেকে ।
জো লিস

উত্তর:


193

আমি যখন এটি করি তখন বেশিরভাগ সময় আমি একটি অস্থায়ী শাখায় চেকআউট করি:

git checkout -b temp-branch-name ea3d5ed039edd6d4a07cc41bd09eb58edd1f2b3a

আমার কাজ শেষ হওয়ার পরে আমি কেবল শাখাটি মুছব


79

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

তবে, আপনি যদি সেই বিন্দু থেকে শুরু করে আরও কমিট করতে চান তবে আপনার একটি শাখা তৈরি করা উচিত। যদি আপনি এমন কমিট করেন যেগুলি কোনও শাখার দ্বারা প্রাসঙ্গিক নয়, তারা সহজেই হারিয়ে যেতে পারে এবং শেষ পর্যন্ত গিটের আবর্জনা সংগ্রহকারী দ্বারা পরিষ্কার হয়ে যাবে, কারণ তাদের কোনও কিছুই বোঝায় না। আপনি চালিয়ে একটি নতুন শাখা তৈরি করতে পারেন:

git checkout -b newbranch ea3d5ed

ভিজ্যুয়ালাইজ করতে সহায়তা করার জন্য, এখানে কয়েকটি চিত্র এখানে দেখানো হয়েছে যে কীভাবে একটি বিচ্ছিন্ন মাথাতে কাজ করা একটি শাখায় কাজ করা থেকে আলাদা।

আসুন 3 টি কমিট চালু করে শুরু করা যাক master , এ, বি এবং সি masterবর্তমান শাখা, সুতরাং এটি HEADনির্দেশ করুন masterযা কোনটি সি প্রতিশ্রুতি দেয় C.

এবিসি
* - * - * <- মাস্টার <- হেড

এখন যদি আমরা প্রতিশ্রুতিবদ্ধ হয়, গিটটি একটি প্রতিশ্রুতি তৈরি করবে যার পিতামাতা হিসাবে সি রয়েছে (কারণ এটিই বর্তমান প্রতিশ্রুতি, এর HEADমাধ্যমে নির্দেশিত master) এবং masterসেই নতুন প্রতিশ্রুতিতে নির্দেশ করার জন্য আপডেট করবে । আমাদের সমস্ত কমিট এখন রয়েছে master, এবংHEAD মাধ্যমে নতুন প্রতিশ্রুতিবদ্ধতার দিকে ইঙ্গিত করে master

এ বি সি ডি
* - * - * - * <- মাস্টার <- হেড

এখন আমাদের বি আলাদা করে বি কে পরীক্ষা করে দেখি HEAD

এ বি সি ডি
* - * - * - * <- মাস্টার
   ^
    \ - মাথা

এখানে সবকিছু ঠিকঠাক কাজ করে; আমরা ফাইলগুলির সকলের দিকে নজর দিতে পারি, আমাদের প্রোগ্রামটি তৈরি করতে পারি, এটি পরীক্ষা করতে পারি etc. ইত্যাদি আমরা এমনকি নতুন কমিট তৈরি করতে পারি; তবে আমরা যদি এটি করি তবে আমাদের কোনও শাখা নেই যা আমরা নতুন প্রতিশ্রুতিতে কোন শাখা চিহ্নিত করতে পারি না। এটির দিকে লক্ষ্য করার একমাত্র বিষয় HEAD:

এ বি সি ডি
* - * - * - * <- মাস্টার
    \
     * <- মাথা
     ই

পরে যদি আমরা masterআবার যাচাই করার সিদ্ধান্ত নিই তবে E এর উল্লেখ করার মতো কিছুই থাকবে না

এ বি সি ডি
* - * - * - * <- মাস্টার <- হেড
    \
     *
     ই

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

সুতরাং, একটি খালি পুনর্বিবেচনা যাচাই করার পরিবর্তে এবং আলাদা হওয়া মাথা পেতে, যদি আপনি মনে করেন যে আপনি আরও কমিট করছেন, আপনার git checkout -b branch Bএকটি শাখা তৈরি করে এটি পরীক্ষা করে নেওয়া উচিত। এখন আপনার প্রতিশ্রুতিগুলি হারাবে না, কারণ সেগুলি একটি শাখায় অন্তর্ভুক্ত করা হবে, যা আপনি সহজেই উল্লেখ করতে পারেন এবং পরে মিশে যেতে পারেন।

এ বি সি ডি
* - * - * - * <- মাস্টার
   ^
    \ - শাখা <- শিরোনাম

আপনি যদি এটি করতে ভুলে যান এবং একটি শাখা থেকে কমিট তৈরি করেন তবে চিন্তার দরকার নেই। আপনি মাথাটি সংশোধন করে একটি শাখা তৈরি করতে পারেন যার সাথে git checkout -b branch। যদি আপনি ইতিমধ্যে masterশাখায় ফিরে এসেছেন এবং বুঝতে পেরেছেন যে আপনি কোনও বিপথগামী প্রতিশ্রুতি ভুলে গেছেন, তবে আপনি এটি ব্যবহার করে দেখতে পাবেন git reflog, যা আপনাকে HEADগত কয়েকদিন ধরে কী অঙ্গীকার করেছে তার ইতিহাস প্রদর্শন করবে । রিফ্লগে থাকা যে কোনও কিছু আবর্জনা সংগ্রহ করা হবে না এবং সাধারণত উল্লেখগুলি কমপক্ষে 30 দিনের জন্য রিফ্লাগে রাখা হয়।


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

4
@ ডেভুরড ইলিজিয়াম "বিচ্ছিন্ন মাথা" এর অর্থ হল আপনার একটি HEADরেফ রয়েছে যা কোনও কমিটের একটি শাখা -1 এ সরাসরি ইশারা করে যা কোনও শাখাটির দিকে ইঙ্গিত করার পরিবর্তে কোনও প্রতিশ্রুতিতে নির্দেশ করে। আপনার মাথা কোনও শাখার উল্লেখ না করার কারণে, আপনি নতুন কমিট যুক্ত করার পরে গিট কী শাখা আপডেট করবে তা জানে না। আমি আমার উত্তরের শুরুতে যেমন ব্যাখ্যা করেছি, আপনি যদি কোডটি তৈরি বা পরীক্ষার জন্য কোনও পুরানো সংস্করণে ফিরে যাচ্ছেন তবে আলাদা হওয়া মাথাটি সম্পূর্ণ ঠিক আছে; আপনি সর্বদা একটি শাখায় git checkout masterবা এর মতো ফিরে যেতে পারেন। আপনার মাথা আলাদা করার সময় যদি আপনি প্রতিশ্রুতিবদ্ধ হন তবে এটি কেবলমাত্র একটি সমস্যা।
ব্রায়ান ক্যাম্পবেল

@ ব্রায়ান ক্যাম্পবেল - শাখায় কমিট করার পরে (যেখানে আপনার মাথা বর্তমানে রয়েছে), আপনি কি তখন শাখাটি বিতে বিভক্ত করে বি কে মাস্টার হিসাবে মার্জ করবেন? আপনার পরবর্তী কি করা উচিত?
amey1908

আপনার ব্যাখ্যাটি আমার জন্য অন্যান্য কিছু জিনিস 'ক্লিক' করেছে। ধন্যবাদ. আমি এখন অবশেষে গিট বুঝতে পেরেছি ...
জো

8

আপনি যদি কোনও পরিবর্তন না করে কেবল এটির সাথে খেলতে পূর্বের প্রতিশ্রুতিতে ফিরে যেতে চান তবে আপনি এটি করতে পারেন

git co <previous-commit-id>

আপনি এই আদেশের পরে "(কোনও শাখা নেই)" নামে পরিচিত একটি শাখায় থাকবেন।

এটি দ্বারা নিশ্চিত করুন

git br

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

git co <the-branch-you-were-on>

"(কোনও শাখা নেই)" স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে। এইভাবে আপনার অস্থায়ী শাখা তৈরি করার দরকার নেই।


5

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

এটা সংক্ষিপ্ত ব্যাখ্যা। নীচের ভার্চুটিটি আশা করি যে হেড এবং মাস্টার কীভাবে আলাদা তা বুঝতে সাহায্য করবে:

সাধারণত জিনিসগুলি দেখতে এরকম লাগে:

C ← refs/heads/master ← HEAD 
↓
B
↓
A

যা বলতে হয়: "সি এর পিতামাতা বি হয়, এবং বি এর পিতামাতা এ। শাখা মাস্টার সি এর দিকে নির্দেশ করছে এবং আমি বর্তমানে মাস্টারের বিষয়বস্তুগুলি পরীক্ষা করে দেখেছি। এছাড়াও, আমি যখন প্রতিশ্রুতিবদ্ধ তখন মাস্টার আপডেট করা হবে।

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

সুতরাং, আপনি যদি কোনও পুরানো প্রতিশ্রুতিটি পরীক্ষা করতে চান তবে পছন্দসই প্রতিশ্রুতিতে নির্দেশ করতে হেডকে অবশ্যই আপডেট করতে হবে। git-checkoutঠিক যে:

C ← refs/heads/master 
↓
B ← HEAD
↓
A

আপনি পুরানো কিছু খুঁজছেন যেহেতু, এখন আপনি আপনার শাখাটি আপনার পিছনে ফেলে রেখেছেন। এটি পুরোপুরি ঠিক আছে, "বিচ্ছিন্ন মাথা" পরামর্শটি আপনাকে শান্তভাবে বলে (জোর দেওয়া আমার):

আপনি চারপাশে দেখতে পারেন, পরীক্ষামূলক পরিবর্তন করতে পারেন এবং সেগুলি প্রতিশ্রুতিবদ্ধ করতে পারেন এবং অন্য চেকআউট সম্পাদন করে কোনও শাখাকে প্রভাবিত না করে আপনি এই রাজ্যে আপনার করা কমিটগুলি বাতিল করতে পারেন।

অন্যদিকে, আপনার শাখাটি পুনরায় সেট করার সময় যেখানে এটি হওয়া দরকার সেখানেও হেড আসে, এটির একটি খুব আলাদা প্রভাব থাকবে!

C
↓
B ← refs/heads/master ← HEAD
↓
A

প্রতিশ্রুতিবদ্ধ সি আবর্জনায় পরিণত হবে, যেহেতু আপনি ঘোষণা করেছেন যে আপনি এটি আর মাস্টার শাখার অংশ হওয়ার জন্য চান না।

সংক্ষেপে, আপনাকে যা করতে হবে তা হ'ল "শিরোনাম" বলতে কী বোঝায় - এটি আপনি যেখানে রয়েছেন সেখানে কোনও শাখা নেই। এবং যেখানে আপনি যেখানে একটি শাখা রয়েছে সেখানে একই না থাকলে, বিযুক্ত হেড ব্যবহার করার বিকল্প নেই choice

(কমিটের ইতিহাস ব্রাউজ করতে সম্ভবত গিটহাব, গিটক বা গিটওয়েবও দেখুন, যদি আপনার হেডকে অবরুদ্ধ করে রাখে তবেই আপনি বিরক্ত হতে পারেন))


1

প্রশ্নটি কিছুটা অস্পষ্ট, তবে আপনি যদি কেবল আপনার কার্যকারী গাছের মধ্যে ফাইল পরিবর্তন করতে চান তবে আপনি কেবল এটি করতে পারেন:

git checkout [commit|branch] -- .

তারপরে আপনি পরিবর্তনগুলি পর্যায়ক্রমে করতে পারেন এবং আপনি ইচ্ছা করলে একটি নতুন প্রতিশ্রুতি তৈরি করতে পারেন। এটি কখনও কখনও বেশ কার্যকর।


0

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

পদক্ষেপ 1: আপনি ফিরে যেতে চান এমন পুরানো প্রতিশ্রুতিগুলির একটি ট্যাগ তৈরি করুন।

ট্যাগ v2.0 মত

পদক্ষেপ 2: গিট চেকআউট ভি 2.0

এটি এখানে, এখন আপনার হেড 'v2.0' প্রতিশ্রুতি দিচ্ছেন, তবে মাস্টার এখনও শেষ প্রতিশ্রুতিতে নির্দেশ করছেন।

C:\Program Files\Git\doc\git\html\git-checkout.html এই নথিটি আপনাকে সাহায্য করতে পারে

বা গিট সহায়তা <চেকআউট> টাইপ করুন

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