উত্তর:
এই তিনটি আদেশের সম্পূর্ণ ভিন্ন উদ্দেশ্য রয়েছে have তারা এমনকি দূরবর্তী অনুরূপ নয়।
git revertএই কমান্ডটি একটি নতুন প্রতিশ্রুতি তৈরি করে যা পূর্ববর্তী কমিট থেকে পরিবর্তনগুলি পূর্বাবস্থায় ফেলে। এই কমান্ডটি প্রকল্পটিতে নতুন ইতিহাস যুক্ত করেছে (এটি বিদ্যমান ইতিহাসকে পরিবর্তন করে না)।
git checkoutএই কমান্ডটি সংগ্রহশালা থেকে সামগ্রীটি চেক আউট করে আপনার কার্যক্ষেত্রে রাখে। কমান্ডটি কীভাবে চাওয়া হয়েছিল তার উপর নির্ভর করে এর অন্যান্য প্রভাবও পড়তে পারে। উদাহরণস্বরূপ, আপনি বর্তমানে কোন শাখায় কাজ করছেন তা এটিও পরিবর্তন করতে পারে। এই আদেশটি ইতিহাসে কোনও পরিবর্তন করে না।
git resetএই আদেশটি আরও কিছুটা জটিল। এটি কীভাবে ডাকা হয় তার উপর নির্ভর করে এটি বিভিন্ন ধরণের বিভিন্ন জিনিস করে। এটি সূচকটি পরিবর্তন করে (তথাকথিত "স্টেজিং এরিয়া")। বা এটি পরিবর্তিত হয় যা কোন শাখা প্রধান প্রতিশ্রুতি দেয়। এই কমান্ডটি বিদ্যমান ইতিহাসকে বদলে দিতে পারে (একটি শাখার উল্লেখ যে প্রতিশ্রুতিবদ্ধ তা পরিবর্তন করে)।
যদি প্রকল্পের ইতিহাসে কোথাও কোনও প্রতিশ্রুতিবদ্ধ হয়ে থাকে এবং আপনি পরে সিদ্ধান্ত নেন যে প্রতিশ্রুতিটি ভুল এবং এটি করা উচিত হয়নি, তবে git revertকাজের জন্য হাতিয়ার। এটি খারাপ প্রতিশ্রুতি দ্বারা প্রবর্তিত পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনবে, ইতিহাসের "পূর্বাবস্থা" রেকর্ড করবে।
আপনি যদি আপনার কার্যক্ষম গাছের মধ্যে কোনও ফাইল পরিবর্তন করে থাকেন তবে পরিবর্তনের প্রতিশ্রুতি না রাখেন, তবে আপনি git checkoutফাইলটির একটি নতুন-সংগ্রহস্থল অনুলিপিটি চেকআউট করতে ব্যবহার করতে পারেন।
যদি আপনি কোন অঙ্গীকারবদ্ধ হয়ে থাকেন তবে অন্য কারও সাথে ভাগ করে না নিলে এবং আপনি সিদ্ধান্ত নিতে চান যে আপনি এটি চান না, তবে আপনি git resetইতিহাসটি পুনরায় লেখার জন্য ব্যবহার করতে পারেন যাতে দেখে মনে হয় যে আপনি কখনও এই প্রতিশ্রুতি করেন নি।
এগুলি সম্ভাব্য ব্যবহারের কিছু দৃশ্য ari অন্যান্য কমান্ড রয়েছে যা কিছু পরিস্থিতিতে কার্যকর হতে পারে এবং উপরের তিনটি কমান্ডের অন্যান্য ব্যবহারও রয়েছে।
git resetএবং git checkoutকরতে পারে can এগুলি "দূরবর্তী দিক থেকেও অনুরূপ নয়" বলা কেবলমাত্র অত্যুক্তি অত্যুক্তি নয়: এটি এমনকি দূরবর্তীভাবে সত্যও নয়। এই দুটি কমান্ড অনেকগুলি বিভিন্ন জিনিস করতে পারে, যার কয়েকটি সম্পূর্ণরূপে ওভারল্যাপ হয়। উদাহরণ: git reset --hardএবং git checkout -- .ঠিক একই জিনিসটি করবে। এবং যুক্তিযুক্তভাবে বলতে, git reset --hard <path>এবং git checkout <path>ঠিক একই জিনিস করা উচিত - গিট তবে আপনাকে এটি করতে বাধা দেয়। এই দুটি কমান্ড বিভ্রান্ত করা খুব সহজ।
git reset --hard <path>যেমন করতে পারেন git checkout <path>ঠিক তেমন আপনি করতে পারবেন না কারণ দুটি কমান্ড সম্পূর্ণ ভিন্ন কিছু করে । git resetগিটকে হেডকে একটি পৃথক প্রতিশ্রুতিতে স্থানান্তরিত করতে বলে। git checkoutঅন্যদিকে গিটকে হেডের সাথে কিছু করার জন্য মোটেই জিজ্ঞাসা করে না। এটি হেড একা ফেলে দেয় এবং কেবল একটি ফাইল পরীক্ষা করে। হ্যাঁ, আপনি এগুলি এমনভাবে তৈরি করতে পারেন যাতে তাদের একই রকম প্রভাব থাকে। তবে তারা আসলে যা করে তা সম্পূর্ণ আলাদা।
ধরা যাক আপনার কমিট করেছেন:
C
B
A
git revert B, এমন একটি প্রতিশ্রুতি তৈরি করবে যা পূর্বে পরিবর্তিত হয় B।
git revert A, এমন একটি প্রতিশ্রুতি তৈরি করবে যা পরিবর্তিত অবস্থায় পূর্বাবস্থায় ফিরে আসে তবে পরিবর্তনের ক্ষেত্রে Aস্পর্শ করবে নাB
মনে রাখবেন যে পরিবর্তনগুলি যদি পরিবর্তিত Bপরিবর্তনের উপর নির্ভরশীল হয় Aতবে এর রিভার্ট করা Aসম্ভব নয়।
git reset --soft A, প্রতিশ্রুতিবদ্ধ ইতিহাস এবং সংগ্রহস্থল পরিবর্তন করবে; মঞ্চায়ন এবং কার্যকারী ডিরেক্টরি এখনও স্থিতিতে থাকবে C।
git reset --mixed A, প্রতিশ্রুতিবদ্ধ ইতিহাস, সংগ্রহশালা এবং মঞ্চ পরিবর্তন করবে; ওয়ার্কিং ডিরেক্টরি এখনও অবস্থায় থাকবে C।
git reset --hard A, প্রতিশ্রুতিবদ্ধ ইতিহাস, সংগ্রহশালা, মঞ্চায়ন এবং কার্যকারী ডিরেক্টরি পরিবর্তন করবে; আপনি Aসম্পূর্ণরূপে ফিরে যেতে হবে ।
git revertআগের কমিট পূর্বাবস্থায় ফেরাতে ব্যবহৃত হয়। গিট-এ, আপনি পূর্বের প্রতিশ্রুতি পরিবর্তন করতে বা মুছতে পারবেন না। (আসলে আপনি পারেন তবে এটি সমস্যার সৃষ্টি করতে পারে)) সুতরাং পূর্ববর্তী প্রতিশ্রুতি সম্পাদনা করার পরিবর্তে প্রত্যাবর্তন একটি নতুন প্রতিশ্রুতি প্রবর্তন করে যা পূর্ববর্তীটিকে বিপরীত করে।git reset আপনার কাজের ডিরেক্টরিতে পরিবর্তনগুলি পূর্বাবস্থায়িত করতে ব্যবহৃত হয় যা এখনও কমিট করা হয়নি।git checkoutআপনার বর্তমান কার্যকারী গাছটিতে অন্য কোনও কমিট থেকে ফাইল অনুলিপি করতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে ফাইলটি প্রতিশ্রুতি দেয় না।git reset --softকেবলমাত্র হেডকে git reset --hardপুনরায় সেট করে, হেড এবং আপনার কার্যকরী ডিরেক্টরি পুনরায় সেট করে।
git checkout আপনার কাজের গাছ পরিবর্তন করে,git reset আপনি যে শাখার দিকে ইঙ্গিত করছেন সেটিকে পরিবর্তন করেgit revert পূর্বাবস্থায় ফিরে আসা পরিবর্তনগুলি যুক্ত করে।git reset কোনও শাখা যে প্রতিশ্রুতি দেখায় কেবল তা সংশোধন করে না , এটি সূচী থেকে ফাইলগুলি আনস্টেজ করার জন্যও ব্যবহৃত হয় এবং ওয়ার্কিং কপিটি git reset --mixed(ডিফল্ট) দিয়ে সংশোধন করতে পারে ।
পুনরায় সেট করুন - প্রতিশ্রুতিবদ্ধ স্তরে, পুনরায় সেট করা একটি শাখার ডগাটিকে একটি ভিন্ন প্রতিশ্রুতিতে স্থানান্তরিত করার একটি উপায়। এটি বর্তমান শাখা থেকে কমিটগুলি অপসারণ করতে ব্যবহার করা যেতে পারে।
প্রত্যাবর্তন - প্রত্যাবর্তন একটি নতুন প্রতিশ্রুতি তৈরি করে একটি প্রতিশ্রুতি পূর্বাবস্থায় ফিরে আসে । পরিবর্তনগুলি পূর্বাবস্থায় ফেলার এটি একটি নিরাপদ উপায়, কারণ এতে প্রতিশ্রুতিবদ্ধ ইতিহাস পুনরায় লেখার কোনও সম্ভাবনা নেই। এটি গিট রিসেটের সাথে বৈসাদৃশ্য করুন যা বিদ্যমান কমিটের ইতিহাসকে বদলে দেয়। এই কারণে, গিট রিভার্ট একটি পাবলিক শাখায় পরিবর্তনগুলি পূর্বাবস্থায় ফেলার জন্য ব্যবহার করা উচিত এবং গিট পুনরায় সেটটি কোনও বেসরকারী শাখায় পরিবর্তনগুলি পূর্বাবস্থায় ফেলার জন্য সংরক্ষণ করা উচিত।
আপনি এই লিঙ্কটি একবার দেখতে পারেন- রিসেট, চেকআউট এবং রিভার্ট
আপনি যদি গাছটি ভেঙে ফেলেছেন তবে কোডটি প্রতিশ্রুতিবদ্ধ না করে আপনি ব্যবহার করতে পারেন git resetএবং আপনি যদি কেবল একটি ফাইল পুনরুদ্ধার করতে চান তবে আপনি ব্যবহার করতে পারেন git checkout।
আপনি যদি গাছটি ভেঙে দিয়ে কোডটি প্রতিশ্রুতিবদ্ধ করেন তবে আপনি ব্যবহার করতে পারেন git revert HEAD।
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html