একটি পুরাতন রেপোতে পুরানো গিটের রোলব্যাক


802

গিটে নির্দিষ্ট প্রতিশ্রুতিতে ফিরে যাওয়া সম্পর্কে আমি কীভাবে যেতে পারি ?

কেউ আমাকে যে সর্বোত্তম উত্তর দিতে পারে তা হ'ল git revertআমি পছন্দসই প্রতিশ্রুতি না পৌঁছা পর্যন্ত এক্স বার ব্যবহার করা ।

সুতরাং আসুন আমরা 20 টি পুরানো প্রতিশ্রুতিতে ফিরে যেতে চাই তা বলি, আমাকে এটি 20 বার চালাতে হবে।

এই কাজ করতে একটি সহজ উপায় আছে?

আমি রিসেট ব্যবহার করতে পারি না কারণ এই সংগ্রহস্থলটি সর্বজনীন।


1
গিট রিভার্ট <কমিট> কাজ করে না?
মিকু

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

7
এই প্রশ্নের বেশ ভাল উত্তর এখানে দেওয়া হয়েছে stackoverflow.com/questions/4114095/...
user7610

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

1
আপনার একটি উত্তর গ্রহণ করা উচিত, এবং সম্ভবত আপনার পছন্দ মতো অন্য কোনও উত্তর দেওয়া উচিত।
নাবিল কাদিমি

উত্তর:


1193

এটা চেষ্টা কর:

git checkout [revision] .

[revision]কমিট হ্যাশ কোথায় (উদাহরণস্বরূপ 12345678901234567890123456789012345678ab:)।

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

আপনি এটিকে পূর্বাবস্থায় ফেরাতে পারেন

git reset --hard 

এটি কার্যকারী ডিরেক্টরি এবং মঞ্চ অঞ্চল থেকে সমস্ত পরিবর্তন মুছে ফেলবে।


7
@ অ্যালেক্সারিসনার সেই সময়কালে আপনি বর্তমানে যে ডিরেক্টরিটিতে রয়েছেন তার শেষে পয়েন্টগুলি, যা পুরো গিট প্রকল্পের অগত্যা নয়? আপনি যদি পুরো প্রকল্পটিতে পরিবর্তনগুলি প্রয়োগ করতে চান, আপনি যদি বর্তমানে গিট প্রকল্পের মূলটিতে না থাকতেন তবে আপনি কি ': /' লাইক 'গিট অ্যাড: /' ব্যবহার করবেন?
এমএসপাইজ

10
দ্রষ্টব্য: আপনি যদি এখন থেকে আপনার প্রকল্পে নতুন ফাইল যুক্ত করে থাকেন তবে এটি সেগুলি মুছবে না। সুতরাং যখন আপনি নির্মাণ করতে যান (আপনার প্ল্যাটফর্মের উপর নির্ভর করে), আপনি এখনও ত্রুটি পেতে পারেন। নতুন ফাইলগুলি মুছুন এবং আপনি যেতে ভাল।
দ্য ওয়েস্টটাইজ ...

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

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

4
দাম্মিত, আমি "ভুলে গেছি।" আমার সংগ্রহশালার কী ক্ষতি করেছি?
পেঁচা

196

নির্দিষ্ট প্রতিশ্রুতিতে রোলব্যাক করতে:

git reset --hard commit_sha

রোলব্যাক করতে 10 কমিট ফিরে:

git reset --hard HEAD~10

আপনি যদি ইতিহাসটি পুনরায় লিখতে না চান তবে আপনি নীচের পোস্টের মতো "গিট রিভার্ট" ব্যবহার করতে পারেন

পূর্ববর্তী প্রতিশ্রুতিতে গিট সংগ্রহস্থলটি কীভাবে ফিরিয়ে আনবেন?


4
শুধুমাত্র এই পদ্ধতির এবং "গিট চেকআউট [পুনর্বিবেচনা]" এর মধ্যে পার্থক্য। পরেরটি পুনর্বিবেচনাগুলি সংরক্ষণ করে।
ডিজিশঙ্ক

