একটি 'গিট পুশ' পূর্বাবস্থায় ফেরা


591

আমার অনুমিত স্থিতিশীল শাখায় আমি যা করেছি তা এখানে ...

% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
  refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
  from cc4b63bebb6e6dd04407f8788938244b78c50285
  to   83c9191dea88d146400853af5eb7555f252001b0
    done
'refs/heads/unstable': up-to-date
Updating remote server info

পরে বুঝতে পেরেছিলাম যে এটি একটি ভুল ছিল। আমি এই সম্পূর্ণ প্রক্রিয়াটি পূর্বাবস্থায় ফিরিয়ে আনতে চাই এবং আলফা-০.০.০ শাখাটি যা ছিল তা ফিরিয়ে দিতে চাই।

আমার কি করা উচিৎ?


এই স্ট্যাকওভারফ্লো পোস্ট সম্ভবত? stackoverflow.com/questions/134882/undoing-a-git-rebase
স্টেইন

4
এটি আসলে একই পরিস্থিতি নয়, একটি রিবেসকে পূর্বাবস্থায় ফেলা একটি স্থানীয় সংগ্রহস্থল দৃশ্য, গিট পুশটি পূর্বাবস্থায় ফেলা দূরবর্তী সংগ্রহস্থল জড়িত এবং আপনার অ্যাক্সেসের উপর নির্ভর করে আরও জটিল হতে পারে।
সিবি বেইলি

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

দ্রুত ব্যাখ্যা - আমি অনুমান করছি যে আপনি যদি আংশিক হ্যাশ মান দ্বারা গিট কমিটের কথা উল্লেখ করেন, গিটটি ধরে নেবে আপনি যে প্রতিশ্রুতিটির কথা বলছেন তার হ্যাশটি সেই স্ট্রিং দিয়ে শুরু হয়?
গেরশম

উত্তর:


942

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

তারপরে আপনাকে পুরানো রেফারেন্সটি 'চাপ' দিতে হবে।

git push -f origin last_known_good_commit:branch_name

বা আপনার ক্ষেত্রে

git push -f origin cc4b63bebb6:alpha-0.3.0

আপনি receive.denyNonFastForwardsদূরবর্তী সংগ্রহস্থল সেট করতে পারেন । যদি এটি হয় তবে আপনি একটি ত্রুটি পাবেন যা বাক্যাংশটি অন্তর্ভুক্ত করে [remote rejected]

এই দৃশ্যে আপনাকে শাখাটি মুছে ফেলা এবং পুনরায় তৈরি করতে হবে।

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

যদি এটি কাজ না করে - সম্ভবত আপনি receive.denyDeletesসেট করে রেখেছেন, তবে আপনার অবশ্যই সংগ্রহস্থলটিতে সরাসরি প্রবেশ করতে হবে। দূরবর্তী সংগ্রহস্থলে, আপনাকে নিম্নলিখিত প্লাম্বিং কমান্ডের মতো কিছু করতে হবে something

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8

16
একটি নিখুঁত এবং সুস্পষ্টভাবে দেওয়া প্রতিক্রিয়া - আপনাকে অনেক ধন্যবাদ। অন্য যে কেউ এটিকে হোঁচট খায়, একাডেমিক কারণে আমি প্রথম 2 টি পদ্ধতির উভয়ই চেষ্টা করেছিলাম এবং উভয়েই কাজ করেছিল - স্পষ্টত যদি প্রথমটি কাজ করে তবে এটি সবচেয়ে পরিষ্কার পদ্ধতির। আমি যদি আপনাকে 10 বার চার্লস ঠাট্টা করি তবে আমি করব। :)
সাইরাস

139
দ্রুত-অবগতির জন্য, এখানে প্রথম লাইনgit push -f origin last_known_good_commit:branch_name
philfreo

5
গিট পুশ -f উত্স cc4b63bebb6: আলফা-0.3.0 => এইটি আমাকে সাহায্য করেছে, দ্রষ্টব্য আলফা-0.3.0 হ'ল শাখার নাম এবং cc4b63bebb6 হল সেই প্রতিশ্রুতি আইডি যা আমরা ফিরে যেতে চাই। সুতরাং, এই আদেশটি কার্যকর করার পরে আমরা cc4b63bebb6 কমিট আইডিতে থাকব।
কুমার

22
আপনি যদি ভাগ করা রেপোতে কাজ করছেন তবে এই সমাধানটি অত্যন্ত বিপজ্জনক। সর্বোত্তম অনুশীলন হিসাবে, ভাগ করা সমস্ত রিমোট রেপোতে করা কমিটগুলি 'অপরিবর্তনীয়' হিসাবে বিবেচনা করা উচিত। পরিবর্তে 'গিট রিভার্ট ' ব্যবহার করুন: kernel.org/pub/software/scm/git/docs/…
সবুশ

