গিট রিভার্ট কীভাবে ব্যবহার করবেন


107

কিভাবে git revertব্যবহার করা হয়?

এটি কোনও সদৃশ প্রশ্নের মতো শোনাতে পারে তবে লোকেরা যখন এটি জিজ্ঞাসা করে, তখন প্রায়শই প্রতিক্রিয়া দেখা যায়, গিটে কোনও এসএএইচ হ্যাশ দ্বারা প্রতিশ্রুতিতে প্রত্যাবর্তনgit reset হিসাবে ব্যবহার করুন?

তারপরে যখন কেউ জিজ্ঞাসা করে যে কীভাবে git resetলোকেরা জবাব দিতে পারে বলে গিটgit revert অনুযায়ী আপনার ব্যবহার করা উচিত - কীভাবে রোলব্যাক করবেন

আপনি এটি জানার আগে, 8 জন পৃথক লোক ওপির গাধা সংরক্ষণের নিজস্ব অনন্য উপায় নিয়ে হাজির হয়েছিল, সমস্ত কিছুই আপনার মাথাথেকে।

সুতরাং চেষ্টা করে দেখুন এবং সংক্ষিপ্তটি আটকে দিন এবং একটি ডামি গাইড লিখুন git revert

একটি দৃশ্য: আপনি দু'বার মাস্টার এবং এর খারাপ প্রতিশ্রুতিবদ্ধ করেছেন। আপনি ঠেলাঠেলি করেছেন এবং অন্য লোকেদের আপনার খারাপ পরিবর্তন হয়েছে।

আপনি এটিকে পূর্বাবস্থায় ফিরিয়ে আনতে চান। আপনি নিজে কোডে হ্যান্ড-আনড করতে পারেন এমন কিছু নয়, বলুন কিছু উইজার্ড বা প্যাকেজ ম্যানেজার পুরো জায়গাতেই প্রচুর পরিমাণে স্টাফ বদলেছে - আপনি কেবল এটি কীভাবে ছিল তা ফিরিয়ে দিতে চান।

সোর্স কন্ট্রোল সম্পর্কে এটিই। আমি নিশ্চিত এটি সহজ।

ঠিক আছে, আপনি ব্যবহার করতে যাচ্ছেন git revertকিন্তু কিভাবে?

আর দৌড়ানোর পরে git revertকি আর কিছু করতে হবে? আপনি কি পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে হবে বা সরাসরি রেপোতে প্রতিশ্রুতিবদ্ধ হবে বা কি ??

স্পষ্টতই আপনাকে আবার ঠেলাঠেলি করতে হবে এবং সম্ভবত আপনার দলগুলিতে বল-আপ ঘোষণা করতে হবে।

উত্তর:


119

গিট রিভার্ট একটি নতুন কমিট করে

git revert কেবল একটি নতুন প্রতিশ্রুতি তৈরি করে যা বিদ্যমান অঙ্গীকারের বিপরীত।

এটি ফাইলগুলিকে একই অবস্থায় ফেলে দেয় যেন প্রতিশ্রুতি যে প্রত্যাহার করা হয়েছে তা কখনও উপস্থিত ছিল না। উদাহরণস্বরূপ, নিম্নলিখিত সহজ উদাহরণ বিবেচনা করুন:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

এই উদাহরণে কমিটের ইতিহাসে দুটি কমিট রয়েছে এবং শেষটি একটি ভুল। গিট রিভার্ট ব্যবহার করে:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

লগতে 3 টি কমিট থাকবে:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

তাই যা ঘটেছে তার ধারাবাহিক ইতিহাস রয়েছে, তবুও ফাইলগুলি এমনভাবে হয় যেন খারাপ আপডেটটি কখনও ঘটেনি:

cat README.md 
Initial text

ইতিহাসে কোথাও ফিরে আসার প্রতিশ্রুতি দেওয়া উচিত তা বিবেচনাধীন নয় (উপরের উদাহরণে শেষ প্রতিশ্রুতি ফেরানো হয়েছে - যে কোনও প্রতিশ্রুতি প্রত্যাহারযোগ্য হতে পারে)।

