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


7630

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

যদি আমি এটি করি git log, তবে আমি নিম্নলিখিত আউটপুটটি পাই:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

আমি কীভাবে 3 নভেম্বর থেকে প্রতিশ্রুতিতে প্রত্যাবর্তন করব, মানে প্রতিশ্রুতিবদ্ধ 0d1d7fc?



116
গিথ থেকে সরাসরি গিথুব থেকে জিনিসগুলি পূর্বাবস্থায় ফেলার বিষয়ে এখানে একটি খুব পরিষ্কার এবং পুঙ্খানুপুঙ্খ পোস্ট
নোবিতা

3
সম্পর্কিত: একটি পাবলিক রেপোতে পুরানো গিট কমিটের রোলব্যাক । নোট করুন যে প্রশ্নটি রেপো সর্বজনীন যে একটি বাধা যুক্ত করে।

58
আমি গিট পছন্দ করি, কিন্তু এমন যে 35 টির উত্তর রয়েছে যা অবিশ্বাস্যরকম সহজ হওয়া উচিত গিটের সাথে একটি বিশাল সমস্যা প্রকাশ করে। নাকি ডক্স?
মাফিন ম্যান

2
কিভাবে ভাষা "ফাঁদ" শব্দ ব্যবহার করে করা হয় রূপে ফিরিয়ে নিয়ে যেতে কথ্য অর্থ যেমন রিসেট করতে এমনকি এখানে adressed না ??? 6594 এখনও পর্যন্ত আপলোড এবং এইভাবে কোনও সম্পাদনা নয়, পার্থক্যের উপর চাপ দেওয়ার জন্য? "প্রতিশ্রুতিবদ্ধ" মত প্রকাশের সাথে এখানে "একটি ফাইল সংরক্ষণ করা" উল্লেখ করা আরও বিভ্রান্তিকর হবে না ...
RomainValeri

উত্তর:


9714

এটি "প্রত্যাবর্তন" দ্বারা আপনি কী বোঝাতে চান তার উপর এটি অনেকটাই নির্ভর করে।

অস্থায়ীভাবে একটি পৃথক প্রতিশ্রুতিতে স্যুইচ করুন

আপনি যদি অস্থায়ীভাবে এটিতে ফিরে যেতে চান, চারপাশ বোকা হন, তবে আপনি যেখানে আছেন সেখানে ফিরে আসুন, আপনাকে যা করতে হবে তা হ'ল কাঙ্ক্ষিত প্রতিশ্রুতি পরীক্ষা করা:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

অথবা আপনি সেখানে থাকার সময় যদি কমিট করতে চান তবে এগিয়ে যান এবং যখন আপনি সেখানে থাকবেন তখন একটি নতুন শাখা করুন:

git checkout -b old-state 0d1d7fc32

আপনি যেখানে ছিলেন সেখানে ফিরে যেতে কেবল যে শাখাটি দিয়েছিলেন তা আবার পরীক্ষা করে দেখুন। (আপনি যদি শাখাগুলি স্যুইচ করার সময় যথারীতি পরিবর্তন করেন তবে আপনাকে যথাযথ হিসাবে তাদের মোকাবেলা করতে হবে them এগুলি ফেলে দেওয়ার জন্য আপনি পুনরায় সেট করতে পারেন; এগুলি আপনার সাথে নিতে আপনি স্ট্যাশ, চেকআউট, স্ট্যাশ পপ করতে পারেন; আপনি প্রতিশ্রুতিবদ্ধ হতে পারেন আপনি সেখানে একটি শাখা চাইলে সেগুলি সেখানে একটি শাখায় রাখতে পারেন))

অপ্রকাশিত কমিটস হার্ড মুছুন

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

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

আপনি যদি বিশৃঙ্খলা সৃষ্টি করেন, আপনি ইতিমধ্যে আপনার স্থানীয় পরিবর্তনগুলি দূরে সরিয়ে রেখেছেন তবে পুনরায় সেট করে আপনি অন্তত যেখানে ছিলেন সেখানে ফিরে যেতে পারেন।

নতুন কমিটের সাথে প্রকাশিত কমিটগুলি পূর্বাবস্থায় ফেরান

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

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revertর manpage আসলে তার বর্ণনাতে এই অনেক জুড়ে। আর একটি দরকারী লিঙ্কটি হ'ল গিট-এসএমএইচ ডটকম বিভাগ গিট-রিভার্টের বিষয়ে আলোচনা করছে

আপনি যদি সিদ্ধান্ত নেন যে সর্বোপরি আপনি ফিরে যেতে চান না, আপনি রিভার্টটি (এখানে বর্ণিত হিসাবে) রিভার্ট করতে পারেন বা রিভার্টের আগে ফিরে যেতে পারেন (পূর্ববর্তী বিভাগটি দেখুন)।

আপনি এই ক্ষেত্রে এই উত্তরটি সহায়ক হিসাবেও পেতে পারেন:
কীভাবে হেডকে আগের জায়গায় ফিরে যেতে হবে? (বিচ্ছিন্ন মাথা)


118
@ রড এর মন্তব্য উপর git revert HEAD~3সেরা ওয়াত প্রত্যাবর্তন করানোর জন্য যেমন 3করে টা গুরুত্বপূর্ণ কনভেনশন হয়।
নিউ আলেকজান্দ্রিয়া

19
আপনি পুরো নম্বর লিখতে পারেন? পছন্দ:git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
স্পোকেন

16
@ ম্যাথিয়াস ম্যাডসেন স্টাভ হ্যাঁ, আপনি অবশ্যই সম্পূর্ণ এসএএএএ 1 দ্বারা কমিটগুলি নির্দিষ্ট করতে পারেন। উত্তরটি আরও পঠনযোগ্য করার জন্য সংক্ষেপিত হ্যাশগুলি ব্যবহার করেছি এবং আপনি টাইপ করে থাকলে আপনি সেগুলি ব্যবহার করার ঝোঁকও রাখেন। যদি আপনি অনুলিপি এবং পেস্ট করে থাকেন তবে সর্বদা সম্পূর্ণ হ্যাশ ব্যবহার করুন। আপনি কীভাবে নাম লেখাতে পারেন তার পুরো বিবরণের জন্য ম্যান গিট রেভি-পার্সে সংশোধনী নির্দিষ্টকরণ দেখুন ।
ক্যাস্যাবেল

59
আপনি ব্যবহার করতে পারেন git revert --no-commit hash1 hash2 ...এবং git commit -m "Message"
এটির