1
jww - অন্য যে কোনও কিছুর তুলনায় গিটটি সবচেয়ে বৈশিষ্ট্য সমৃদ্ধ এবং দক্ষ উত্স নিয়ন্ত্রণ সরঞ্জাম উপলব্ধ। প্রতিটি দলই এটি আলাদাভাবে ব্যবহার করে। একটি সপ্তাহান্তে একটি তাজা সংগ্রহস্থল নিয়ে খেলা এবং সমস্ত সাধারণ দৃশ্যের মধ্য দিয়ে কাটানো উপযুক্ত। একবার আপনি এটির সাথে কাজ করার জন্য কিছুটা সময় ব্যয় করলে বিকাশ অনেক কম চাপের হয় ful
ব্যবহারকারী 1491819

165

আমি বিশ্বাস করি যে আপনি এটিও করতে পারেন:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

এটি শেষ পদ্ধতির সাথে অনেকটা সাদৃশ্যপূর্ণ, বাদে আপনাকে দূরবর্তী রেপোতে হাঁসফাঁস করতে হবে না।


9
এটি আমার পক্ষেও কাজ করেছিল, তবে এটি লক্ষণীয় যে এটি রিমোটটিতে ইতিহাস "পুনর্লিখন" করবে। এটি আপনি যা চান তা হতে পারে, তবে তা নাও হতে পারে!
টম

3
এই উত্তরটির জন্য +1 যা সত্যিই আমাকে সাহায্য করেছে। আমি এটিও যুক্ত করতে চেয়েছিলাম (এবং বিষয়গুলি পরিষ্কার করে দিতে) যে কমিট আইডি (যা " --hard" প্যারামিটারের পরে আসে ) আপনি নিজের শাখাটি পুনরায় সেট করতে চান এমন প্রতিশ্রুতির আইডি হওয়া উচিত।
মাইকেল ডাউটারম্যান

1
ইতিহাসটি সুন্দরভাবে লিখেছেন ... যে কেউ এই পরিবর্তনগুলি টানতে পারত, আমি কেবল নিশ্চিত করেছিলাম যে তারা git reset --hard [commit_id]এমনটি করেছে যাতে আমরা স্পেস-টাইম ধারাবাহিকতায় গণ্ডগোল না করি।
এলিয়েন লাইফ ফর্ম

9
"গিট পুশ অরিজিন + আলফা-০.০.০" এর জন্য + কী?
jpierson

1
@jpierson +বাহিনী ধাক্কা জায়গা নিতে, একভাবে করতে -f(কিন্তু কিছুটা ভিন্ন: stackoverflow.com/a/25937833/1757149 )। তা ছাড়া, যদি তুমি চেষ্টা কর git push origin alpha-0.3.0ধাক্কা ব্যর্থ হবে: Updates were rejected because the tip of your current branch is behind
এ__

106

git revert এখানে প্রস্তাবিত কিছু পদ্ধতির চেয়ে কম বিপজ্জনক:

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
 4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>

35f6af6f77f116ef922e3d75bc80a4a466f92650 আপনার নিজের প্রতিশ্রুতি দিয়ে প্রতিস্থাপন করুন।


2
আমি কীভাবে 35f6af6f77f116ef922e3d75bc80a4a466f92650 আইডি নিয়ে আসব? এই উত্তরটি যদি আপনি তা ব্যাখ্যা করতে পারেন তবে আরও ভাল।
ভলমাইক

2
@ ভোলোমাইক (এবং ভবিষ্যতের গুগলিং ডেভস), এই প্রশ্নটি এটি পাওয়ার অনেকগুলি উপায় বর্ণনা করে: এসও
জাইমে

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

এটি আমার পক্ষে কাজ করছিল। তবে, সাবধান থাকুন যেহেতু রিভার্ট আপনার স্থানীয় ফাইলগুলির সমস্ত পরিবর্তনকে ফিরিয়ে দেবে।
ব্যবহারকারী 1941537

আমি এই পদ্ধতির একাধিক বার নির্বাচিত কিন্তু আমি Git রি-বেসের ফলে -i <ID-সামনে-শেষ ভাল কমিট> এখানে প্রস্তাব একটি ইন্টারেক্টিভ রি-বেসের ফলে এবং পরিষ্কার আপ ইতিহাস করতে, ব্যবহার stackoverflow.com/questions/5189560/...
আর্নেস্তো অ্যাললি

35

আপনি যদি কোনও শেয়ারকৃত রেপোতে কাজ করে থাকেন তবে গৃহীত সমাধানটি (চ্যারেলস বেইলি থেকে) অত্যন্ত বিপজ্জনক।

সর্বোত্তম অনুশীলন হিসাবে, ভাগ করা সমস্ত রিমোট রেপোতে করা কমিটগুলি 'অপরিবর্তনীয়' হিসাবে বিবেচনা করা উচিত। পরিবর্তে 'গিট রিভার্ট' ব্যবহার করুন: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistkes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things


হুবহু, আপনি যে নির্দেশগুলি লিখে দিচ্ছেন সেগুলি কী? আপনার কেবল পুরানো লিঙ্ক আছে বলে মনে হচ্ছে।
jww

32

আপনি যে পরিবর্তনগুলি চেয়েছিলেন তা হারিয়ে না ফেলে এটি করার একটি উপায়:

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

তারপরে আপনি যে ফাইলগুলি ধাক্কা দিয়েছিলেন তা বেছে নিতে পারেন