প্রশ্ন সমাপ্ত

তোমার পরে আর কিছু করতে হবে?

একটি git revertহল শুধু আরেকটি কমিট, এর দূরবর্তী তাই যেমন ধাক্কা যে অন্য ব্যবহারকারীদের টান করতে পারেন / আনা / পরিবর্তনগুলি মার্জ এবং আপনার কাজ সম্পন্ন হয়।

আপনি কি পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে হবে বা সরাসরি রেপোতে প্রতিশ্রুতিবদ্ধ হবে?

git revert হয় একটি কমিট - সেখানে প্রত্যাবর্তন একটি একক কমিট আপনি কি করতে চেয়েছিলাম অভিমানী কোন অতিরিক্ত পদক্ষেপ রয়েছে।

অবশ্যই আপনাকে আবার চাপ দিতে হবে এবং সম্ভবত দলকে ঘোষণা করতে হবে the

প্রকৃতপক্ষে - যদি রিমোটটি একটি অস্থিতিশীল অবস্থায় থাকে - বাকি দলের সাথে যোগাযোগ করা যা তাদের ঠিক করার জন্য টানতে হবে (রিভার্টিং কমিট) করা সঠিক কাজ হবে :) :)


নিশ্চিতকরণের মাধ্যমে, এখানে প্রথম বিবৃতি পর্যন্ত এবং যে কেউ একই জিনিস সম্পর্কে অবাক হয়ে যাচ্ছিল আমি কীভাবে এটি কাজ করে তা নিয়ে ভাবছিলাম, আপনি একটি রিভার্ট ফিরিয়ে দিতে পারেন, যেখানে আপনি ফিরে আসছেন তারপরে বেশ কয়েকটি নতুন কমিট রয়েছে। সুতরাং রিভার্ট সত্যই বিপরীত প্রতিশ্রুতি বিপরীত একটি অঙ্গীকার। অবশ্যই আপনার দ্বন্দ্ব থাকতে পারে ... তবে এটি ভিন্ন গল্প।
জিজি 2

আমি সর্বদা এটির সাথে প্রতিশ্রুতি এড়ানো ভাল বলে মনে করি, কেবলমাত্র প্রথমে পরিবর্তনগুলি পর্যালোচনা করা এবং আমি ব্যবহার করি, git revert -n <commitToRevet> বা git revert --no-commit <commitToRevet>
একলব্য

2
কেবল বলতে চেয়েছিলেন যে স্ট্যাকওভারফ্লোতে কয়েক বছর পরে, আমি মনে করি এটি সম্ভবত আমি যে উত্সাহটি পেয়েছি তার মধ্যে একটি হতে পারে answers দুর্দান্ত উদাহরণ এবং ব্যাখ্যা। ধন্যবাদ।
ব্যবহারকারী3344977

আমি আরও তথ্যের জন্য প্রত্যাশায় এখানে gotুকেছি, এই কাঁচা.githubusercontent.com/git/git/master/Docamentation/howto/…
টিউডিডিআর

1
@ উভিয়ানায় আপনি যে তথ্য পেয়েছেন তা যদি অপর্যাপ্ত থাকে তবে দয়া করে একটি উত্তর লিখুন। নোট করুন যে স্ট্যাক ওভারফ্লো অফিশিয়াল ডকুমেন্টেশনের বিকল্প নয় (যার সাথে আপনি লিঙ্ক করছেন বলে মনে হয় এবং এই প্রশ্নের তুলনায় আরও বিস্তৃত সুযোগকে কভার করে)।
এডি

35

গিট রিভার্টটি এর মতো ব্যবহার করুন:

git revert <insert bad commit hash here>

