গিট - পূর্বাবস্থার পূর্বাবস্থায় ফিরে আসা


607

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


উত্তর:


734

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

git revert <commit_hash>

এটি একটি নতুন প্রতিশ্রুতি তৈরি করবে যা আপনার নির্দিষ্ট প্রতিশ্রুতিগুলির পরিবর্তনগুলিকে ফিরিয়ে দেয়। মনে রাখবেন এটি কেবলমাত্র সেই নির্দিষ্ট প্রতিশ্রুতিগুলিকেই ফিরিয়ে দেয় এবং এর পরে কমিট করে না। আপনি যদি কমিটের একটি সীমাটি ফিরিয়ে দিতে চান তবে আপনি এটি এইভাবে করতে পারেন:

git revert <oldest_commit_hash>..<latest_commit_hash>

এটি সুনির্দিষ্ট কমিটগুলির মধ্যে এবং এর মধ্যেও কমিটকে উল্টে দেয়।

Git-প্রত্যাবর্তন man পৃষ্ঠা আরো তথ্যের জন্য git revertকমান্ড। এছাড়াও তাকান এই উত্তরটি করে প্রত্যাবর্তন আরো তথ্যের জন্য।


22
অন্য কথায় এটি <oldest_commit_hash>;) এ ফিরে আসে
ডেভিড

7
@ এমআর_জিগস ইউজ করুনgit log
গীতারিক

2
গিট ডকুমেন্টেশনে এটি বলেছে যে রিভার্ট কমান্ড প্রথম এবং শেষ কমিট (প্রথম এবং শেষ উভয় অন্তর্ভুক্ত) এর মধ্যে প্রতিশ্রুতি ফেরায়। ডকুমেন্টেশন দেখুন
ওনুর ডেমির

4
@ এওড সঠিক, এই উত্তরটি আপডেট করা দরকার। <oldest_commit_hash>
রিভার্টের

4
গিট ২.১17.২ এর সাথে রিভার্ট করুন <ডান> .. <নতুন> পুরানো অন্তর্ভুক্ত নয় তবে এতে <নতুন>
চিংসিস

353

এমন একটি সমাধান যা "পূর্বাবস্থায় ফিরে যাওয়ার" চিহ্ন রাখে না।

দ্রষ্টব্য: যদি কেউ আপনার প্রস্তুতিটি পুরোপুরি প্রস্তুত করে তবে এটি করবেন না (আমি এটি কেবল আমার ব্যক্তিগত রেপোতে ব্যবহার করব)

একটি করুন:

git reset <previous label or sha1>

এটি স্থানীয়ভাবে সমস্ত আপডেট পুনরায় চেকআউট করবে (সুতরাং গিট স্ট্যাটাস সমস্ত আপডেট হওয়া ফাইলের তালিকা করবে)

তারপরে আপনি "আপনার কাজটি করুন" এবং আপনার পরিবর্তনগুলি পুনরায় প্রতিশ্রুতিবদ্ধ (দ্রষ্টব্য: এই পদক্ষেপটি alচ্ছিক)

git commit -am "blabla"

এই মুহুর্তে আপনার স্থানীয় গাছ দূর থেকে পৃথক

git push -f <remote-name> <branch-name>

রিমোটটিকে এই চাপটি বিবেচনা করতে এবং চাপ দেবে এবং পূর্ববর্তীটি সরিয়ে ফেলবে (রিমোট-নাম এবং শাখা-নাম উল্লেখ করা বাধ্যতামূলক নয় তবে আপডেট পতাকার সাহায্যে সমস্ত শাখা আপডেট করা এড়াতে সুপারিশ করা হয়)।

!! কিছু ট্যাগ দেখুন এখনও অপসারণ প্রতিশ্রুতি নির্দেশ করা হতে পারে !! কীভাবে-Delete-এ-দূরবর্তী-ট্যাগ


4
- একটি ট্র্যাক করা সমস্ত ফাইল কমিট করা হবে
jo_

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