6
এই প্রসঙ্গে 'প্রকাশ' এর অর্থ কী?
হাওইক্যাম্প

1846

এখানে অনেক জটিল এবং বিপজ্জনক উত্তর, কিন্তু এটি আসলে সহজ:

git revert --no-commit 0766c053..HEAD
git commit

এটি শিরোনাম থেকে কমিট হ্যাশগুলিতে ফিরে আসবে, যার অর্থ এটি কার্যকর বৃক্ষের মধ্যে সেই প্রতিশ্রুতিবদ্ধ অবস্থাটিকে পুনরায় তৈরি করবে যেন প্রতিটি প্রতিশ্রুতি ফিরে এসেছে। তারপরে আপনি বর্তমান গাছটি প্রতিশ্রুতিবদ্ধ করতে পারেন এবং এটি আপনাকে "রূপান্তরিত" প্রতিশ্রুতির সমতুল্য একটি নতুন প্রতিশ্রুতি তৈরি করবে।

( --no-commitপতাকাটি গিটকে সমস্ত কমিটকে একবারে ফেরত দিতে দেয় - অন্যথায় আপনাকে সীমার প্রতিটি প্রতিশ্রুতি দেওয়ার জন্য একটি বার্তা প্রেরণা দেওয়া হবে, আপনার ইতিহাসকে অহেতুক নতুন কমিটের মাধ্যমে ছড়িয়ে দেবে))

এটি পূর্বের অবস্থায় রোলব্যাক করার নিরাপদ এবং সহজ উপায় । কোনও ইতিহাস ধ্বংস হয় না, সুতরাং এটি ইতিমধ্যে সর্বজনীন করা কমিটগুলির জন্য ব্যবহার করা যেতে পারে।


23
যদি আপনি সত্যিকার অর্থে পৃথক প্রতিশ্রুতি রাখতে চান (সমস্ত কিছুকে একটি বড় প্রতিশ্রুতি দিয়ে উল্টানোর পরিবর্তে), তবে আপনি --no-editপরিবর্তে পাস করতে পারেন --no-commit, যাতে প্রতিটি বিপরীতের জন্য আপনাকে কোনও কমিট বার্তা সম্পাদনা করতে না হয়।

87
যদি 0766c053..HEAD এর মধ্যে একটিও কমিট হয় তবে মার্জ হয়ে গেলে পপ আপ করার সময় ত্রুটি ঘটবে (কোনও নির্দিষ্ট-এম নির্দিষ্ট না করে)। এই সেই সম্মুখীন সাহায্য করতে পারে যে: stackoverflow.com/questions/5970889/...
timhc22

7
আপনি ব্যবহার করার আগে বিভিন্ন পার্থক্য দেখতে git diff --cached
জন এর্ক

21
$ git revert --no-commit 53742ae..HEADরিটার্নfatal: empty commit set passed
অ্যালেক্স জি

10
@ অ্যালেক্সজি এর কারণ এটি যে আপনি ফিরে যেতে চান তার আগে আপনাকে একটি হ্যাশ প্রবেশ করাতে হবে। আমার ক্ষেত্রে, হ্যাশগুলি ছিল: 81bcc9e HEAD{0}; e475924 HEAD{1}, ...(থেকে git reflog), এবং আমি যা করেছি তা পূর্বাবস্থায় ফিরিয়ে নিতে চেয়েছিলাম 81bcc9e, তখন আমাকে করতে হবেgit revert e475924..HEAD
এপিকপান্ডাফোরস

1610

রোগ কোডার?

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

অন্যের সাথে কাজ করছেন? গিট জটিল। আপনি কিছুটা ফুসকুড়ি করার আগে এই উত্তরের নীচের মন্তব্যগুলি পড়ুন।

ওয়ার্কিং কপিটিকে সাম্প্রতিক প্রতিশ্রুতিতে ফিরিয়ে দেওয়া

কোনও পরিবর্তন অগ্রাহ্য করে, পূর্বের প্রতিশ্রুতিতে ফিরে যেতে:

git reset --hard HEAD

যেখানে হেড আপনার বর্তমান শাখায় সর্বশেষ প্রতিশ্রুতিবদ্ধ

পুরানো প্রতিশ্রুতিতে ওয়ার্কিং কপিটি ফিরিয়ে দেওয়া

সাম্প্রতিক প্রতিশ্রুতি থেকে পুরানো একটি প্রতিশ্রুতিতে ফিরে যেতে:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

ক্রেডিটগুলি অনুরূপ স্ট্যাক ওভারফ্লো প্রশ্নে যায়, গিতে কোনও এসএএইচ হ্যাশ দ্বারা প্রতিশ্রুতিতে ফিরে আসুন?


33
আমি এটি করেছিলাম, কিন্তু তখন আমি প্রতিশ্রুতিবদ্ধ করতে পারি নি এবং দূরবর্তী সংগ্রহস্থলের দিকে ঠেলা দিতে পারি নি। আমি মাথা পেতে একটি নির্দিষ্ট বয়স্ক প্রতিশ্রুতি চাই ...
লেনন

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

6
আমি শুধু নামেও অনুসরণ পরিবর্তে প্রথমে একটি মিশ্র রিসেট করছেন, যে নির্দেশ, অন্যথায় নরম রিসেট সমাধান জন্য চান এবং একটি হার্ড রিসেট গত, আপনি আসলে প্রথম হার্ড রিসেট করতে পারেন,: git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit

5
@ নটন লিনাস নিজেকে গিটারের নির্মাতা পলিং করেছেন, এটি খুব জটিল বলে সমালোচনা করেছেন। তিনি রেকর্ডে
রয়েছেন

5
@ বোল্ডার_রবি আমার ধারণা আপনারা লিনাস টোরভাল্ডসকে গিটের স্রষ্টা বলেছিলেন। তবে আমি মনে করি লিনাস পলিং সম্ভবত সম্মত হবেন যে গিট জটিল।
সানকাট 2000

215

আমার এবং সম্ভবত অন্যদের জন্য সেরা বিকল্পটি হ'ল গিট রিসেট বিকল্প:

git reset --hard <commidId> && git clean -f

এটি আমার জন্য সেরা বিকল্প ছিল! এটি সহজ, দ্রুত এবং কার্যকর!


** দ্রষ্টব্য: ** মন্তব্যে উল্লিখিত হিসাবে আপনি যদি আপনার শাখাটি অন্য লোকদের সাথে ভাগ করে নিচ্ছেন যাদের পুরানো কমিটগুলির অনুলিপি রয়েছে

