গিটে কমিটের একটি ব্যাপ্তি ফিরিয়ে আনুন


127

আমি কীভাবে গিটের বিভিন্ন শৃঙ্খলা ফিরিয়ে আনতে পারি? দিকে তাকিয়ে থেকে gitrevisions ডকুমেন্টেশন, আমি কিভাবে পরিসীমা আমি প্রয়োজন নির্দিষ্ট করতে দেখতে পাবে না। উদাহরণ স্বরূপ:

A -> B -> C -> D -> E -> HEAD

আমি এর সমতুল্য করতে চাই:

git revert B-D

ফলাফল যেখানে হবে:

A -> B -> C -> D -> E -> F -> HEAD

যেখানে এফ বিডি বিপরীত অন্তর্ভুক্ত থাকে।


গিটরিভিশনগুলি (7) পৃষ্ঠার শেষের দিকে, "স্পেসিফাইং রেঞ্জগুলি" শীর্ষক একটি বিভাগ রয়েছে। আপনি যা চান সেখানে কী বর্ণিত হয়েছে তার থেকে আলাদা কীভাবে?
গ্যারেথ ম্যাককাগন

2
গিটারভিশন পৃষ্ঠাটি পরামর্শ দেয় যে 'গিট রিভার্ট এ..ডি' আমার যা করতে চাইবে তা করবে। তবে যখন আমি চেষ্টা করি যে আমি ত্রুটিটি পেয়েছি "মারাত্মক: 'এ..ডি' খুঁজে পাচ্ছি না"
অ্যালেক্স স্পার্লিং

উত্তর:


172

আপনি গিতের কোন সংস্করণ ব্যবহার করছেন?

কেবল Git1.7.2 + এ সমর্থিত একাধিক কমিটগুলি প্রত্যাবর্তন করা: আরও তথ্যের জন্য "রিভারব্যাক একাধিকবার ব্যবহার করে পুরানো প্রতিশ্রুতিতে রোলব্যাক দেখুন "
বর্তমান git revertম্যান পৃষ্ঠাটি কেবল বর্তমান গিট সংস্করণে (1.7.4+)।


ওপি অ্যালেক্স স্পার্লিং মন্তব্যগুলিতে যেমন রিপোর্ট করেছেন:

1.7.4 এ আপগ্রেড করা ভাল কাজ করে।
আমার নিজের প্রশ্নের উত্তর দেওয়ার জন্য, এটি সিনট্যাক্সটি আমি সন্ধান করছিলাম:

git revert B^..D 

B^এর অর্থ "বি এর প্রথম পিতামাতার প্রতিশ্রুতি": যা Bপ্রত্যাবর্তনে অন্তর্ভুক্ত করতে দেয় ।
" git rev-parseনির্ধারিত পর্যালোচনা বিভাগ " দেখুন যার মধ্যে <rev>^যেমন উদাহরণস্বরূপHEAD^ বাক্য গঠন রয়েছে: " ক্যারেট ( ^) চরিত্রটি কী বোঝায়? ") এ আরও দেখুন

নোট করুন যে প্রতিটি উল্টানো প্রতিশ্রুতি আলাদাভাবে প্রতিশ্রুতিবদ্ধ।

হেনরিক এন মন্তব্যগুলিতে স্পষ্ট করে বলেছেন :

git revert OLDER_COMMIT^..NEWER_COMMIT

নীচে প্রদর্শিত হিসাবে, আপনি এখনই প্রতিশ্রুতি না দিয়ে ফিরে যেতে পারেন:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

1
ধন্যবাদ, উত্তর ছিল। 1.7.4 এ আপগ্রেড করা ভাল কাজ করে। আমার নিজের প্রশ্নের উত্তরের জন্য, এটি আমি সেই সিনট্যাক্সটি খুঁজছিলাম: গিট রিভার্ট বি B .. ডি
অ্যালেক্স স্পার্লিং

প্রতিভা। ধন্যবাদ। প্যাচগুলি প্রয়োগ করার জন্য আমাকে বিপরীত ক্রমে কমিটগুলি প্রত্যাবর্তন করতে হবে তা আমার কাছে ঘটেনি du এই কমান্ডটি পথ দেখায়।
টিম আবেল

5
আমি প্রায়শই এই উত্তরটি আবার উল্লেখ করি এবং ক্রমটি বের করতে আমার সর্বদা সময় নেয়। সুতরাং আমার ভবিষ্যতের git revert OLDER_COMMIT^..NEWER_COMMIT
স্বকে

2
^ মানে কি?
ডাস্টিন গেটেজ

1
@ ডাস্টিনগেটজ প্রথম পিতামাতা: git-scm.com/docs/gitrevisions দেখুন : " ^একটি পুনর্বিবেচনা প্যারামিটারের প্রত্যয় অর্থ সেই প্রতিশ্রুতিবদ্ধ অবজেক্টের প্রথম পিতামাতা"।
ভোনসি