git revertফিরিয়ে দেওয়া পরিবর্তনগুলির সাথে একটি নতুন প্রতিশ্রুতি তৈরি করে। git resetনতুন প্রতিশ্রুতি দেওয়ার পরিবর্তে আপনার গিট ইতিহাস মুছে ফেলে।

পরবর্তী পদক্ষেপগুলি অন্য কোনও অঙ্গীকারের সমান।


"প্রতিশ্রুতি রিভার্ট" এবং "রিভার্ট টু কমিট" এর মধ্যে পার্থক্য যথেষ্ট সূক্ষ্ম যে আমি বছরের পর বছর ধরে এই আদেশের সাথে লড়াই করেছি। আপনার ব্যাখ্যাটি তাৎক্ষণিকভাবে আমার জন্য সমাধান করেছে। ধন্যবাদ!
ক্লভিস্কা

24

একই কথোপকথনে অনেকগুলি আসার কারণ resetএবং revertপ্রবণতা হ'ল বিভিন্ন সংস্করণ নিয়ন্ত্রণ ব্যবস্থা বিভিন্ন জিনিস বোঝাতে তাদের ব্যবহার করে।

বিশেষত, যে সমস্ত লোক এসভিএন বা পি 4 এর সাথে অভ্যস্ত তারা যারা কোনও ফাইলে অনিচ্ছাকৃত পরিবর্তনগুলি ফেলে revertদিতে চান তারা প্রায়শই তাদের প্রকৃতপক্ষে চান তা জানার আগে পৌঁছে যায় reset

একইভাবে, revertঅন্যান্য ভিসিএসের সমতুল্য প্রায়শই বলা হয় rollbackবা অনুরূপ কিছু - তবে "রোলব্যাক" এর অর্থ "আমি শেষের কয়েকটি কমিটগুলি পুরোপুরি বাতিল করতে চাই", যা এর পক্ষে উপযুক্ত resetতবে তা নয় revert। সুতরাং, সেখানে অনেক বিভ্রান্তি রয়েছে যেখানে লোকেরা জানে যে তারা কী করতে চায়, তবে কোন আদেশের জন্য তাদের ব্যবহার করা উচিত তা পরিষ্কার নয়।

প্রত্যাবর্তন সম্পর্কে আপনার আসল প্রশ্ন হিসাবে ...

ঠিক আছে, আপনি গিট রিভার্ট ব্যবহার করতে যাচ্ছেন তবে কীভাবে?

git revert first-bad-commit..last-bad-commit

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

ডিফল্টরূপে, git revertআপনাকে প্রতিশ্রুতিবদ্ধ বার্তার জন্য অনুরোধ জানায় এবং তারপরে ফলাফলগুলি কমিট করে। এটি ওভাররাইড করা যেতে পারে। আমি ম্যান পেজ উদ্ধৃত :

--edit

এই বিকল্পের সাহায্যে গিট রিভার্ট আপনাকে প্রত্যাবর্তনের প্রতিশ্রুতি দেওয়ার আগে কমিট বার্তা সম্পাদনা করতে দেবে। আপনি যদি টার্মিনাল থেকে কমান্ড চালনা করেন তবে এটি ডিফল্ট।

--no-কমিট

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

একাধিক প্রতিশ্রুতিবদ্ধতার প্রভাবটি আপনার সূচকে এক সারি সরিয়ে নেওয়ার সময় এটি কার্যকর।

বিশেষত, ডিফল্টরূপে এটি আপনি যে প্রতিশ্রুতিগুলি ফিরিয়ে দিচ্ছেন তার জন্য একটি নতুন প্রতিশ্রুতি তৈরি করে। আপনি revert --no-commitসেই পরিবর্তনগুলি পৃথক পৃথক প্রতিশ্রুতি হিসাবে প্রতিশ্রুতি না দিয়ে তাদের সকলকে ফিরিয়ে আনতে পরিবর্তনগুলি তৈরি করতে ব্যবহার করতে পারেন , তারপরে আপনার অবসর সময়ে প্রতিশ্রুতিবদ্ধ।