এছাড়াও মন্তব্যগুলি থেকে, আপনি যদি কম 'বলজি' পদ্ধতি ব্যবহার করতে পারেন তবে

git clean -i

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

7
আমি দ্বিতীয় @ কাপকেকের সতর্কতা ... এর পরিণতি সম্পর্কে খুব সচেতন থাকি। উল্লেখ্য, যে যদি আপনার প্রয়োজন সত্যিই করা হয় ঐ করে চিরতরে ইতিহাস থেকে অদৃশ্য হয়ে, এই রিসেট + + পরিষ্কার পদ্ধতি এটা করতে হবে, এবং আপনার জন্য প্রয়োজন হবে বল ধাক্কা আপনার পরিবর্তিত শাখা যেকোন এবং সমস্ত রিমোটের ফিরে।
ashnazg

5
গিট ক্লিন -f ডাঞ্জার ডেঞ্জার
টিচ করুন

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

2
@ অ্যাড .. আপনি git push -fপতাকাটি ব্যবহার করতে পারেন .. তবে সাবধান হন, এটি রিমোটকে ওভাররাইড করে দেবে .. আপনি কী করতে চান তা আপনি নিশ্চিত জানেন ..।
পোগরিন্ডিস

176

উত্তর দেওয়ার আগে আসুন এটি কী তা ব্যাখ্যা করে কিছু পটভূমি যুক্ত করা যাক HEAD

First of all what is HEAD?

HEADকেবলমাত্র বর্তমান শাখায় বর্তমান প্রতিশ্রুতি (সর্বশেষ) এর একটি উল্লেখ। HEADযে কোনও সময় কেবলমাত্র একা থাকতে পারে (বাদে git worktree)।

এর সামগ্রীটি HEADভিতরে সঞ্চিত .git/HEADথাকে এবং এতে বর্তমান প্রতিশ্রুতির 40 বাইট এসএইএ -1 রয়েছে।


detached HEAD

আপনার উপর না হন, তাহলে সর্বশেষ কমিট - অর্থ যে HEADএকটি পূর্বে নির্দেশ করা হয় ইতিহাস বলা হচ্ছে এ কমিট detached HEAD

এখানে চিত্র বিবরণ লিখুন

কমান্ড লাইনে এটি দেখতে দেখতে - শাখা নামের পরিবর্তে SHA-1 HEADহ'ল যেহেতু বর্তমান শাখার অগ্রভাগের দিকে ইশারা করছে না:

এখানে চিত্র বিবরণ লিখুন


বিচ্ছিন্ন হেড থেকে কীভাবে পুনরুদ্ধার করবেন সে সম্পর্কে কয়েকটি বিকল্প:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

এটি পছন্দসই প্রতিশ্রুতি নির্দেশ করে নতুন শাখাটি চেকআউট করবে। এই আদেশটি প্রদত্ত প্রতিশ্রুতিতে চেকআউট করবে।

এই মুহুর্তে আপনি একটি শাখা তৈরি করতে পারেন এবং এ থেকে কাজ শুরু করতে পারেন:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

আপনি সর্বদা reflogপাশাপাশি ব্যবহার করতে পারেন । git reflogআপডেট হওয়া যে কোনও পরিবর্তন প্রদর্শন করবে HEADএবং কাঙ্ক্ষিত রিফ্লগ এন্ট্রি চেক HEADকরা এই প্রতিশ্রুতিতে ফিরে আসবে।

যতবারই হেডের সংশোধন করা হয় সেখানে একটি নতুন প্রবেশ থাকবে reflog

git reflog
git checkout HEAD@{...}

এটি আপনাকে আপনার কাঙ্ক্ষিত প্রতিশ্রুতিতে ফিরিয়ে আনবে

এখানে চিত্র বিবরণ লিখুন


git reset HEAD --hard <commit_id>

আপনার মাথাটি পছন্দসই প্রতিশ্রুতিতে ফিরে যান।

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • দ্রষ্টব্য: ( গিট ২.7 থেকে ) আপনি এটিও ব্যবহার করতে পারেন git rebase --no-autostash

এই স্কিমাটি বোঝায় যে কোন আদেশটি কী করে। আপনি দেখতে পারেন সেখানে reset && checkoutপরিবর্তন HEAD

এখানে চিত্র বিবরণ লিখুন


6
দুর্দান্ত ইঙ্গিতটি git reflog, এটাই আমার প্রয়োজন ছিল
smac89

4
সেকি! এগুলি সমস্ত ভয়ঙ্কর জটিল বলে মনে হচ্ছে ... এমন কোনও সাধারণ কমান্ড নেই যা প্রক্রিয়াতে আপনাকে কেবল এক ধাপ পিছনে নিয়ে যায়? আপনার প্রকল্পের 1.1 সংস্করণ থেকে 1.0 সংস্করণে ফিরে যেতে চান? আমি এরকম কিছু আশা করব: গিট স্টেপব্যাক_অন_কমিট বা অন্য কিছু ....
কোকোডোকো

রয়েছে: git reset HEAD^--হার্ড
উইজার্ড

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

145

আপনি যদি "অপসারণ" করতে চান তবে শেষ প্রতিশ্রুতি বার্তাটি মুছে ফেলুন এবং পরিবর্তিত ফাইলগুলি মঞ্চে ফিরিয়ে দিতে চাইলে আপনি এই কমান্ডটি ব্যবহার করবেন:

git reset --soft HEAD~1
  • --softইঙ্গিত দেয় যে আপমুক্ত ফাইলগুলি কার্যত ফাইল হিসাবে ধরে রাখতে হবে --hardযার বিপরীতে তারা তা বাতিল করে দেবে।
  • HEAD~1শেষ প্রতিশ্রুতি। আপনি যদি রোলব্যাক করতে চান 3 টি কমিট আপনি ব্যবহার করতে পারেন HEAD~3। আপনি যদি কোনও নির্দিষ্ট সংশোধন নম্বরটিতে রোলব্যাক করতে চান তবে আপনি এটির এসএএচএ হ্যাশ ব্যবহার করে এটিও করতে পারেন।

এটি এমন পরিস্থিতিতে একটি অত্যন্ত কার্যকর কমান্ড যেখানে আপনি ভুল কাজটি করেছিলেন এবং আপনি সর্বশেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরিয়ে আনতে চান।

সূত্র: http://nakkaya.com/2009/09/24/git-delete-last-commit/