15

আপনি যদি একক প্রতিশ্রুতিতে কমিট বি B কে ডি (কমপক্ষে গিট সংস্করণ 2 এ) ফিরিয়ে দিতে চান তবে আপনি এটি করতে পারেন

 git revert -n B^..D

এটি বি এর পিতামাতার প্রতিশ্রুতি (বাদ দেওয়া) থেকে ডি কমিটের (অন্তর্ভুক্ত) কমিট দ্বারা সম্পাদিত পরিবর্তনগুলি প্রত্যাবর্তন করে, তবে উলটে যাওয়া পরিবর্তনগুলির সাথে কোনও প্রতিশ্রুতি তৈরি করে না। প্রত্যাবর্তনটি কেবলমাত্র কার্যকরী গাছ এবং সূচকে পরিবর্তন করে।

এর পরে পরিবর্তনগুলি করতে ভুলবেন না

 git commit -m "revert commit range B to D"

আপনি একই পদ্ধতি ব্যবহার করে একক প্রতিশ্রুতিবদ্ধভাবে একাধিক সম্পর্কিত সম্পর্কিত কমিটগুলিও প্রত্যাহার করতে পারেন। উদাহরণস্বরূপ বি এবং ডি পুনর্নির্মাণ কিন্তু সি না

 git revert -n B D
 git commit -m "Revert commits B and D"

তথ্যসূত্র: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

সংশোধনের জন্য হুনজা হ্যারিং ধন্যবাদ Thanks


3
git revert -n B..Dকমিটিকে বি ফিরিয়ে দেয় না, কেবল সি এবং ডি git revert -n B^..Dবি-কেও রিভার্ট করে।
হনজা হ্যারিং

গিট ডকুমেন্টেশন অনুযায়ী এটি করে। পোস্টে রেফারেন্স
রামাস্ট

1
যদি আপনি এই উদাহরণটিতে (যা আমি কিছুটা বিভ্রান্তিকর বলে মনে করি) উল্লেখ করে: তবে git revert -n master~5..master~2এটি পঞ্চম সর্বশেষ প্রতিশ্রুতি অন্তর্ভুক্ত বলেছে। তবে master~5আসলে 6th ষ্ঠ সর্বশেষ কমিট। স্বরলিপি সম্পর্কে বিস্তারিত তথ্যের জন্য গিট ডক্সে সংশোধন নির্বাচন দেখুন ..:-)
হোনজা হ্যারিং

6

করা git revert OLDER_COMMIT^..NEWER_COMMITআমার পক্ষে কাজ করে না।

আমি ব্যবহার করেছি git revert -n OLDER_COMMIT^..NEWER_COMMITএবং সবকিছুই ভাল। আমি গিট সংস্করণ ব্যবহার করছি 1.7.9.6


আমার একই সমস্যা ছিল এবং এটি ব্যবহার করে -n ব্যবহার করে ঠিক করে ফেলতে হবে তবে আপনাকে ওল্ডER_COMMIT- এর সাথে ছেড়ে দেওয়া উচিত (গিটার রিভার্ট-অ্যান ওলডিআইপিএমকিমিটি ^ .. NEWER_COMMIT)।
24:54

@ ফীল গুড আপনি কেন leave ছাড়বেন?
অরল্যান্ডো

আমার ইতিহাস এ -> বি -> সি ছিল এবং লক্ষ্য ছিল বি এবং সি ফিরে করা যখন আমি 'গিট রিভার্ট -এন বি..সি' চালনা করি তখন কেবল সিটি উল্টানো হত। আমি যখন 'গিট রিভার্ট -এন বি ^ .. সি' ব্যবহার করি, তখন গিট উভয় কমিটকে উল্টে দেয়। আমি কিছু ভুল করেছি।
12'9 এ 12

শীতল, ভাল এটি পরীক্ষা করতে হবে তবে আমি মনে করি আমার ক্ষেত্রে ভাল কাজ হয়েছে (যদি না আমি 1 টি কমিট রেঞ্জ লোল করে দিই) আমি উত্তরটি সংশোধন করে ^ অন্তর্ভুক্ত করব ^ ধন্যবাদ
অরল্যান্ডো

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

0

git rebase -iসম্পর্কিত কমিটিকে স্কোয়াশ করতে ব্যবহার করুন । তারপরে আপনার কেবল একটি প্রত্যাহার করার প্রতিশ্রুতি আছে।


7
গিট রিবেস ব্যবহার করা হলে, আপনি কেবল কমিটগুলি সরাতে পারেন। আমি মনে করি রিবেস না করার একটি কারণ আছে, যেমন প্রতিশ্রুতিবদ্ধতার SHA1 একই রাখতে চান।
পাওলো ইবারম্যান

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