53
এই উত্তরটি সঠিক নয় কারণ
ওপিতে

4
রেপো যদি সর্বজনীন হয় তবে আমি মনে করি যে বল পুশ (গিট পুশ-এফ) ব্যবহার না করে পাবলিক ভান্ডারগুলির প্রতিশ্রুতি রোলব্যাক করার কোনও উপায় নেই কারণ এটি রোলব্যাকের আগে পরিবর্তনগুলি টানতে থাকা লোকজনকে প্রভাবিত করবে। সুতরাং, রিসেটটি পাবলিক রেপোর স্থানীয় স্যান্ডবক্সেও ব্যবহার করা যেতে পারে।
নাগা কিরণ

4
এটি দুর্দান্ত যে এটি একটি পৃথক মাথা এড়িয়ে চলে! শুধু আমি যা খুঁজছিলাম।
সাইবার-সন্ন্যাসী

1
আমার ক্ষেত্রে এটি কাজ করেছে, তারপরে আপনার গতিবিধি ইত্যাদি পরীক্ষা করার পরে দ্রুত গতিতে পিছনে 'গিট টান' ব্যবহার করুন।
পিটার কুইরিং

86

ঠিক আছে, আমি অনুমান করি যে প্রশ্নটি আপনি 'রোল ব্যাক' বলতে কী বোঝায়? আপনি যদি এটি না করতে পারেন resetকারণ এটি সর্বজনীন এবং আপনি প্রতিশ্রুতিবদ্ধ ইতিহাসটি অক্ষুণ্ন রাখতে চান, আপনি কি বোঝাতে চেয়েছেন যে আপনি কেবল আপনার কাজের অনুলিপি একটি নির্দিষ্ট প্রতিশ্রুতি প্রতিবিম্বিত করতে চান? ব্যবহার git checkoutএবং প্রতিশ্রুতি হ্যাশ।

সম্পাদনা: মন্তব্যে যেমন উল্লেখ করা হয়েছিল, git checkoutকোনও শাখা নির্দিষ্ট করে না দিয়ে ব্যবহার করা আপনাকে "কোনও শাখা" অবস্থায় ফেলে রাখবে। ব্যবহার করুন git checkout <commit> -b <branchname>চেকআউট একটি শাখা মধ্যে, অথবা git checkout <commit> .বর্তমান শাখা মধ্যে চেকআউট।


এটি কি আপনাকে অদ্ভুত 'বর্তমানে কোনও শাখায় নেই' অবস্থায় রাখে না? রোলব্যাকটি সম্পূর্ণ করতে আপনি কীভাবে প্রতিশ্রুতিবদ্ধ?
অ্যালেক্স রিজনার

ঠিক আছে, আমি কেবল এটির ব্যবহারের পরামর্শ দিচ্ছি git checkout- তিনি ইচ্ছা করেন এমন কোনও শাখা (বর্তমান বা নতুন) যাচাই করতে পারেন। আমি আমার উত্তর আপডেট করব যাতে এটি অস্পষ্ট নয়।
বেন

2
আমি এটি চেষ্টা করেছি কিন্তু আমি মনে করি না এটি এটি করার উপযুক্ত উপায় এটি এর ফলে স্তব্ধ ফাইলগুলি পড়ে। এটি এমন ফাইলগুলি মুছবে না যেগুলি সর্বশেষ প্রতিশ্রুতিতে ছিল না।
ডেভিড

3
আপনি যদি একটি কার্যনির্বাহী ডিরেক্টরিতে থাকেন এবং আপনি মাস্টার অবধি থাকেন, আপনাকে git resetসেই ফাইলগুলি মুছতে হবে, যা আপনি বলে যে আপনি করতে চান না। এটি একটি পৃথক শাখায় করার চেষ্টা করুন : git checkout <commit> -b <branchname>, আপনার সেই শাখায় স্থবির ফাইল থাকবে না ।
বেন