3
এটি নরম এবং মৃদুভাবে: ঝুঁকি মুক্ত যদি আপনি আপনার কাজটি
চালিত

124

আপনি নিম্নলিখিত দুটি আদেশ দ্বারা এটি করতে পারেন:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

এটি আপনার পূর্ববর্তী গিট কমিট সরিয়ে ফেলবে।

আপনি যদি নিজের পরিবর্তনগুলি রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

git reset --soft [previous Commit SHA id here]

তারপরে এটি আপনার পরিবর্তনগুলি সংরক্ষণ করবে।


2
আমি এই পোস্টে না পাওয়া পর্যন্ত আমি এই পোস্টে 1/2 ডজন উত্তর চেষ্টা করেছি .. এই সমস্ত অন্যদের, আমার গিট কনফিগারটি আমাকে ধাক্কা দেওয়ার চেষ্টা করার সময় একটি ত্রুটি দিয়েছিল। এই উত্তর কাজ করে। ধন্যবাদ!
জিন বো বো

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

1
আমার পক্ষে খারাপ সংশ্লেষটি পূর্বাবস্থায় ফেলার একমাত্র উপায়, এই ক্ষেত্রে ফিরে যাওয়া কাজ করে না। ধন্যবাদ!
ডেভ কোল

সেরা উত্তর. ধন্যবাদ
ইমরান পোলব

সেরা উত্তর, আপনাকে ধন্যবাদ।
ব্যবহারকারী 1394

114

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

git add . && git checkout master -f

ছোট বিবরণ:

  • এটি এর মতো কোনও কমিট তৈরি করবে না git revert
  • এটি আপনার হেডের মতো git checkout <commithashcode>করে আলাদা করবে না ।
  • এটি আপনার সমস্ত স্থানীয় পরিবর্তনকে ওভাররাইড করবে এবং শাখায় শেষ প্রতিশ্রুতিবদ্ধ হওয়ার পরে যুক্ত হওয়া সমস্ত ফাইল মুছে ফেলবে।
  • এটি কেবল শাখার নাম নিয়ে কাজ করে, তাই আপনি কেবল শাখায় সর্বশেষ প্রতিশ্রুতিতে ফিরে যেতে পারেন।

আমি উপরের ফলাফলগুলি অর্জনের জন্য আরও অনেক সুবিধাজনক এবং সহজ উপায় পেয়েছি:

git add . && git reset --hard HEAD

যেখানে হেড আপনার বর্তমান শাখায় সর্বশেষ প্রতিশ্রুতিবদ্ধ নির্দেশ করে।

এটি একই কোড কোড যা বোল্ডার_রবি পরামর্শ দিয়েছিল, তবে আমি সর্বশেষ কমিটের পরে তৈরি সমস্ত নতুন ফাইলগুলি মুছে ফেলার git add .আগে যুক্ত করেছি git reset --hard HEADযেহেতু সর্বশেষ লোকেরা প্রত্যাশা করে যে আমি সর্বশেষ প্রতিশ্রুতিতে প্রত্যাবর্তনের সময় বিশ্বাস করি।


83

ঠিক আছে, গিটের আগের প্রতিশ্রুতিতে ফিরে যাওয়া বেশ সহজ ...

পরিবর্তনগুলি না রেখে ফিরে যান :

git reset --hard <commit>

পরিবর্তনগুলি রেখে ফিরে যান :

git reset --soft <commit>

ব্যাখ্যা: ব্যবহার করে git reset, আপনি একটি নির্দিষ্ট অবস্থায় পুনরায় সেট করতে পারেন। আপনি উপরের মত দেখতে কমিট হ্যাশ দিয়ে এটিকে ব্যবহার করা সাধারণ।

তবে আপনি দেখতে পাচ্ছেন যে পার্থক্যটি দুটি পতাকা ব্যবহার করছে --softএবং --hardডিফল্টরূপে পতাকা git resetব্যবহার করছে --soft, তবে পতাকাটি সর্বদা ব্যবহার করা একটি ভাল অনুশীলন, আমি প্রতিটি পতাকাটি ব্যাখ্যা করি:


--soft

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


--hard

এই পতাকাটি সম্পর্কে সতর্কতা অবলম্বন করুন। এটি কার্যকারী ট্রিটিকে পুনরায় সেট করে এবং ট্র্যাক করা ফাইলগুলিতে সমস্ত পরিবর্তন করে এবং সমস্ত কিছু চলে যাবে!


আমি নীচের চিত্রটিও তৈরি করেছি যা গিটারের সাথে কাজ করে সত্যিকারের জীবনে ঘটতে পারে:

গিট একটি প্রতিশ্রুতি পুনরায় সেট করুন



70

ধরে নিই যে আপনি মাস্টার এবং সেই সম্পর্কিত শাখায় কথা বলছেন (এটি বলেছে যে এটি আপনার সাথে সম্পর্কিত কোনও কার্যকারী শাখা হতে পারে):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

আমি উত্তরটি একটি ব্লগ পোস্টে পেয়েছি (এখন আর নেই)

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

রিসেটের চেয়ে রিভার্ট (অন্যান্য উত্তর দেখুন) ব্যবহার করা ভাল। যদি আপনি ওয়ান ম্যান দল হন তবে সম্ভবত এটি কোনও ব্যাপার নয়।


6
এই উত্তরটি অন্যের অগণিতের চেয়ে আলাদা কীভাবে?
ম্যাটসমাথ

এটা দুর্ভাগ্যজনক. আমি এই ব্লগারকে ইমেল করেছি - আশা করি এখনও সে তা আছে!
মার্ক্রেইস


2
এটি কীভাবে ঠিক করা যায় তার জন্য বেশিরভাগ অন্যান্য পরামর্শ থেকে পুশ সিনট্যাক্সটি অনুপস্থিত। দুর্দান্ত কাজ করেছেন
jpa57

61

বলুন যে আপনার কাছে নামের একটি পাঠ্য ফাইলে নিম্নলিখিত কমিট রয়েছে ~/commits-to-revert.txt(আমি git log --pretty=onelineসেগুলি পেয়েছিলাম )

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

এগুলির প্রত্যেককে ফেরত দেওয়ার জন্য বাশ শেল স্ক্রিপ্ট তৈরি করুন:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

