সাধারণভাবে, git resetএর কাজটি হ'ল বর্তমান শাখাটি নিয়ে যাওয়া এবং অন্য কোথাও নির্দেশ করার জন্য এটি পুনরায় সেট করা এবং সম্ভবত সূচক এবং কাজের গাছটি সাথে আনতে হবে। আরও দৃ concrete়ভাবে, যদি আপনার মাস্টার শাখা (বর্তমানে চেক আউট) এর মতো হয়:
- A - B - C (HEAD, master)
এবং আপনি বুঝতে পেরেছেন যে আপনি মাস্টার বি এর দিকে নির্দেশ করতে চান, সি নয়, আপনি git reset Bএটি সেখানে স্থানান্তর করতে ব্যবহার করবেন:
- A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore
ডিগ্রেশন: এটি একটি চেকআউট থেকে পৃথক। আপনি যদি চালাতে চান তবে আপনি git checkout Bএটি পেয়েছেন:
- A - B (HEAD) - C (master)
আপনি একটি বিচ্ছিন্ন হেড অবস্থায় শেষ করেছেন। HEAD, কাজের গাছ, সূচক সব মিলছে Bতবে মাস্টার শাখাটি পিছনে ছিল C। আপনি যদি Dএই সময়ে নতুন প্রতিশ্রুতিবদ্ধ হন তবে আপনি এটি পাবেন যা সম্ভবত আপনি যা চান তা নয়:
- A - B - C (master)
\
D (HEAD)
মনে রাখবেন, রিসেট কমিট করে না, এটি একটি পৃথক কমিটকে নির্দেশ করার জন্য একটি শাখা (যা প্রতিশ্রুতির প্রতি নির্দেশক) আপডেট করে। বাকিটি কেবল আপনার সূচক এবং কাজের গাছের সাথে কী ঘটে তার বিশদ।
ব্যবহারের ক্ষেত্রে
আমি git resetপরের অংশে বিভিন্ন বিকল্পের আমার বর্ণনার মধ্যে মূল ব্যবহারের অনেকগুলি বিষয় আবরণ করি । এটি সত্যই বিভিন্ন ধরণের জন্য ব্যবহার করা যেতে পারে; সাধারণ থ্রেডটি হ'ল এগুলির সকলের মধ্যে একটি প্রদত্ত প্রতিশ্রুতি দেখানোর / মেলে চিহ্নিত করার জন্য শাখা, সূচক এবং / অথবা কাজের ট্রি পুনরায় সেট করা জড়িত।
বিষয়গুলি যত্নবান হতে হবে
--hardআপনাকে সত্যই কাজ হারাতে পারে। এটি আপনার কাজের গাছকে পরিবর্তন করে।
git reset [options] commitআপনাকে (বাছাই করা) কমিটগুলি হারাতে পারে। উপরের খেলনা উদাহরণে, আমরা প্রতিশ্রুতি হারিয়েছি C। এটি এখনও রেপোতে রয়েছে এবং আপনি এটি দেখে git reflog show HEADবা এটি খুঁজে পেতে পারেন git reflog show masterতবে এটি এখন কোনও শাখা থেকে অ্যাক্সেসযোগ্য নয়।
গিট 30 দিনের পরে এই ধরনের কমিটগুলি স্থায়ীভাবে মুছে ফেলে, তবে ততক্ষণে আপনি এর উপরে আবার একটি শাখা দেখিয়ে সি পুনরুদ্ধার করতে পারেন git checkout C; git branch <new branch name>।
যুক্তি
ম্যান পেজটি প্যারাফ্রেস করে, সর্বাধিক সাধারণ ব্যবহার ফর্মটির git reset [<commit>] [paths...], যা প্রদত্ত প্রতিশ্রুতি থেকে প্রদত্ত পাথগুলিকে তাদের রাজ্যে পুনরায় সেট করবে। যদি পথগুলি সরবরাহ না করা হয় তবে পুরো গাছটি পুনরায় সেট করা হয়, এবং যদি প্রতিশ্রুতি প্রদান করা হয় না, তবে এটি প্রধান (বর্তমান প্রতিশ্রুতি) হিসাবে নেওয়া হবে। এটি গিট কমান্ড জুড়ে একটি সাধারণ প্যাটার্ন (যেমন চেকআউট, ডিফ, লগ, যদিও সঠিক শব্দার্থবিজ্ঞানের ভিন্নতা রয়েছে), তাই এটি খুব আশ্চর্য হওয়া উচিত নয়।
উদাহরণস্বরূপ, git reset other-branch path/to/fooপাথ / টু / ফু-তে সমস্ত কিছু অন্য শাখায় তার রাজ্যে git reset -- .পুনরায় সেট করে, বর্তমান ডিরেক্টরিটি তার হেডে তার রাজ্যে পুনরায় সেট করে এবং একটি সরল git resetসবকিছুই তার রাজ্যে পুনরায় সেট করে।
প্রধান কাজের গাছ এবং সূচক বিকল্পগুলি
রিসেটের সময় আপনার কাজের গাছ এবং সূচকে কী ঘটে তা নিয়ন্ত্রণ করার জন্য এখানে চারটি প্রধান বিকল্প রয়েছে।
মনে রাখবেন, সূচকটি গিটের "স্টেজিং এরিয়া" - আপনি যখন git addপ্রতিশ্রুতি দেওয়ার প্রস্তুতিতে বলেন তখন জিনিসগুলি চলে ।
--hardআপনি যে প্রতিশ্রুতি পুনরায় সেট করেছেন তার সাথে সমস্ত কিছু মিলে যায়। এটি সম্ভবত বোঝা সহজ iest আপনার স্থানীয় পরিবর্তনগুলি সমস্ত ক্লোবারড হয়ে যায়। একটি প্রাথমিক ব্যবহার হ'ল আপনার কাজকে উড়িয়ে দিচ্ছে তবে কমিটস স্যুইচ করা হচ্ছে না: git reset --hardমানে git reset --hard HEAD, শাখাটি পরিবর্তন করবেন না তবে সমস্ত স্থানীয় পরিবর্তনগুলি থেকে মুক্তি পান। অন্যটি কেবল একটি স্থান থেকে অন্য স্থানে একটি শাখা স্থানান্তরিত করছে এবং সূচী / কাজের গাছটিকে সিঙ্কে রাখছে। এটিই আপনাকে সত্যিকার অর্থে কাজ হারাতে পারে, কারণ এটি আপনার কাজের গাছকে পরিবর্তন করে। খুব নিশ্চিত হন যে আপনি কোনও কাজ চালানোর আগে স্থানীয় কাজ ফেলে দিতে চান reset --hard।
--mixedডিফল্ট, git resetমানে git reset --mixed। এটি সূচকটি পুনরায় সেট করে তবে কাজের গাছ নয়। এর অর্থ আপনার সমস্ত ফাইল অক্ষত, তবে মূল প্রতিশ্রুতি এবং আপনি যেটি পুনরায় সেট করেছেন তার মধ্যে যে কোনও পার্থক্য গিটের স্থিতি সহ স্থানীয় পরিবর্তন (বা চিহ্নবিহীন ফাইলগুলি) হিসাবে প্রদর্শিত হবে। আপনি যখন বুঝতে পারেন যে আপনি কিছু খারাপ প্রতিশ্রুতি করেছেন তখন এটি ব্যবহার করুন তবে আপনি যে সমস্ত কাজ করেছেন তা আপনি রাখতে চান যাতে আপনি এটি ঠিক করে নিতে পারেন এবং পুনঃতফসিল করতে পারেন। প্রতিশ্রুতিবদ্ধ করতে, আপনাকে আবার সূচীতে ফাইলগুলি যুক্ত করতে হবে ( git add ...)।
--softসূচক বা কাজের গাছ স্পর্শ করে না । আপনার সমস্ত ফাইল যেমন ছিল তেমন অক্ষত --mixedতবে সমস্ত পরিবর্তনগুলি changes to be committedগিট স্ট্যাটাসের সাথে প্রদর্শিত হয় (অর্থাত্ প্রতিশ্রুতি দেওয়ার প্রস্তুতিতে চেক ইন করা হয়েছে)। আপনি যখন বুঝতে পারেন যে আপনি কিছু খারাপ প্রতিশ্রুতি করেছেন তখন এটি ব্যবহার করুন, তবে কাজটি ভাল - আপনাকে যা করতে হবে তা অন্যরকমভাবে পুনরায় স্বীকার করতে হবে। সূচকটি অচ্ছুত রয়েছে, তাই আপনি চাইলে সাথে সাথে প্রতিশ্রুতিবদ্ধ করতে পারেন - ফলস্বরূপ প্রতিশ্রুতিতে পুনরায় সেট করার আগে আপনি যেখানে ছিলেন সেখানে একই রকম সামগ্রী থাকবে।
--mergeসম্প্রতি যুক্ত করা হয়েছিল এবং এটি ব্যর্থ মার্জটিকে বাতিল করতে আপনাকে সহায়তা করার উদ্দেশ্যে intended এটি প্রয়োজনীয় কারণ কারণ git mergeযতক্ষণ না এই সংশোধনগুলি মার্জ দ্বারা প্রভাবিত না হওয়া ফাইলগুলিতে থাকে ততক্ষণ আপনি কোনও নোংরা কাজের গাছের সাথে (স্থানীয় পরিবর্তনের সাথে একটি) একত্রীকরণের চেষ্টা করতে দেবেন। git reset --mergeসূচকটি পুনরায় সেট করে (যেমন --mixed- সমস্ত পরিবর্তন স্থানীয় পরিবর্তন হিসাবে প্রদর্শিত হয়), এবং সংশ্লেষ দ্বারা প্রভাবিত ফাইলগুলি পুনরায় সেট করে তবে অন্যকে একা ফেলে দেয়। এটি আশা করা যায় যে খারাপ সংশ্লেষের আগে এটি কেমন ছিল সেটিতে সবকিছু পুনরুদ্ধার করবে। আপনি সাধারণত এটি git reset --merge(অর্থ git reset --merge HEAD) হিসাবে ব্যবহার করবেন কারণ আপনি কেবল সংযুক্তি পুনরায় সেট করতে চান, প্রকৃতপক্ষে শাখাটি সরানো নয়। ( HEADমার্জটি ব্যর্থ হওয়ার পরে এখনও আপডেট হয়নি)
আরও কংক্রিট হওয়ার জন্য, ধরুন আপনি ফাইল এ এবং বি সংশোধন করেছেন এবং আপনি একটি শাখায় মার্জ করার চেষ্টা করেছেন যা ফাইল সি এবং ডি সংশোধিত করেছে মার্জটি কোনও কারণে ব্যর্থ হয়েছে এবং আপনি এটিকে বাতিল করতে চান। আপনি ব্যবহার git reset --merge। এটি সি এবং ডি কীভাবে তাদের মধ্যে ছিল তা ফিরিয়ে এনেছে HEAD, তবে আপনার পরিবর্তনগুলি একা এবং বিতে একা ফেলে দেয়, যেহেতু তারা একীভূত হওয়ার চেষ্টা করার অংশ ছিল না।
আরো জানতে চান?
আমি মনে করি এটির man git resetজন্য সত্যিই বেশ ভাল - সম্ভবত যদিও গিট তাদের পক্ষে সত্যিকার অর্থে ডুবে যাওয়ার জন্য কাজ করে সে সম্পর্কে কিছুটা ধারণা দরকার। বিশেষত, আপনি যদি সেগুলি যত্ন সহকারে পড়ার জন্য সময় নেন তবে সেই সমস্ত টেবিলগুলি সমস্ত বিকল্প এবং কেসগুলির জন্য সূচক এবং কাজের গাছের ফাইলগুলির স্টেটের বিবরণ দেয় very (তবে হ্যাঁ, তারা খুব ঘন - তারা উপরের তথ্যগুলির একটি অত্যন্ত সংক্ষিপ্ত আকারে প্রকাশ করছে))
অদ্ভুত স্বরলিপি
"অদ্ভুত স্বরলিপি" ( HEAD^এবং HEAD~1) আপনি উল্লেখ করেছেন কেবল হ্যাশ নাম ব্যবহার না করেই কমিটগুলি নির্দিষ্ট করার জন্য একটি শর্টহ্যান্ড 3ebe3f6। এটি সম্পূর্ণ উদাহরণ এবং সম্পর্কিত বাক্য গঠন সহ গিট-রেভ-পার্সের জন্য ম্যান পৃষ্ঠার "নির্দিষ্টকরণের সংশোধনী" বিভাগে সম্পূর্ণ নথিবদ্ধ । ক্যারেট এবং টিলড আসলে বিভিন্ন জিনিস বোঝায় :
HEAD~সংক্ষিপ্ত HEAD~1এবং এর অর্থ কমিটের প্রথম পিতামাতা। HEAD~2মানে কমিটের প্রথম পিতামাতার প্রথম পিতামাতা। HEAD~n"হেডের আগে এন কমিট" বা "হেডের নবম প্রজন্মের পূর্বপুরুষ" হিসাবে ভাবুন ।
HEAD^(বা HEAD^1) অর্থ কমিটের প্রথম পিতামাতা। HEAD^2মানে কমিটের দ্বিতীয় পিতা বা মাতা। মনে রাখবেন, একটি সাধারণ মার্জ কমিটের দুটি পিতা-মাতা থাকে - প্রথম পিতামাতা হ'ল মার্জড-ইন কমিট and সাধারণভাবে, সংশ্লেষগুলি আসলে নির্বিচারে অনেক বাবা-মা থাকতে পারে (অক্টোপাস মার্জ)।
^এবং ~অপারেটরদের একসঙ্গে গ্রথিত করা যেতে পারে, হিসাবে HEAD~3^2, এর তৃতীয় প্রজন্মের পূর্বপুরুষ দ্বিতীয় পিতা বা মাতা HEAD, HEAD^^2, প্রথম পিতা বা মাতা দ্বিতীয় পিতা বা মাতা HEAD, অথবা এমনকি HEAD^^^, যা সমতূল্য HEAD~3।