2
ব্যবহারে সমস্যা checkoutহ'ল এটি পূর্বের প্রতিশ্রুতিতে যুক্ত হওয়া ফাইলগুলি মুছবে না।

42

মূল পোস্টারটিতে বলা হয়েছে:

কেউ আমাকে যে সর্বোত্তম উত্তর দিতে পারে তা হ'ল git revertআমি পছন্দসই প্রতিশ্রুতি না পৌঁছা পর্যন্ত এক্স বার ব্যবহার করা ।

সুতরাং আসুন আমরা 20 টি পুরানো প্রতিশ্রুতিতে ফিরে যেতে চাই তা বলি, আমাকে এটি 20 বার চালাতে হবে।

এই কাজ করতে একটি সহজ উপায় আছে?

এই রেপোটি সর্বজনীন হওয়ায় আমি রিসেট ব্যবহার করতে পারছি না।

এটি git revertএক্স বার ব্যবহার করার প্রয়োজন নেই । git revertআর্গুমেন্ট হিসাবে প্রতিশ্রুতিবদ্ধ সীমা গ্রহণ করতে পারে, তাই আপনাকে কমিটের সীমাটি ফিরিয়ে আনতে কেবল একবার এটি ব্যবহার করা দরকার। উদাহরণস্বরূপ, আপনি যদি সর্বশেষ 20 টি চুক্তিতে ফিরে যেতে চান:

git revert --no-edit HEAD~20..

কমিটের পরিসরটি HEAD~20..সংক্ষিপ্ত HEAD~20..HEAD, এবং এর অর্থ " হেডের কমিটের 20 তম পিতামাতার থেকে শুরু করুন , এবং এটি সম্পাদনের পরে সমস্ত কমিটগুলি প্রত্যাবর্তন করুন"।

এগুলি 20 টিরও কমিট নয় বলে ধরে নিলে তা শেষ করবে 20 যদি সেখানে মার্জ কমিটস থাকে, তবে আপনি সেগুলি সমস্তকে একটি কমান্ডে ফিরিয়ে দিতে পারবেন না, আপনাকে পৃথকভাবে এগুলি ফিরিয়ে নিতে হবে

git revert -m 1 <merge-commit>

আরও মনে রাখবেন যে আমি git revertগিট সংস্করণ 1.9.0 ব্যবহার করে একটি ব্যাপ্তি ব্যবহার করে পরীক্ষা করেছি । আপনি যদি গিটের কোনও পুরানো সংস্করণ ব্যবহার করেন তবে এর সাথে একটি পরিসর ব্যবহার করা git revertবা নাও কাজ করতে পারে।

এই ক্ষেত্রে, git revertবেশি পছন্দ করা হয় git checkout

লক্ষ্য করুন অসদৃশ এই উত্তরটি ব্যবহার করতে বলেছেনgit checkout , git revert আসলে যে করে যে আপনার প্রত্যাবর্তন করছি কোনো যোগ করা হয় নি কোন ফাইল মুছে ফেলা হবে , যা এই পুনর্বিবেচনা একটি সীমার রূপে ফিরিয়ে নিয়ে যেতে সঠিক পথ করে তোলে।

নথিপত্র


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

@ শেরিলহোমান পূর্বের প্রতিশ্রুতিতে ফিরে যাওয়া নতুন প্রতিশ্রুতি তৈরি করে না। আপনি এখানে বলতে চাইছেন তা আমি ভাবতে পারি না।

27

পদক্ষেপ 1: প্রতিশ্রুতিগুলির তালিকা আনুন:

git log

আপনি এই উদাহরণের মতো তালিকা পাবেন:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

পদক্ষেপ 2: প্রতিশ্রুতিবদ্ধ হ্যাশের অনুলিপি করুন এবং এটি চেকআউটের জন্য পেস্ট করুন:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