এটি ফাইল এবং ডিরেক্টরি তৈরি এবং মুছে ফেলা সহ সমস্ত পূর্ববর্তী স্থানে ফিরিয়ে দেয় এবং এটি আপনার শাখায় প্রতিশ্রুতি দেয় এবং আপনি ইতিহাস বজায় রাখেন, কিন্তু আপনি এটি আবার একই ফাইল কাঠামোতে ফিরে এসেছেন। গিটের কেন নেই তা git revert --to <hash>আমার বাইরে।


41
আপনি git revert HEAD~3সর্বশেষ 3
রড

25
@ রড - না, এটি ঠিক নেই। এই কমান্ডটি সেই প্রতিশ্রুতি ফিরিয়ে দেবে যা হেডের তৃতীয় পিতামহ (শেষ তিনটি কমিট নয়)।
কেফ্লোরেন্স

1
@kflorence ঠিক আছে তথ্যের জন্য ধন্যবাদ। চান git revert -n master~3..master~1কাজ করে? (যেমন কার্নেল.আর.কম / পব / সফটওয়্যার / এসএসএম / গীত / ডকস / গিট-রিভার্ট এইচটিএমএল থেকে দেখা হয়েছে )
রড

3
@ রড - এটি ঠিক মনে হচ্ছে, এটি অবশ্যই একটি কুৎসিত বাক্য গঠন যা না? আমি সর্বদা আমি "প্রত্যাবর্তন" করতে চাইছি এমন প্রতিশ্রুতিটি যাচাই করে দেখেছি এবং তারপরে আরও স্বজ্ঞাগত।
কেফ্লোরেন্স

7
এই জাতীয় স্ক্রিপ্টের চেয়ে এখন এটি করার অনেক সহজ উপায় আছে, কেবল ব্যবহার করুন git revert --no-commit <start>..<end>কারণ git revertগিতের নতুন (বা সমস্ত?) সংস্করণগুলিতে কমিট রেঞ্জ গ্রহণ করে। মনে রাখবেন যে রেঞ্জের শুরুটি রিভার্টের অন্তর্ভুক্ত নয়।

58

জেফ্রমি সমাধানগুলির অতিরিক্ত বিকল্প

জেফ্রুমির সমাধানগুলি অবশ্যই সেরা and যাইহোক, সম্পূর্ণতার জন্য, আমি এই অন্যান্য বিকল্প সমাধানগুলিও দেখাতে চেয়েছিলাম যা প্রতিশ্রুতি প্রত্যাহার করতেও ব্যবহার করা যেতে পারে (এই অর্থে যে আপনি একটি নতুন প্রতিশ্রুতি তৈরি করেছেন যা পূর্বের প্রতিশ্রুতিতে পরিবর্তিত হয় , ঠিক তেমন কি git revertকরে না)।

স্পষ্ট করে বলতে গেলে , এই বিকল্পগুলি প্রতিশ্রুতি ফিরিয়ে দেওয়ার সর্বোত্তম উপায় নয় , জেফ্রোই এর সমাধানগুলি তবে আমি কেবল এটিই উল্লেখ করতে চাই যে আপনি একই জিনিস অর্জনের জন্য এই অন্যান্য পদ্ধতিগুলিও ব্যবহার করতে পারেনgit revert

বিকল্প 1: হার্ড এবং নরম পুনরায় সেট করুন

গিটে কোনও এসএএইচ হ্যাশ দ্বারা প্রতিশ্রুতিতে ফিরে আসার জন্য এটি চার্লস বেলির সমাধানের খুব সামান্য পরিবর্তিত সংস্করণ ? :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

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

বিকল্প 2: বর্তমান গাছটি মুছুন এবং নতুনটির সাথে প্রতিস্থাপন করুন

এই সমাধানটি সুইচ এর সমাধান থেকে চেকআউট পুরানো প্রতিশ্রুতি থেকে আসে এবং এটি একটি নতুন প্রতিশ্রুতিবদ্ধ :

git rm -r .
git checkout <commit> .
git commit

একইভাবে বিকল্প # 1 এর জন্য, <commit>এটি বর্তমান কার্যকরী অনুলিপিটির স্থিতি পুনরুত্পাদন করে । এটি git rmপ্রথমে করা দরকার কারণ git checkoutসেই সময় থেকে যুক্ত করা ফাইলগুলি সরানো হবে না <commit>


বিকল্প 1 সম্পর্কে, একটি তাত্ক্ষণিক প্রশ্ন: এমনটি করার মাধ্যমে আমরা কি কমিটের মধ্যে সঠিকভাবে আলগা হই না?
বোগাক

2
@ বোগাক - বিন্দুগুলি একটি ফাইলের পথ নির্দেশ করে, এক্ষেত্রে বর্তমান ডিরেক্টরি, সুতরাং এটি ধরে নেওয়া হয় যে আপনি এটি আপনার কার্যকরী অনুলিপিটির মূল থেকে চালাচ্ছেন।
টম

সাবধানবাণী উত্তরে বেশ কয়েকবার পুনরাবৃত্তি করা হয়, কিন্তু কেউ যোগ করতে পারিনি কেন এই হল সর্বোত্তম উপায় না - মত তুলনায় কিছু, git revert HEAD~2..HEADথেকে @ Cascabel এর (@ Jefromi এর) লিঙ্ক সমাধান। সমস্যা দেখছি না।
জোশুয়া গোল্ডবার্গ

55

পূর্বের প্রতিশ্রুতিতে ফিরে যাওয়ার খুব সহজ উপায় এখানে রয়েছে (এবং এটি যা আপনার পছন্দমতো করতে চান তা করতে)

git reset HEAD~1

সুতরাং, কমিট আইডির প্রয়োজন নেই এবং তেমন :)


এই ফলনের পরে কাজটি হয়নি, গিট টান: ত্রুটি: নিম্নলিখিত ফাইলগুলিতে আপনার স্থানীয় পরিবর্তনগুলি মার্জ করে ওভাররাইট করা হবে:
ম্যালহাল

1
@ মমহাল এটি কারণ আপনার আপত্তিজনক পরিবর্তন হয়েছে। এগুলি স্ট্যাশ / পুনরায় সেট করুন এবং তারপরে এটি ত্রুটি ছাড়াই কাজ করবে।
পল ওলচেজেউস্কি

39

পুরানো কমিটগুলি ফিরিয়ে আনতে এবং পরিচালনা করার জন্য একটি কমান্ড রয়েছে (কোর গিটের অংশ নয়, তবে এটি গিট-এক্সট্রা প্যাকেজে রয়েছে):

git back

প্রতি man পৃষ্ঠা , এটি যেমন ব্যবহার করা যেতে পারে:

