আমি একটি মন্তব্যে যা লিখেছি তা প্রসারিত করছি
সাধারণ নিয়মটি হ'ল আপনি প্রকাশিত ইতিহাস পুনর্লিখন (পরিবর্তন) করা উচিত নয়, কারণ এটির উপর কারও কারও ভিত্তি তৈরি হতে পারে। আপনি যদি ইতিহাস পুনর্লিখন (পরিবর্তন) করেন তবে আপনি তাদের পরিবর্তনগুলি মার্জ করে এবং তাদের আপডেট করার ক্ষেত্রে সমস্যা তৈরি করবেন।
সুতরাং সমাধানটি হ'ল একটি নতুন প্রতিশ্রুতি তৈরি করা যা আপনাকে পরিত্রাণ পেতে চাইলে এমন পরিবর্তনগুলি ফিরিয়ে দেয় । আপনি গিট রিভার্ট কমান্ড ব্যবহার করে এটি করতে পারেন ।
আপনার নিম্নলিখিত পরিস্থিতি রয়েছে:
এ <- বি <- সি <- ডি <- মাস্টার <- হেড
(এখানে তীরগুলি নির্দেশকের দিক নির্দেশ করে: কমিটের ক্ষেত্রে "পিতামাতা" রেফারেন্স, শাখা প্রধানের (শাখা রেফ) ক্ষেত্রে শীর্ষ প্রতিশ্রুতি এবং হেড রেফারেন্সের ক্ষেত্রে শাখার নাম)।
আপনার যা তৈরি করতে হবে তা হ'ল:
এ <- বি <- সি <- ডি <- [(বিসিডি) ^ - 1] <- মাস্টার <- হেড
যেখানে "[(বিসিডি) ^ - 1]" মানে সেই প্রতিশ্রুতি যা বি, সি, ডি পরিবর্তনের ক্ষেত্রে পরিবর্তিত হয় গণিত আমাদের বলে যে (বিসিডি) ^ - 1 = ডি ^ -1 সি ^ -1 বি ^ -1, সুতরাং আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে প্রয়োজনীয় পরিস্থিতি পেতে পারেন:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
বিকল্প সমাধান হ'ল প্রতিশ্রুতি A এর সামগ্রীগুলি চেকআউট করা এবং এই রাষ্ট্রটি প্রতিশ্রুতিবদ্ধ:
$ git checkout -f A -- .
$ git commit -a
তাহলে আপনার নিম্নলিখিত পরিস্থিতি হবে:
এ <- বি <- সি <- ডি <- এ '<- মাস্টার <- হেড
কমিট এ'র কমিট এ এর মতো একই বিষয়বস্তু রয়েছে তবে এটি একটি আলাদা কমিট (কমিট বার্তা, পিতামাতাদের, কমিটের তারিখ)।
জেফ Ferland দ্বারা সমাধান চার্লস বেইলি দ্বারা পরিবর্তন একই ধারণা উপর তৈরী করে, কিন্তু ব্যবহার Git রিসেট :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(দূরবর্তী শাখাটি মাস্টার হিসাবে ধরে নিচ্ছি)। হ্যাঁ, আপনি যে কোনও প্রতিশ্রুতি ঠেলে দিতে পারেন।