19

এটি করার আরেকটি উপায়:

  1. অন্য একটি শাখা তৈরি করুন
  2. "গিট চেকআউট" ব্যবহার করে সেই শাখায় পূর্ববর্তী প্রতিশ্রুতি পরীক্ষা করুন
  3. নতুন শাখা ঠেলা।
  4. পুরানো শাখা মুছুন এবং মুছুন টিপুন (ব্যবহার করুন) git push origin --delete <branch_name> )
  5. পুরানো শাখায় নতুন শাখার নতুন নামকরণ করুন
  6. আবার ধাক্কা।

2
এটি
ইতিবাচক

17
git push origin +7f6d03:master

এটি আপনার রেপো উল্লিখিত কমিট নম্বরটিতে ফিরিয়ে দেবে


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

2
মনে রাখবেন, এটি আপনার স্থানীয় ফাইলগুলি পুনরায় সেট করবে না।
কে-গান

11

একাধিক কমিট গিট রিসেটটি পূর্বাবস্থায় ফিরিয়ে আনুন - 0ad5a7a6 (কেবল কমিট SHA1 হ্যাশ সরবরাহ করুন)

শেষ প্রতিশ্রুতি বাতিল করুন

গিট রিসেট - হ্যাড হেড ~ 1 (শেষ প্রতিশ্রুতিতে পরিবর্তনগুলি মুছে ফেলা হবে) গিট রিসেট - সোফট হেড ~ 1 (শেষ প্রতিশ্রুতিতে পরিবর্তনগুলি নিঃশব্দ স্থানীয় পরিবর্তন হিসাবে উপলব্ধ হবে)


9

পরিস্থিতি 1 : আপনি যদি 8123b7e04b3 শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরিয়ে আনতে চান তবে নীচের আদেশটিটি (এটি আমার পক্ষে কাজ করেছে):

git push origin +8123b7e04b3^:<branch_name>

আউটপুট নীচের মত দেখাচ্ছে:

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

অতিরিক্ত তথ্য: পরিস্থিতি 2 : কিছু পরিস্থিতিতে আপনি পূর্ববর্তী কমান্ডের মাধ্যমে যা সবেমাত্র পূর্বাবস্থায় ফিরে এসেছিলেন (মূলত পূর্বাবস্থায় পূর্বাবস্থায় ফিরিয়ে আনুন) তা ফিরে পেতে চাইলে নীচের কমান্ডটি ব্যবহার করুন:

git reset --hard 8123b7e04b3

আউটপুট:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

এখানে আরও তথ্য: https://github.com/blog/2019-how-to-undo-almost-anything-with-git


পরিস্থিতি 1 এর গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ প্রশ্নটি মুছে ফেলতে কোন প্রতিশ্রুতি নির্দিষ্ট করে না। গৃহীত উত্তরটি কেবল শেষ প্রতিশ্রুতি মুছে দেয় । এই উত্তরটি কোনও প্রতিশ্রুতি মুছে দেয়।
ডোমিনিক সেরিসানো

0

বিদ্যমান উত্তরগুলি ভাল এবং সঠিক, তবে আপনাকে যদি পূর্বেই পূর্বাবস্থাপনের প্রয়োজন হয় pushতবে:

  1. আপনি স্থানীয়ভাবে কমিটগুলি রাখতে চান বা আপনি অনির্দিষ্ট পরিবর্তন রাখতে চান
  2. আপনি কতটা প্রতিশ্রুতি সরিয়েছেন তা আপনি জানেন না

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

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

-2

আপনি যদি শেষ প্রতিশ্রুতিটি উপেক্ষা করতে চান যে আপনি সবেমাত্র দূরবর্তী শাখায় ঠেলাঠেলি করেছেন: এটি প্রতিশ্রুতিটি সরবে না তবে কেবল গিট পয়েন্টারটিকে কমিটের আগে সরিয়ে দিয়ে হেড ^ বা হেড ^ 1 দ্বারা রেফার করা হবে

git push origin +HEAD^:branch

তবে আপনি যদি ইতিমধ্যে এই প্রতিশ্রুতিটি ঠেকিয়ে রেখেছেন এবং অন্যরা শাখাটি টানছে। এই ক্ষেত্রে, আপনার শাখার ইতিহাসের পুনর্লিখন অবাঞ্ছিত এবং আপনার পরিবর্তে এই প্রতিশ্রুতিটি ফিরিয়ে দেওয়া উচিত:

git revert <SHA-1>
git push origin branch

1
হ্যাঁ! গিথুবের সাথে কাজ করার সময় এটি একটি কবজির মতো কাজ করেছিল। ধন্যবাদ।
চুকাবেকা

প্রশ্ন "ধাক্কা" সম্পর্কে তখন এটি রিমোট শাখার জন্য উদ্বেগজনক। কোনও প্রতিশ্রুতি সম্পর্কে শিরোনামে স্থান নেওয়ার দরকার নেই যার অর্থ হ'ল শেষ প্রতিশ্রুতি উপেক্ষা করুন কেবল এটি করুন: গিট পুশ অরিজিন + হেড ^: আপনার_বাংলা
মেকব্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.