# Remove the latest three commits
git back 3

37

সবচেয়ে ভাল উপায়:

git reset --hard <commidId> && git push --force

এটি শাখাটিকে নির্দিষ্ট প্রতিশ্রুতিতে পুনরায় সেট করবে এবং তারপরে আপনার স্থানীয় হিসাবে যেমন একই প্রতিশ্রুতি দিয়ে রিমোট সার্ভারটি আপলোড করবে (এটি নির্দিষ্ট সীমাবদ্ধতার পরে কমান্ডগুলি পুরোপুরি মুছে ফেলবে)

--forceপতাকাটি সম্পর্কে সতর্কতা অবলম্বন করুন নির্বাচিত প্রতিশ্রুতি পরে পুনরুদ্ধারের বিকল্প ব্যতীত পরবর্তী সমস্ত কমিট সরিয়ে দেয়।


3
মোহন মত কাজ!
গৌরব গুপ্ত

আমি ডাউনওয়েট করেছি কারণ আপনার উত্তরটি ইতিমধ্যে স্ট্যাকওভারফ্লো . com / a / 37145089/ 1723886 , স্ট্যাকওভারফ্লো . com / a/ 27438379 / 1723886 বা স্ট্যাকওভারফ্লো . com / a/ 48756719 / 1723886 তে প্রদত্ত কোনও নতুন তথ্য কীভাবে সরবরাহ করে তা দেখতে আমি ব্যর্থ হয়েছি । প্রকৃতপক্ষে বেশিরভাগ প্রতিশ্রুতিগুলিতে ইতিমধ্যে গিট রিসেট - হরহড এবং আরও অনেকগুলি উল্লেখ করা হয় - বল বা -f ঠেলাঠেলি ব্যবহার করে।
অ্যালেক্স টেলন

এটি কেবল একটি কমান্ড দিয়ে পরিষ্কার করে এবং সহজ কাজ করে। আপনি যদি আমার উত্তরটি পছন্দ না করেন তবে নির্দ্বিধায় আপনি আমাকে উত্তর দিতে পারেন।
ডেভিড.টি_৯২ ২২

1
ভবিষ্যতের জন্য বিবেচনার জন্য আরেকটি বিকল্প হ'ল পূর্বের উত্তরে একটি সম্পাদনার পরামর্শ দেওয়া বা একটি মন্তব্য যুক্ত করে বলা উচিত যে 'উদাহরণস্বরূপ &&&' ব্যবহার করে এটি একটি লাইনেও করা যেতে পারে। এই ভাবে সবাই তখন এক জায়গায় উন্নত উত্তর দেখতে পারে।
অ্যালেক্স টেলন

36

সমস্ত পরিবর্তনের পরে, আপনি যখন এই সমস্ত কমান্ডটি চাপবেন তখন আপনাকে ব্যবহার করতে হতে পারে:

git push -f ...

এবং না শুধুমাত্র git push


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

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

ধন্যবাদ! আমার স্থানীয় শাখার সাথে কীভাবে দূরবর্তী ব্রাঞ্চটি মিলে যায় তা আমি বুঝতে পারি না, কেবল একটি শক্তি ধাক্কা দেওয়ার দরকার ছিল।
মিডো

32

আপনি এই সমস্ত প্রাথমিক পদক্ষেপগুলি নিজেই শেষ করতে পারেন এবং গিট সংগ্রহস্থলে ফিরে যেতে পারেন।

  1. git pull --allকমান্ডটি ব্যবহার করে বিটবকেট থেকে আপনার সংগ্রহস্থলের সর্বশেষতম সংস্করণটি টানুন ।

  2. -n 4আপনার টার্মিনাল থেকে গিট লগ কমান্ডটি চালান । -nআপনার স্থানীয় ইতিহাসের সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি থেকে শুরু হওয়া লগতে কমিটের সংখ্যা নির্ধারণের পরে সংখ্যা ।

    $ git log -n 4
    
  3. আপনি git reset --hard HEAD~Nযেখানে মাথা পিছনে নিয়ে যেতে চান সেই কমিটের সংখ্যা N এটি ব্যবহার করে আপনার ভাণ্ডারের ইতিহাসের মাথাটি পুনরায় সেট করুন । নিম্নলিখিত উদাহরণে মাথাটি প্রতিশ্রুতিবদ্ধ ইতিহাসের শেষ প্রতিশ্রুতি হিসাবে একটি প্রতিশ্রুতি ফিরিয়ে দেওয়া হবে:

  4. পরিবর্তনকে git push --forceজোর করতে চাপ প্রয়োগ করে গিট সংগ্রহস্থলে পরিবর্তন ঠেলাও ।

আপনি যদি পূর্বের প্রতিশ্রুতিতে গিট সংগ্রহস্থলটি চান:

git pull --all
git reset --hard HEAD~1
git push --force


28

আপনার প্রয়োজনীয় প্রতিশ্রুতি নির্বাচন করুন এবং এটি দ্বারা পরীক্ষা করুন

git show HEAD
git show HEAD~1
git show HEAD~2 

যতক্ষণ না আপনি প্রয়োজনীয় প্রতিশ্রুতি পান। হেডকে এটি নির্দেশ করতে, করুন

git reset --hard HEAD~1

বা git reset --hard HEAD~2বা যাই হোক না কেন


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

2
এছাড়াও, স্পষ্ট git show HEADকরে বলতে গেলে, কেবল ব্যবহারের সমতুল্য git log HEAD -1

25

যদি পরিস্থিতি জরুরি হয়ে থাকে এবং আপনি প্রশ্নকর্তাকে যা দ্রুত এবং নোংরা পথে জিজ্ঞাসা করেছেন কেবল তা করতে চান , ধরে নিলেন আপনার প্রকল্পটি একটি ডিরেক্টরি হিসাবে পরিচালিত ডিরেক্টরি হিসাবে রয়েছে, উদাহরণস্বরূপ, "আমার প্রকল্প":


