গিটের একটি বিশেষ প্রতিশ্রুতি পূর্বাবস্থায় ফিরুন যা দূরবর্তী ভাণ্ডারে চাপানো হয়েছে


788

কোনও নির্দিষ্ট প্রতিশ্রুতি পূর্বাবস্থায় ফেলার সহজতম উপায় কী:

  • মাথা বা মাথা না
  • দূরবর্তী জায়গায় ধাক্কা দেওয়া হয়েছে।

কারণ এটি যদি সর্বশেষ প্রতিশ্রুতি না হয়,

git reset HEAD

কাজ করে না এবং এটিকে একটি প্রত্যন্ত অঞ্চলে ঠেলে দেওয়া হয়েছে,

git rebase -i

এবং

git rebase --onto

রিমোটগুলিতে কিছু সমস্যা সৃষ্টি করবে।

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

অন্য কথায়, নিম্নলিখিত এসএনএন কমান্ডের গিট সমতুল্য কী :

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

যা একটি নতুন প্রতিশ্রুতি হিসাবে those সংশোধনীর সমস্ত পরিবর্তনকে বিপরীত করে 295 থেকে 302 থেকে সমস্ত পরিবর্তন সরিয়ে দেয়।

svn merge -c -302 ^/trunk

যা 302 কমিটকে পূর্বাবস্থায় ফিরে আসে, অবশ্যই এমন আরও একটি প্রতিশ্রুতি যুক্ত করে যে বিপরীতগুলি সেই সম্পর্কিত প্রতিশ্রুতি থেকে পরিবর্তনগুলিকে একত্রিত করে।

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

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

উত্তর:


1210

ব্যবহার করে কমিটের হ্যাশ শনাক্ত করুন git log, তারপরে git revert <commit>একটি নতুন প্রতিশ্রুতি তৈরি করতে ব্যবহার করুন যা এই পরিবর্তনগুলি সরিয়ে দেয়। একটি উপায়ে, git revertএর কথোপকথন git cherry-pick- পরবর্তীটি প্যাচটি প্রযোজ্য একটি শাখায় প্রয়োগ করে যা এটি অনুপস্থিত, পূর্ববর্তী এটি একটি শাখা থেকে এটি সরিয়ে দেয়।


237
আপনি যদি কোডটি ফিরে চান তবে -n স্যুইচটি ব্যবহার করুন, তবে স্বয়ংক্রিয়ভাবে আবার প্রতিশ্রুতিবদ্ধ না
জয়গুবি

17
"এম" বিকল্পটি কী করবে? আমি গিটটি 8213f7d রিভার্ট করার চেষ্টা করেছি কিন্তু এর পরিবর্তে এটি পেয়েছি: ত্রুটি: প্রতিশ্রুতি 8213f7 داد1ed546b434a0d8a64cb783b530a5a30 একীভূত তবে কোনও-এম বিকল্প দেওয়া হয়নি। মারাত্মক: প্রত্যাবর্তন ব্যর্থ হয়েছে
ম্যালকম


31
যে কেউ মার্জটি ফিরিয়ে নিতে চায় তার জন্য একটি সতর্কতা: গিট রিভার্ট করা সমস্ত ডেটা পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনবে (অর্থাত্ ফাইলের পরিবর্তনগুলি পুনরায় উলটে যাবে), তবে মার্জটি এখনও ইতিহাসে রয়ে গেছে remains এর কারণে যদি আপনি পরে আবার সেই একই শাখাকে মার্জ করার চেষ্টা করেন তবে এতে বিবর্তিত মার্জ হওয়ার আগে মার্জিং শাখা থেকে কোনও চুক্তি অন্তর্ভুক্ত হবে না। এটি সম্ভবত আপনি যা চান তা নয়। আবার পুরোপুরি শাখাটি মার্জ করার জন্য আপনাকে প্রথমে সেই প্রতিশ্রুতিটি ফিরিয়ে নিতে হবে যেখানে আপনি আসল সংশ্লেষটি উল্টেছিলেন। এখানে আরও জানুন: কার্নেল.মিরিয়ারস.পায়ার.com
pub

