আমি কীভাবে ফেরত গিটের প্রতিশ্রুতি "আন-রিভার্ট" করব?


483

এমন একটি পরিবর্তন দেওয়া হয়েছে যা ব্যবহার করে প্রতিশ্রুতিবদ্ধ হয়েছে commitএবং তারপরে আবার ব্যবহার করে ফেরানো হয়েছে revert, তারপরে ফিরে যাওয়াটিকে পূর্বাবস্থায় ফিরিয়ে আনার সর্বোত্তম উপায় কোনটি?

আদর্শভাবে, এটি একটি নতুন প্রতিশ্রুতি দিয়ে করা উচিত, যাতে ইতিহাস পুনরায় লেখার জন্য না হয়।



এখানে সম্ভাব্য সদৃশ হওয়ার জন্য একটি মন্তব্য @ ফুচলভ এখানে উল্লেখ করেছেন। একজনকে অবশ্যই মূল হিসাবে চিহ্নিত করতে হবে এবং একটিকে অবশ্যই দ্বৈত হিসাবে চিহ্নিত করতে হবে
জন ডেমেট্রিউ

@ জনডেমিট্রিউ উত্তর নেই যে উত্তরগুলির আরও ভাল সেট রয়েছে এমন প্রশ্নটি উন্মুক্ত রাখা উচিত। সময় এখানে প্রাসঙ্গিক নয় কীভাবে সদৃশ প্রশ্নগুলি পরিচালনা করা উচিত?
ফুক্লভ

আমি সময় সম্পর্কে বলিনি। আমি এই সমস্যাটি সম্পর্কে দুজনের একটিতে কেবল মন্তব্য করতেই পেরেছি
জন ডেমেট্রিউ

উত্তর:


384

আপনি যদি এখনও এই পরিবর্তনটি ঠেকেন না, git reset --hard HEAD^

অন্যথায়, রিভার্টটি ফিরিয়ে দেওয়া পুরোপুরি ঠিক আছে।

আর একটি উপায় git checkout HEAD^^ -- .এবং তারপরে git add -A && git commit


8
মনে রাখবেন যে আপনি যদি মাস্টার ব্রাঞ্চে তাত্ক্ষণিকভাবে আসল পরিবর্তনগুলি প্রয়োগ না করেই আন-রিভার্ট করতে চান তবে আপনি (1) মুছে ফেলা থাকলে মূল শাখাটি পুনরুদ্ধার করতে পারেন, (২) অ্যাডামের দ্বারা উল্লিখিত হিসাবে ফিরতি শাখায় "রিভার্ট" ক্লিক করুন , তারপরে ( 3) ফলাফলের PR এর শিরোনামে "সম্পাদনা" এ ক্লিক করুন এবং লক্ষ্য শাখাটি মাস্টারের পরিবর্তে মূল শাখায় পরিবর্তন করুন। পূর্বে উল্টানো পরিবর্তনগুলি কার্যকর করতে এখন আপনার আসল শাখাটি পুনরায় একত্রিত হতে পারে।
পলজম

1
দয়া করে নোট করুন এটি কার্যকারী গাছ এবং সূচকের সমস্ত পরিবর্তন সরিয়ে ফেলবে। আপনি যে পরিবর্তন হারাতে চান না সেগুলি সংরক্ষণ করতে গিট স্ট্যাশ ব্যবহার করুন।
zpon

3
চেকআউট ও& কমিট পদ্ধতির সুবিধা কী? দেখে মনে হয় যে সাধারণ ক্ষেত্রে git cherry-pickবা বিকল্পভাবে git revertকোনও প্রত্যাবর্তন ফিরিয়ে আনার সবচেয়ে সোজা-এগিয়ে উপায়।
রবার্ট জ্যাক

5
আমি মনে করি যে কীভাবে: Otherwise, reverting the revert is perfectly fine.এবং তারপরে কী git checkout HEAD^^ -- .করছে তা ব্যাখ্যা করতে এটি সহায়ক হবে ।
টড

3
শুভ প্রভু, ব্যবহার করবেন না git add -A... যতক্ষণ না আপনি সংস্করণ নিয়ন্ত্রণে প্রতিটি ফাইল যুক্ত করতে চান, যা সম্ভবত আপনি চান তা নয়।
কাইতাইন

473

git cherry-pick <original commit sha>
মূল প্রতিশ্রুতিটির অনুলিপি তৈরি করবে, কমিটটি পুনরায় প্রয়োগ করুন