দ্রুত এবং শুকনো : পরিস্থিতিগুলির উপর নির্ভর করে দ্রুত এবং নোংরা বাস্তবে খুব ভাল হতে পারে। আমার সমাধানটি এখানে যা করবে তা অপরিবর্তনীয়ভাবে আপনার কার্য ডিরেক্টরিতে থাকা ফাইলগুলি আপনার .git / ডিরেক্টরিতে নীচে লুকিয়ে থাকা গিট रिपোরসির গভীরতা থেকে আটকানো / নিষ্কাশন করা ফাইলগুলির সাথে অপরিবর্তনীয়ভাবে প্রতিস্থাপন করা হবে না , যার মধ্যে রয়েছে অনেক। বিপর্যয়কর পরিস্থিতি বলে মনে হতে পারে এমন পরিস্থিতি পুনরুদ্ধার করার জন্য আপনি তেমন জরিপ-সাগর ডুবাই করার দরকার নেই এবং পর্যাপ্ত দক্ষতা ছাড়াই এটি করার চেষ্টা মারাত্মক প্রমাণিত হতে পারে


  1. পুরো ডিরেক্টরিটি অনুলিপি করুন এবং এটিকে "আমার প্রকল্প - অনুলিপি" এর মতো আরও কিছু বলুন। ধরে নিই যে আপনার গিট সংগ্রহস্থল ("রেপো") ফাইলগুলি "আমার প্রকল্প" ডিরেক্টরিতে রয়েছে (তাদের জন্য ডিফল্ট স্থান, ".git" নামে একটি ডিরেক্টরিতে), আপনি এখন আপনার কাজের ফাইল এবং আপনার রেপো ফাইল উভয়ই অনুলিপি করতে পারবেন।

  2. "আমার প্রকল্প" ডিরেক্টরিতে এটি করুন:

    .../my project $ git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

এটি "আমার প্রকল্প" এর অধীনে রেপির অবস্থাটি ফিরিয়ে দেবে যখন আপনি সেই প্রতিশ্রুতিটি করেছিলেন ("" কমিট "মানে আপনার কার্যকারী ফাইলগুলির একটি স্ন্যাপশট))। তারপরে থেকে সমস্ত কমিটগুলি "আমার প্রকল্প" এর আওতায় চিরকালের জন্য হারিয়ে যাবে, তবে তারা এখনও "আমার প্রকল্প - অনুলিপি" এর অধীনে রেপোতে উপস্থিত থাকবে যেহেতু আপনি সমস্ত অনুলিপি করেছেন ফাইলগুলি - ... গিট এর অধীন /।

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

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

গিট একটি উজ্জ্বল সৃষ্টি তবে একেবারে কেউই "এটিকে উড়ে নিতে" সক্ষম করতে পারে না: এমন লোকেরাও যা প্রায়শই এটি ব্যাখ্যা করার চেষ্টা করে করে তারা অন্যান্য ভিসিএসের [পূর্ববর্তী সংস্করণ] পূর্বের জ্ঞান ধরে নেয় এবং অনেক গভীর দূরে আবিষ্কার করে খুব শীঘ্রই, এবং অন্যান্য অপরাধ সংঘটন, যেমন "চেক আউট" এর জন্য বিনিময় পদ ব্যবহার করে - যেভাবে কখনও কখনও কোনও শিক্ষানবিশকে বিভ্রান্ত করতে প্রায় গণনা করা হয়।

নিজেকে অনেক চাপ বাঁচাতে আমার দাগ থেকে শিখুন। আপনাকে গিটের উপর একটি বই পড়তে হবে - আমি "ভার্সন নিয়ন্ত্রণ উইথ গিট" এর পরামর্শ দেব । তাড়াতাড়ি না করে তাড়াতাড়ি করুন। যদি আপনি তা করেন তবে মনে রাখবেন যে গিটের অনেক জটিলতা ব্রাঞ্চিং এবং তারপরে পুনর্বিবেচনা থেকে আসে: আপনি যে কোনও বইতে এই অংশগুলি এড়িয়ে যেতে পারেন। আপনার প্রশ্ন থেকে লোকেরা আপনাকে বিজ্ঞানের সাথে অন্ধ করে দেওয়ার কোনও কারণ নেই

বিশেষত যদি, উদাহরণস্বরূপ, এটি একটি মরিয়া পরিস্থিতি এবং আপনি গিটের সাথে নবাগত!

পিএস: অন্য একটি ধারণা: কার্যকারী ফাইলের সাথে গিট রেপোকে অন্য একটি ডিরেক্টরিতে রেখে দেওয়া এখন (এখন) আসলে বেশ সহজ। এর অর্থ হ'ল উপরের দ্রুত এবং নোংরা সমাধান ব্যবহার করে আপনাকে পুরো গিট সংগ্রহস্থলটি অনুলিপি করতে হবে না। ফ্রাইয়ারের উত্তরটি --separate-git-dir এখানে ব্যবহার করে দেখুন । সতর্কতা অবলম্বন করুন , যদিও: যদি আপনার কাছে একটি "পৃথক ডিরেক্টরি" সংগ্রহস্থল থাকে যা আপনি অনুলিপি করেন না, এবং আপনি যদি হার্ড রিসেট করেন তবে রিসেট প্রতিশ্রুতি অনুসারে সমস্ত সংস্করণ চিরতরে নষ্ট হয়ে যাবে, যদি না আপনার যেমন থাকে, অন্যান্য জায়গাগুলির মধ্যে প্রায়শই মেঘে (যেমন গুগল ড্রাইভে ) আপনার সংগ্রহস্থলটিকে নিয়মিতভাবে ব্যাক আপ করুন ।

"ক্লাউডে ব্যাক আপ করার" বিষয়টিতে, পরবর্তী পদক্ষেপটি হ'ল গিটহাবের সাথে একটি অ্যাকাউন্ট (অবশ্যই নিখরচায়) খুলতে হবে (আমার দৃষ্টিতে আরও ভাল) গিটল্যাব । তারপরে আপনি নিয়মিতভাবে git pushআপনার ক্লাউড রেপোকে "সঠিকভাবে" আপ-টু-ডেট করার জন্য একটি আদেশ করতে পারেন। তবে আবার, এ সম্পর্কে কথা বলা খুব শীঘ্রই হতে পারে।


23

সাম্প্রতিক প্রতিশ্রুতিতে সরাসরি পুনরায় সেট করার এটি আরও একটি উপায়

git stash
git stash clear

এটি সর্বশেষ প্রতিশ্রুতি দেওয়ার পরে আপনি যে সমস্ত পরিবর্তনগুলি করেছেন তা সরাসরি সাফ করে।

পিএস: এতে কিছুটা সমস্যা আছে; এটি আপনার সঞ্চিত স্ট্যাশ পরিবর্তনগুলি মুছে ফেলে। যা আমি অনুমান করি বেশিরভাগ ক্ষেত্রে বিষয়টি বিবেচনা করা উচিত নয়।


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

ওহ কেন স্ট্যাশ ক্লিয়ারিং? অ-সমাধান হওয়া ছাড়াও এটি আসলে ক্ষতিকারক। প্রশ্নের প্রথম বাক্যটি পড়লে তাৎক্ষণিকভাবে স্ট্যাশ সলিউশনটি অকার্যকর হয়ে যায় (যা কেবলমাত্র শেষ প্রতিশ্রুতিতে পুনরায় সেট করতে কার্যকর হতে পারে)।
রোমেনভ্যালেরি

22

কিছু দুর্ঘটনাজনিত পরিবর্তন থেকে কোনও কোডারের ডিরেক্টরি পুরোপুরি পরিষ্কার করতে আমরা ব্যবহার করেছি:

git add -A .
git reset --hard HEAD

কেবল git reset --hard HEADপরিবর্তনগুলি থেকে মুক্তি পাবেন তবে এটি "নতুন" ফাইলগুলি থেকে মুক্তি পাবে না। তাদের ক্ষেত্রে তারা দুর্ঘটনাক্রমে এলোমেলোভাবে কোথাও একটি গুরুত্বপূর্ণ ফোল্ডারটি টেনে নিয়ে গিয়েছিল এবং এই সমস্ত ফাইলগুলি গিট দ্বারা নতুন হিসাবে বিবেচিত হচ্ছিল, তাই কোনও reset --hardএটি ঠিক করে নি। git add -A .আগে থেকে চালিয়ে , এটি পুনরায় সেট করে মুছে ফেলার জন্য স্পষ্টভাবে তাদের সমস্তকে গিট দিয়ে ট্র্যাক করেছিল।


21

পূর্বের প্রতিশ্রুতি থেকে শিরোনাম থেকে পরিবর্তনগুলি ধরে রাখতে এবং পূর্ববর্তী প্রতিশ্রুতিতে যেতে, করুন:

git reset <SHA>

পূর্বের প্রতিশ্রুতি থেকে শিরোনাম থেকে পরিবর্তনগুলি প্রয়োজন না হলে এবং কেবল সমস্ত পরিবর্তনগুলি বাতিল করে দিন:

git reset --hard <SHA>

20

আমি বিশ্বাস করি যে কিছু লোক এই প্রশ্নে আসতে পারে তারা কীভাবে তাদের মাস্টারের প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি রোলব্যাক করবেন তা জানতে চান - অর্থাত সবকিছু ফেলে দিয়ে উত্স / মাস্টারে ফিরে যান, এক্ষেত্রে এটি করুন:

git reset --hard origin/master

/superuser/273172/how-to-reset-master-to-origin-master


18

প্রত্যাবর্তনগুলি হল কমিটগুলি রোলব্যাক করার আদেশ command

git revert <commit1> <commit2> 

নমুনা:

git revert 2h3h23233

এটি নীচের মতো হেড থেকে রেঞ্জ নিতে সক্ষম। এখানে 1 বলেছেন "শেষ প্রতিশ্রুতি ফিরিয়ে দিন।"

git revert HEAD~1..HEAD

এবং তারপর না git push


14

পছন্দসই প্রতিশ্রুতি পুনরায় সেট করার চেষ্টা করুন -

git reset <COMMIT_ID>

(COMMIT_ID ব্যবহার পরীক্ষা করতে git log)

এটি সমস্ত পরিবর্তিত ফাইলকে অ-যুক্ত অবস্থায় পুনরায় সেট করবে।

এখন আপনি checkoutসমস্ত আন-এড করা ফাইলগুলি এর মাধ্যমে করতে পারেন

git checkout .

git logআপনার পরিবর্তনগুলি যাচাই করতে চেক করুন ।

হালনাগাদ

যদি আপনার একটি থাকে এবং কেবল আপনার রেপোতে প্রতিশ্রুতিবদ্ধ হন, চেষ্টা করুন

git update-ref -d HEAD


13

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

আপনাকে প্রথমে উত্স থেকে বিকাশ অপসারণ করতে হবে :

git push origin :develop (note the colon)

তারপরে আপনার যে স্ট্যাটাসটি রয়েছে সেটির উন্নতি করতে হবে, আমি কমিট হ্যাশটি EFGHIJK ধরে নিতে পারি:

git reset --hard EFGHIJK

শেষ অবধি, আবার বিকাশের দিকে ধাক্কা দিন :

git push origin develop

13

সতর্ক করা! এই কমান্ডটি যদি ভুলভাবে ভুল প্রতিশ্রুতিবদ্ধ করে, তবে কমিটের ইতিহাস হারাতে পারে। আপনি কিছুটা সুরক্ষিত হওয়ার চেয়ে আপনার ভুলগুলি করতে পারলে অন্যদিকে আপনার গিটের অতিরিক্ত ব্যাকআপ রাখুন Always :)