3
@Etreworgy এর মন্তব্যে লিংকটি 404 I আমার সন্দেহ হয় এটি লিঙ্কটির একটি আধুনিক সংস্করণ: কার্নেল.আর
টিম স্মিথ

368

আমি যে অটো কমিট করি তা পছন্দ করি না git revert, তাই এটি কারওর জন্য সহায়ক হতে পারে।

আপনি যদি কেবল সংশোধিত ফাইলগুলি স্বতঃ-প্রতিশ্রুতি না দিয়ে চান তবে আপনি ব্যবহার করতে পারেন--no-commit

% git revert --no-commit <commit hash>

যা একই -n

% git revert -n <commit hash>

9
আপনি git reset HEAD~1 --softযদি ইতিমধ্যে ছাড়া হয়ে যান তবে আপনিও করতে পারেন-n
ড্যানিয়েল

1
তবে git reset HEAD~nমাথা থেকে অবিচ্ছিন্নভাবে পৌঁছতে না পারে এমন কোনও প্রতিশ্রুতি পূর্বাবস্থায় ফেলার সমাধান করবে না। কোয়েরিটি কোনও নির্দিষ্ট প্রতিশ্রুতি প্রত্যাহার করা।
sangeethkumarp

আমি এই সমাধানটি ব্যবহার করেছি তবে রিভার্টের মাঝামাঝি একটি দ্বন্দ্বকে আঘাত করেছি। দ্বন্দ্ব নিরসন করার পরে, git revert --continueএটি আমার নির্দেশ মতো করেছিলাম। এটি কাজ করেছে, তবে দুঃখের সাথে ফলাফলগুলি প্রতিশ্রুতিবদ্ধ। সম্ভবত আমার করার দরকার ছিল git revert --no-commit --continue
mareoraft

1
ড্যানিয়েলের মন্তব্য @ সানজিথকুমার্প হ'ল একটি অতিরিক্ত পদক্ষেপ যা আপনি এরপরে git revertভুলে গেলে আপনি গ্রহণ করতে পারেন -n; কারণ এই মুহুর্তে শেষ প্রতিশ্রুতিটি হ'ল বিপরীতকরণ, সুতরাং নরম রিসেটটি সেই প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরিয়ে আনবে তবে রিভার্টের সম্পর্কিত কোড পরিবর্তনগুলি নয়
অলিভার

@ ড্যানিয়েল আমার জন্য মন্তব্য কাজের মাধ্যমে সমাধান সরবরাহ করেছেন ধন্যবাদ অনেক '' গিট রিসেট হেড ~ 1
মোঃ আবু

41

কারণ এটি ইতিমধ্যে ঠেলাঠেলি করা হয়েছে, আপনার সরাসরি ইতিহাসের কারসাজি করা উচিত নয়। git revertনতুন প্রতিশ্রুতি ব্যবহার করে একটি প্রতিশ্রুতিবদ্ধ থেকে নির্দিষ্ট পরিবর্তনগুলি ফিরিয়ে আনবে, যাতে প্রতিশ্রুতিবদ্ধ ইতিহাসের সার্থকতা না ঘটে।


1

আপনি যে প্রতিশ্রুতিটি প্রত্যাহার করতে চান তা হ'ল মার্জড কমিট (ইতিমধ্যে মার্জড হয়ে গেছে), তবে আপনার নীচের মত প্রদর্শিত হয় -m 1বা -m 2বিকল্পটি করা উচিত । এটি গিটকে জানাতে দেবে যে মার্জড কমিটগুলি কোনটি ব্যবহার করতে বাধ্য হয়। আরও বিশদ এখানে পাওয়া যাবে ।

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