প্রত্যাবর্তন ফিরিয়ে দেওয়া একই কাজ করবে, মেসির প্রতিশ্রুতি বার্তা সহ:
git revert <commit sha of the revert>

এই যেকোন git pushউপায়েই ইতিহাসের ওভাররাইটিং ছাড়াই আপনাকে অনুমতি দেবে , কারণ এটি প্রত্যাবর্তনের পরে একটি নতুন প্রতিশ্রুতি তৈরি করে।
কমিট শে টাইপ করার সময় আপনার সাধারণত প্রথম 5 বা 6 টি অক্ষর প্রয়োজন:
git cherry-pick 6bfabc


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

6
@ টিমো স্পষ্ট করে বলতে গেলে, গৃহীত উত্তরে আমি যে সমাধানটি ব্যবহার করেছি ("রিভার্টিং ফিরিয়ে দিচ্ছি") রয়েছে এবং আমার প্রশ্নের কয়েক ঘন্টার মধ্যে পোস্ট করা হয়েছিল - এই উত্তরটির চেয়ে 3 বছর আগে একটি পরিষ্কার । অতএব, চেক চিহ্ন।
জিমিদীজু

6
@ জিমিদিজু আমি জানি যে আমি 3 বছর দেরিতে এসেছি, আমি কেবল চেয়েছিলাম লোকেরা আরও ভাল উত্তর দেখতে গুগল অনুসন্ধান থেকে এখানে আসবে
স্টিফান

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

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

28

রিভার্ট কমিট গিটের মতো অন্যান্য প্রতিশ্রুতির মতোই। অর্থ, আপনি এটিকে আবার ফিরিয়ে দিতে পারেন:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

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

আমাদের দলে, মূলত ইতিহাসকে পরিষ্কার রাখার জন্য মূল শাখায় প্রতিশ্রুতিবদ্ধ রিভার্ট কমিটের উপর একটি রিভার্ট ব্যবহার করার একটি নিয়ম রয়েছে , যাতে আপনি দেখতে পান যে কোন প্রতিশ্রুতি কী পরিবর্তন করে তা:

      7963f4b2a9d   Revert "Revert "OD-9033 parallel reporting configuration"
      "This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
                    ...
     a0e5e86d3b6    Revert "OD-9055 paralel reporting configuration"
     This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
                ...
     Merge pull request parallel_reporting_dbs to master* commit 
    '648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'

এইভাবে, আপনি ইতিহাসটি সন্ধান করতে পারেন এবং পুরো কাহিনীটি বের করতে পারেন এবং এমনকি উত্তরাধিকার সম্পর্কে অজানা যারা নিজেরাই এটি ব্যবহার করতে পারেন। অন্যদিকে, যদি আপনি চেরি-বাছাই করে বা জিনিসটি পুনরায় ব্যবহার করেন তবে এই মূল্যবান তথ্যটি (যদি আপনি এটি মন্তব্যে অন্তর্ভুক্ত না করেন) হারিয়ে যায়।

স্পষ্টতই, যদি কোনও প্রতিশ্রুতি ফেরত দেওয়া হয় এবং একবারের বেশি পুনরায় উল্টানো হয় তবে তা যথেষ্ট অগোছালো হয়ে যায়।


14

রিভার্ট ফিরিয়ে নেওয়া কৌশলটি করবে

উদাহরণ স্বরূপ,

আপনি abcdefযদি প্রতিশ্রুতি ghijklফেরান যখন আপনার প্রতিশ্রুতিবদ্ধ এবং যদি আপনার প্রতিশ্রুতিবদ্ধ হয় abcdefতবে চালনা করুন:

git revert ghijkl

এটি রিভার্টটি ফিরিয়ে দেবে


4

এটা আমার কাছে বোকা লাগছে। তবে আমি একই পরিস্থিতিতে ছিলাম এবং আমি ফেরত প্রতিশ্রুতিগুলির জন্য ফিরে আসি। আমি সংখ্যাটি রিভার্ট করেছিলাম তাই প্রতিটি 'রিভার্ট কমিট' এর জন্য আমাকে রিভার্ট করতে হয়েছিল।

এখন আমার কমিটের ইতিহাসটি কিছুটা অদ্ভুত দেখাচ্ছে looks

অদ্ভুত ইতিহাস

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


4
: তুমি আমার আরেক প্রশ্নের উত্তর আগ্রহী হতে পারেন stackoverflow.com/questions/10415565/...
JimmidyJoo