git revert first-bad-commit..last-bad-commit: আমি মনে করি এটি হওয়া উচিত git revert parent-of-first-bad-commit..last-bad-commit
ব্যবহারকারী 1071847

9

প্রশ্নটি বেশ পুরানো তবে প্রত্যাবর্তন এখনও লোককে বিভ্রান্ত করছে (আমার মত)

শিক্ষানবিস হিসাবে, কিছু পরীক্ষা এবং ত্রুটির পরে (ট্রায়ালের চেয়ে বেশি ত্রুটি) আমি একটি গুরুত্বপূর্ণ বিষয় পেয়েছি:

  • git revertএর আইডি প্রয়োজন কমিট সরাতে চান তা আপনার ইতিহাস মধ্যে পালন

  • git resetআপনি যে প্রতিশ্রুতি রাখতে চান তা প্রয়োজন এবং ফলস্বরূপ ইতিহাস থেকে এর পরে যে কোনও কিছু সরিয়ে ফেলবে।

এটি হ'ল, যদি আপনি revertপ্রথম কমিট আইডি ব্যবহার করেন, আপনি নিজেকে একটি খালি ডিরেক্টরিতে এবং ইতিহাসে একটি অতিরিক্ত প্রতিশ্রুতি হিসাবে সন্ধান করতে পারবেন, আবার আপনার ডিরেক্টরিটি পুনরায় সেট করার সাথে সাথে প্রাথমিক প্রতিশ্রুতিতে ফিরে যাবে এবং আপনার ইতিহাস যেমনটি পেয়ে যাবে তেমন শেষ প্রতিশ্রুতি কখনও ঘটেনি।

আরও পরিষ্কার হতে হবে, এই জাতীয় লগ সহ:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

git revert cb76ee4উইল ব্যবহার করে ডিফল্টরূপে আপনার ফাইলগুলি 01b56c6 এ ফিরিয়ে আনবে এবং আপনার ইতিহাসে আরও প্রতিশ্রুতি যুক্ত করবে:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 পরিবর্তে আপনার ফাইলগুলি 01b56c6 এ ফিরিয়ে আনবে এবং এর পরে আপনার ইতিহাস থেকে অন্য কোনও প্রতিশ্রুতি সাফ করবে:

01b56c6 test
2e407ce first commit

আমি জানি এটি "ভিত্তি" তবে এটি আমার পক্ষে বেশ বিভ্রান্তিকর ছিল, revertপ্রথম আইডি চালিয়ে ('ফার্স্ট কমিট') আমি আমার প্রাথমিক ফাইলগুলি খুঁজে পাওয়ার প্রত্যাশা করছিলাম, এটি বুঝতে কিছুটা সময় লাগল, যদি আপনার ফাইলগুলি আবার দরকার হয় 'প্রথম প্রতিশ্রুতি' হিসাবে আপনাকে পরবর্তী আইডি ব্যবহার করতে হবে।


আমি একই পর্যবেক্ষণ করেছি। এটি সত্যই বিভ্রান্তিকর তবে এটি জানা গুরুত্বপূর্ণ। সম্প্রতি আমাকে একজন সহকর্মীকে সহায়তা করতে হয়েছিল এবং এটি সম্পর্কে ভুলে গেছি। সেটা কিছুটা বিব্রতকর ছিল।
ExOfDe

1

আমি 'গিট রিভার্ট কমিট আইডি' চালিয়ে কয়েকটি কমিট ফিরে পেয়েছি যেমন:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

তারপরে আমাকে প্রত্যাবর্তনের প্রতিশ্রুতি দেওয়া হয়েছিল (ঠিক যেমন 'গিট কমিট' চালানোর সময় আপনি করতে চান)। আমার ডিফল্ট টার্মিনাল প্রোগ্রামটি ভিম তাই আমি দৌড়েছি:

:wq 

অবশেষে আমি পরিবর্তনটি এটিকে সংগ্রহস্থলীর দিকে ঠেলে দিয়েছিলাম:

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