1
আমার কোন "পূর্ববর্তী লেবেল বা sha1" ব্যবহার করা উচিত ?. আমি কি সর্বশেষ "সঠিক" এক বা তার আগে একটিটি প্রবেশ করিয়ে সর্বশেষ সঠিক দ্বারা করা সমস্ত পরিবর্তনগুলি আবার করা উচিত?
elysch

3
একটুকু দম্পতি এর ঠিক আগে
jo_

1
ঠিক আমার যা প্রয়োজন আমি ভুল করে একটি শাখাকে মাস্টার হিসাবে ঠেলে দিয়েছি। এবং ফলস্বরূপ আমার সমস্ত কমিট ইতিহাসের সময় প্রচুর আবর্জনা করেছিল। আমি সবেমাত্র git push -fশেষ সঠিক প্রতিশ্রুতি এবং দূরবর্তী ইতিহাস সাফ করার জন্য করেছি! ধন্যবাদ!
আন্তন রাইবালকো

192

এই ক্ষেত্রে আমি যা করি তা হ'ল:

  • সার্ভারে, কার্সারটিকে সর্বশেষ পরিচিত ভাল প্রতিশ্রুতিতে ফিরে যান:

    git push -f origin <last_known_good_commit>:<branch_name>
    
  • স্থানীয়ভাবে, একই করুন:

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional
    



my_new_branchআমি এই উদ্দেশ্যে তৈরি করা একটি শাখায় একটি সম্পূর্ণ উদাহরণ দেখুন :

$ git branch
my_new_branch

এটিতে কিছু স্টাফ যুক্ত করার পরে সাম্প্রতিক ইতিহাস myfile.py:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

আমি শেষ প্রতিশ্রুতি থেকে মুক্তি পেতে চাই, যা ইতিমধ্যে ঠেলাঠেলি হয়েছিল, তাই আমি চালিয়ে যাচ্ছি:

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

নিস! এখন আমি সেই ফাইলটি দেখছি যা সেই প্রতিশ্রুতিতে পরিবর্তিত হয়েছিল ( myfile.py) "প্রতিশ্রুতি দেওয়ার জন্য পর্যায়বদ্ধ নয়" শোতে:

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

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

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

সুতরাং এখন স্থানীয় এবং দূরবর্তী উভয় ক্ষেত্রেই হেড পূর্ববর্তী প্রতিশ্রুতিতে রয়েছে:

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

10
এটা সঠিক উত্তর! আমার ক্ষেত্রে এটি হ'ল প্রয়োজন যা হ'ল ধন্যবাদ আজ নতুন কিছু শিখেছে :)
এগলি বেসেরা

2
এটা সঠিক উত্তর! এটি পুশ (!) কমিট সম্পর্কিত!
পাওয়ারটাক

3
আপনি (যেমন যদি আপনি তাদের ধাক্কা করেছি) সত্যিই প্রত্যাবর্তন পরিবর্তনের চান তাহলে, এই হল সঠিক উত্তর।
জ্যাকব

1
নিখুঁত উত্তর. প্রত্যাশার মতো কাজ করেছেন!
রাফিআলহামদ

2
কেউ এই বিয়ার কিনে!
জে নেভওয়ানি

72

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

আপনি ফিরে যেতে চান এমন প্রতিশ্রুতিবদ্ধ আইডি দেখতে নিম্নলিখিত কমান্ডটি চালান

git log --oneline --decorate --graph

আপনি নীচের স্ক্রিনশটের মতো পাবেন এখানে চিত্র বর্ণনা লিখুন

যদি আপনি রিমোটও পরীক্ষা করেন (ওয়েব ইন্টারফেসের মাধ্যমে) তবে আপনি দেখতে পাচ্ছেন যে এটি নীচের মত দেখানো হবে

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

প্রতি স্ক্রিনশট হিসাবে বর্তমানে আপনার উপর আইডি কমিট e110322 তবে তোমার কাছে ফিরে প্রত্যাবর্তন করতে চান 030bbf6 উভয় স্থানীয়ভাবে এবং দূরবর্তী

স্থানীয়ভাবে + দূরবর্তীভাবে কমিয়ে / নিরূপিত করার জন্য নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন


স্থানীয়ভাবে প্রথমে 030bbf6 আইডি প্রতিশ্রুতিবদ্ধ করতে প্রত্যাবর্তন করা হচ্ছে