2
আপনি স্বয়ংক্রিয় প্রতিশ্রুতি এড়াতে এবং প্রত্যাবর্তন করার সময় --ন-কমিট পতাকা ব্যবহার করে এবং তারপরে প্রাসঙ্গিক বার্তাটি দিয়ে প্রতিশ্রুতিবদ্ধ করতে বাছাই করতে বাছাই করতে পারেন
ডেভিড বারদা

গিট রিভার্ট ব্যবহার করার সময় আপনি একাধিক কমিট আইডি নির্দিষ্ট করতে পারেন (তাদের মনে হয় সঠিক ক্রমে থাকতে হবে)।
আলেেক্স গবি

আমি কি গিথুব ডেস্কটপ থেকে এটি করতে পারি?
গিলিয়াম এফ

4

আমি এটি কীভাবে করেছি তা এখানে:
শাখাটি যদি এমন my_branchnameএকত্রীকরণে অন্তর্ভুক্ত করা হত যা প্রত্যাহার হয়েছিল। এবং আমি প্রত্যাহার করতে চেয়েছিলামmy_branchname :

আমি প্রথমে একটি git checkout -b my_new_branchnameথেকে my_branchname
তারপরে আমি git reset --soft $COMMIT_HASHযেখানে $COMMIT_HASHপ্রতিশ্রুতিবদ্ধ হওয়ার হ্যাশ ঠিক সেখানেই করছি যেখানে প্রথম প্রতিশ্রুতি দেওয়ার আগেmy_branchname (দেখুন git log)
তারপরে আমি একটি নতুন প্রতিশ্রুতিবদ্ধ করব git commit -m "Add back reverted changes"
তারপরে আমি নতুন শাখাটি ধাক্কা দিই তারপর আমি নতুন শাখার git push origin new_branchname
জন্য একটি টান অনুরোধ জানালাম।


যখন অনেকগুলি "চেরি-পিক" করতে হবে তখন যাওয়ার উপায়। কেন এই উত্তরটির খুব কম আপত্তি আছে তা আমি পাই না
ফান্ডহোর

2

বা আপনি করতে পারেন git checkout -b <new-branch>এবং git cherry-pick <commit>আগে এবং প্রতিশ্রুতি git rebaseড্রপ revert। আগের মত টানুন অনুরোধ পাঠান


1

আপনি যদি "রিভার্টিং এ রিভার্টিং" ধারণাটি পছন্দ করেন না (বিশেষত যখন এর অর্থ অনেক কমিটের ইতিহাসের তথ্য হারাতে হয়), আপনি সর্বদা "ত্রুটিযুক্ত মার্জটি রিভার্টিং" সম্পর্কে গিট ডকুমেন্টেশনে যেতে পারেন ।

নিম্নলিখিত শুরু পরিস্থিতি দেওয়া

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(ডাব্লু হ'ল আপনার মার্জ এম এর প্রাথমিক বিপর্যয়; ডি এবং ই আপনার প্রাথমিক ভাঙ্গা বৈশিষ্ট্য শাখা / প্রতিশ্রুতিতে সংশোধন করা হয়েছে)

আপনি এখন কেবল এ থেকে E এর প্রতিশ্রুতিগুলি পুনরায় খেলতে পারেন, যাতে তাদের কোনওটিই "উল্লিখিত" একত্রিত হওয়ার সাথে যুক্ত হয় না:

$ git checkout E
$ git rebase --no-ff P

আপনার শাখার নতুন অনুলিপিটি এখন masterআবার একত্রিত হতে পারে :

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E

ডক লিঙ্কের জন্য ভাল ধারণা এবং ধন্যবাদ। আমরা সাধারণত ফিরে আসার আগে মাস্টারের সাথে প্রত্যাবর্তন করি তবে গিটটি তখন মনে হয় যে 'এ', বি ', সি' এর আগের মতো এবং আমার এখন ডাব্লু (ই পেস্টবিন ) পরে ডি আছে । এটি সমাধান করার জন্য পরামর্শ?
ক্রিস্টোফার বাক্কিজর্ড

0

প্রতিশ্রুতিবদ্ধতার পরে ফিরিয়ে দেওয়া হয়েছে এমন অচিরাচরিত ও পর্যায়ক্রমে পরিবর্তনগুলি ফিরে পেতে:

git reset HEAD@{1}

সমস্ত স্টেস্টেড মোছা পুনরুদ্ধার করতে:

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