আমারও অনুরূপ সমস্যা ছিল এবং আমি পূর্বের প্রতিশ্রুতিতে ফিরে যেতে চাইতাম। আমার ক্ষেত্রে আমি নতুন প্রতিশ্রুতি রক্ষা করতে আগ্রহী ছিলাম না, তাই আমি ব্যবহার করেছি Hard

এটি আমি এটি করেছিলাম:

git reset --hard CommitId && git clean -f

এটি স্থানীয় সংগ্রহস্থলটিতে ফিরে আসবে এবং এখানে ব্যবহারের পরে git push -fদূরবর্তী সংগ্রহস্থল আপডেট করবে।

git push -f

13

ইন GitKraken আপনি এটা করতে পারেন:

  1. আপনি যে পুনঃস্থাপন করতে চান সেই প্রতিশ্রুতিতে ডান ক্লিক করুন, চয়ন করুন: এই প্রতিশ্রুতিটি / হার্ডটিতে রিসেট করুন :

    এখানে চিত্র বিবরণ লিখুন

  2. কমিটিকে আবার ডান ক্লিক করুন, চয়ন করুন: বর্তমান শাখার নাম / পুশ :

    এখানে চিত্র বিবরণ লিখুন

  3. ফোর্স পুশ ক্লিক করুন :

    এখানে চিত্র বিবরণ লিখুন

Obs। : আপনার যত্নবান হওয়া দরকার কারণ হার্ড রিসেটের পরে সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাস হারিয়ে যায় এবং এই ক্রিয়াটি অপরিবর্তনীয়। আপনি কি করছেন তা নিশ্চিত হওয়া দরকার।


11

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

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