এখানেই শেষ.


11
git read-tree -um @ $commit_to_revert_to

এটা করবো. এটি "গিট চেকআউট" তবে হেডকে আপডেট না করে।

আপনি একই প্রভাব অর্জন করতে পারেন

git checkout $commit_to_revert_to
git reset --soft @{1}

যদি আপনি স্ট্রিং সুবিধামত কমান্ড একসাথে পছন্দ করেন।

এগুলি আপনাকে আপনার কর্মশালা এবং পছন্দসই অবস্থায় সূচী দিয়ে রেখে দেয়, আপনি কেবল git commitশেষ করতে পারেন ।


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

6

হেড বিচ্ছিন্ন মোড চান?

যদি আপনি একটি নির্দিষ্ট শিরোনামের সাথে একটি নির্দিষ্ট প্রতিশ্রুতিতে X সময়টি রোলব্যাক করতে চান (যার অর্থ আপনি কোনও গোলমাল করতে পারবেন না), তবে যে কোনও উপায়ে, নিম্নলিখিতটি ব্যবহার করুন:

(আপনি কতটা প্রতিশ্রুতি ফিরে যেতে চান তা দিয়ে এক্স প্রতিস্থাপন করুন)

git checkout HEAD~X

আইই একটি প্রতিশ্রুতি ফিরে যেতে:

git checkout HEAD~1

1
আমি ... বিশ্বাস করা কঠিন ... এর সাথে অংশটি সরিয়ে ফেলব ... এটি ব্যক্তিগত বলে মনে হচ্ছে, এবং কেউ কেউ এটিকে উপরে একটি মন্তব্যে উল্লেখ করেছে, এবং @ উত্তরও তার উত্তরে।
meJustAndrew

@ মজাস্টআন্ড্রু এটি এতোটুকু উত্তর যা মানুষকে বিভ্রান্ত করে, এটি বেশ বিরক্তিকর।
কার্ল মরিসন

কি সহজ এবং সোজা এগিয়ে উত্তর।
আম্মাদ

2

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

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

ঠিক আছে, যাতে প্রতিশ্রুতি আপনার জন্য কাজ করে। আর ত্রুটি নেই। আপনি সমস্যাটি স্থির করেছেন ointed এখন আপনি সর্বশেষ প্রতিশ্রুতিতে ফিরে যেতে পারেন:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

এবং ত্রুটি হওয়ার আগে একটি নির্দিষ্ট ফাইল চেকআউট করুন (আমার ক্ষেত্রে আমি জেমফিল.লক উদাহরণটি ব্যবহার করি):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

এবং এটি ততক্ষণে ত্রুটিগুলি উপলব্ধি না করে কমিটে তৈরি করা ত্রুটিগুলি পরিচালনা করার একটি উপায়।


2

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

git checkout 5889575 .

এটি আপনাকে আপনার কোডের সেই মুহুর্তে নিয়ে যাবে।


1

কি পরিবর্তন হয়েছে তা সম্পর্কে আমি নিশ্চিত নই, তবে বিকল্পটি ছাড়াই আমি একটি নির্দিষ্ট প্রতিশ্রুতি চেকআউট করতে অক্ষম --detach। আমার পক্ষে কাজ করা পূর্ণ আদেশটি হ'ল: git checkout --detach [commit hash]

বিচ্ছিন্ন অবস্থা থেকে ফিরে আসতে আমাকে আমার স্থানীয় শাখাটি চেকআউট করতে হয়েছিল: git checkout master


চেক আউট করা কাজ masterকরার সময় git reset --hardবা git checkout -- .কাজ করে থাকা অবস্থায় বিচ্ছিন্ন থাকার সমস্যাটির সমাধান করে তবে বিচ্ছিন্ন থাকে
ডার্কসিগনাস

0

এখানে এটি একটি উদাহরণ

    cd /yourprojects/project-acme 


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