git reset --hard 030bbf6

অনুসরণ করেছে

git clean -f -d

এই দুটি কমান্ড ক্লিপ ফোর্সটি পুনরায় সেট করতে স্টেজ 030bbf6 কে স্নাপশটে নীচে দেখানো হয়েছে commit

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

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

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

git fetch --all

একবার তা দিয়ে তারপর করা হয় আপনি করার প্রয়োজন হয় পুশ এই কমিট জোর ব্যবহার করে + + ইন-সামনের শাখার প্রতীক হিসেবে নিচে দেখানো। আমি এখানে মাস্টার শাখা হিসাবে ব্যবহার করেছি , আপনি এটি যে কোনও সাথে প্রতিস্থাপন করতে পারেন

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

git push -u origin +master

এখন আপনি যদি রিমোটের ওয়েব ইন্টারফেস দেখতে পান তবে প্রতিশ্রুতি দিন সেখানেও ফিরে আসা উচিত।

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


61

এটি আপনার ধাক্কা দেওয়া কমিটগুলি সরিয়ে ফেলবে

git reset --hard 'xxxxx'

git clean -f -d

git push -f

7
এই পদ্ধতিটি প্রতিশ্রুতি মোছার জন্য ইতিহাসের যথাযথভাবে পুনর্লিখন করে। দুর্দান্ত
জেসি রেজা খোরাসানী

2
এই উত্তর এল ম্যাগনিফেকো!
ট্রুথহোল্ডার

3
উত্তরটি ভালবাসুন, ধন্যবাদ :)
ডিজেনিস এইচ।

1
কেবল পরিষ্কার করার জন্য (আমি নিশ্চিত ছিলাম না): প্রতিশ্রুতিটি অপারেশন শেষে বর্তমান প্রতিশ্রুতি হবে। মুছে ফেলার শেষটি নয়।
মাইক 9৩৯

22
git revert HEAD -m 1

উপরের কোড লাইনে। "শেষ যুক্তি উপস্থাপন করে"

  • 1 - একজনকে প্রত্যাবর্তন করে।

  • 2 - শেষ দুটি কমিটে ফিরে আসে।

  • n - সর্বশেষ n প্রতিশ্রুতি ফেরত।

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


পরে ব্যবহার করার git commit -am "COMMIT_MESSAGE" পরে git pushঅথবাgit push -f


8
এটি সত্য নয় - -এম প্যারামিটারে ফিরে যাওয়ার জন্য পিতামাতার সংখ্যা নির্দিষ্ট করে (সাধারণত 1 যদি আপনি আগত "ফিরিয়ে নিতে চান তবে" তাদের ", পরিবর্তিত হয়, মার্জ-টু পরিবর্তনের জন্য 2 এর বিপরীতে," আমাদের "- 2 মার্জ করার জন্য করে)। উলটে প্রত্যাবর্তনের সংখ্যার সাথে এর কোনও যোগসূত্র নেই - আপনি যদি কোন প্রতিশ্রুতি রেঞ্জটি ফিরিয়ে দিতে চান তবে ব্যবহার করুনgit revert ref1..ref2
নাল রেফারেন্স

1
পছন্দসই প্রভাব ছিল না
স্যাম টুকে

2

2020 সরল উপায়:

git reset <commit_hash>

(আপনি রাখতে চান সর্বশেষ কমিটের হ্যাশ)।

আপনি এখন স্থানীয়ভাবে আপত্তিহীন পরিবর্তনগুলি রাখবেন।

আপনি যদি আবার চাপ দিতে চান তবে আপনাকে করতে হবে:

git push -f

0

এখানে আমার উপায়:

ধরা যাক শাখার নাম develop

# Create a new temp branch based on one history commit
git checkout <last_known_good_commit_hash>
git checkout -b develop-temp

# Delete the original develop branch and 
# create a new branch with the same name based on the develop-temp branch
git branch -D develop
git checkout -b develop

# Force update this new branch
git push -f origin develop

# Remove the temp branch
git branch -D develop-temp

0

আপনি যেমন কিছু করতে পারেন

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