স্থানীয় এবং দূরবর্তী গিট সংগ্রহস্থলটিকে 1 টি কমিট করে ফিরিয়ে আনা হচ্ছে


187

আমি এই বিষয়ে অনুরূপ পোস্টগুলি পড়েছি এবং কীভাবে এটি সঠিকভাবে করতে হয় তা আমার জীবনের পক্ষে খুঁজে পাওয়া যায় না।

আমি চাই না এমন প্রায় 1000 টি ফাইল যাচাই করেছিলাম এবং 1b1 এর মধ্যে দিয়ে আমার সবগুলি রেপো থেকে সরিয়ে নেওয়ার দরকার নেই।

  • আমার একটি রিমোট masterশাখা আছে।
  • আমার স্থানীয় masterশাখা আছে।

তারা উভয়ই একই সংশোধনীতে।

আমি আমার রিমোটটি 1 টি কমিট করে রোলব্যাক করতে চাই।

আমার ইতিহাস বলুন masterহয় A--B--C--D--E
আমি আমার স্থানীয় করার রোলব্যাক করতে চান D
তারপরে এটিকে রিমোটে চাপুন যাতে আমার বর্তমান হ্যাশ দূরবর্তী এবং স্থানীয় উভয়ই ডি হয়ে যায়।

আমার এটি করতে সমস্যা হচ্ছে।
আমি গিট টাওয়ার ব্যবহার করছি তবে কমান্ড লাইনে আরামদায়ক। কোন সাহায্য?

আপডেট: নীচে দুর্দান্ত মন্তব্য। রিসেট ব্যবহার করা আংশিকভাবে নিরুৎসাহিত বলে মনে হচ্ছে বিশেষত যদি ভাণ্ডারগুলি অন্য ব্যবহারকারীর সাথে ভাগ করা থাকে। হার্ড রিসেটটি ব্যবহার না করে পূর্বের প্রতিশ্রুতিবদ্ধতার পরিবর্তনগুলি পূর্বাবস্থার সেরা উপায় কী ? কোন উপায় আছে?


আমি "হার্ড রিসেটটি ব্যবহার না করে পূর্বের প্রতিশ্রুতিগুলির পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে" আমার উত্তর আপডেট করেছি।
ভোনসি

3
git revertহার্ড রিসেট ছাড়াই এবং ব্যবহারকারীদের বিরক্ত না করে করার জন্য ব্যবহার করুন ।
user562374


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

উত্তর:


306

যদি কেউ এখনও আপনার রিমোট রেপো টানেনি, আপনি নিজের শাখা হেড পরিবর্তন করতে এবং জোর করে এটিকে রিমোট রেপোকে বলতে বাধ্য করতে পারেন:

git reset --hard HEAD^ 
git push -f 

(বা, যদি আপনার কাছে প্রত্যন্ত রেপোতে সরাসরি অ্যাক্সেস থাকে তবে আপনি তার হেড রেফারেন্সটি একটি খালি রেপো সত্ত্বেও পরিবর্তন করতে পারবেন )

নোট, যেমন দ্বারা মন্তব্য পরক-প্রযুক্তির মধ্যে নীচের মন্তব্য , উইন্ডোস (সিএমডি সময়), আপনি প্রয়োজন হবে ^^:

git reset --hard HEAD^^
git push -f 

২০১১ সাল থেকে আপডেট:
ব্যবহার git push --force-with-lease( যেটি আমি এখানে উপস্থাপন করছি , 2013 সালে গিট 1.8.5 এর সাথে প্রবর্তিত) নিরাপদ।

দেখুন Schwern এর উত্তর চিত্রণ জন্য।


কেউ যদি ইতিমধ্যে রেপো টানতে থাকে? আমি তখন কি করতাম?

তারপরে আমি এমন কিছু প্রস্তাব দেব যা ইতিহাসের পুনর্লিখন না করে:

  • git revert স্থানীয়ভাবে আপনার শেষ প্রতিশ্রুতি (একটি নতুন প্রতিশ্রুতি তৈরি করা যা পূর্ববর্তী প্রতিশ্রুতিগুলি উল্টে দেয়)
  • উত্পাদিত 'রিভার্ট' টিপুন git revert

1
কেউ যদি ইতিমধ্যে রেপো টানতে থাকে? আমি তখন কি করতাম?
জামিস চার্লস

1
@gW একটি শাখা তৈরি করে? না এটি কোনও শাখার প্রধানকে সরায়, তবে আপনি এখনও একই শাখায় রয়েছেন। তবে, যেহেতু ধাক্কা এখন আর দ্রুত এগিয়ে নেই, হ্যাঁ, আপনাকে এই ধাক্কাটি জোর করা দরকার।
ভনসি

1
কেউ কি রেপুর টানছে তা জানার উপায় আছে?
পিঙ্কারটন

4
উইন্ডোজে, কমান্ডটি তৈরি করে লাইন ধারাবাহিকতা এবং একটি চরিত্রের হাত থেকে বাঁচতে ^ চরিত্রটি ব্যবহৃত হয়: গিট রিসেট --হ্যাড হেড ^^
এলিয়েন প্রযুক্তি

1
উইন্ডোজ 10-এ অ্যালেনটেকনোলজি পাওয়ারশেল ব্যবহার করে আমাকে কেবল শেষ প্রতিশ্রুতিটি পুনরায় সেট reset --hard HEAD^করতে reset --hard HEAD^^হবে না এবং টাইপ করতে হয়েছিল।
গ্যাসপ্যাকিও

56

স্থানীয় শাখায় একটি পুনর্বিবেচনা ফিরে সেট করুন (এর HEAD^অর্থ একটি পুনর্বিবেচনা ফিরে):

git reset --hard HEAD^

উত্স পরিবর্তনগুলি পুশ করুন:

git push --force

আপনাকে চাপ দিতে বাধ্য হবে কারণ অন্যথায় গিট বুঝতে পারে যে আপনি originএক প্রতিশ্রুতিবদ্ধ হয়ে পিছনে রয়েছেন এবং কিছুই পরিবর্তন হবে না।

এটির সাহায্যে --forceগিটকে HEADকোনও অগ্রগতির সম্মান না করে দূরবর্তী রেপোতে ওভাররাইট করতে বলা হয়।


1
আমি এটিকে রিভার্ট না বলার পরামর্শ দেব, যেহেতু এটি একটি নির্দিষ্ট শব্দ যা গিটের খুব আলাদা অর্থ সহ।
ক্যাসাবেল

@ জেফ্রমি: ইঙ্গিতটির জন্য ধন্যবাদ সম্পাদনা করা হয়েছে।
পূর্বাভাস

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

সতর্ক হোন! আপনার অনির্ধারিত পরিবর্তনগুলি বা আপনার হারিয়ে
যাওয়াগুলিকে স্তব্ধ

চমৎকার. সুতরাং, এর অর্থ কি এই যে আমরা যখন করি git push origin master, গিট রিমোটে একটি নতুন প্রতিশ্রুতি তৈরি করতে সক্ষম হয় কারণ স্থানীয় শাখাটি কমপক্ষে একবার প্রতিশ্রুতি দিয়ে এগিয়ে যায়? তদুপরি, দূরবর্তী রেপোতে যে প্রধানটি ইঙ্গিত করেছেন তার থেকে দ্বিতীয়টি অবশ্যই আলাদা হওয়া উচিত?
ম্যাডফিসিসিস্ট

18

আপনি যদি সর্বশেষ প্রতিশ্রুতি ফিরিয়ে দিতে চান তবে শুনুন:

ধাপ 1:

বার্তা সহ আপনার স্থানীয় কমিটগুলি পরীক্ষা করুন

$ git log

ধাপ ২:

স্থানীয় শাখা (বা মাস্টার) থেকে পরিবর্তনগুলি পুনরায় সেট না করে শেষ প্রতিশ্রুতি সরিয়ে ফেলুন

$ git reset HEAD^

অথবা আপনি যদি সর্বশেষ প্রতিশ্রুতিবদ্ধ ফাইলগুলি এবং আপডেটগুলি না চান তা না চান

$ git reset HEAD^ --hard

ধাপ 3:

আমরা ফাইল এবং কোডগুলি আপডেট করতে পারি এবং আবারও জোর দিয়ে চাপানো দরকার এটি পূর্ববর্তী প্রতিশ্রুতি মুছে ফেলবে। এটি নতুন প্রতিশ্রুতি রক্ষা করবে।

$ git push origin branch -f

এটাই!


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

7

বেলো কমান্ড প্রবেশ করে আপনি আপনার গিট কমিটের ইতিহাস দেখতে পাবেন -

$ Git লগ

আসুন আমরা সেই নির্দিষ্ট শাখায় আপনার ইতিহাস যেমন - কমিট_এ, কমিট_বি, কমিট_সি, কমিট_ডি এর মতো। যেখানে, কমিট_ডি হ'ল শেষ প্রতিশ্রুতি এবং এখানেই হেড রয়ে। এখন, স্থানীয় এবং দূরবর্তী থেকে আপনার শেষ প্রতিশ্রুতি অপসারণ করতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:

পদক্ষেপ 1: স্থানীয়ভাবে স্থানীয় প্রতিশ্রুতিগুলি সরান -

$ Git --hard মস্তক রিসেট ~

এটি আপনার কমিট হেডকে কমিট_সিতে পরিবর্তন করবে will

পদক্ষেপ 2: নতুন হেড কমিটের জন্য রিমোটে পরিবর্তন আনুন

$ Git ধাক্কা উৎপত্তি + + মস্তক

এই আদেশটি দূরবর্তী থেকে শেষ প্রতিশ্রুতি মুছে ফেলবে।

PS এই কমান্ডটি ম্যাক ওএসএক্সে পরীক্ষা করা হয়েছে এবং অন্যান্য অপারেটিং সিস্টেমেও কাজ করা উচিত (যদিও অন্য ওএস সম্পর্কে দাবি করা হচ্ছে না)



2

এখানে প্রক্রিয়াটির একটি আপডেট সংস্করণ যা নিরাপদ।

git reset --hard HEAD^ 
git push --force-with-lease

git push -fনির্বিচারে আপনার নিজস্ব পরিবর্তনগুলির সাথে দূরবর্তী সংগ্রহস্থলটি প্রতিস্থাপন করবে। অন্য কেউ পরিবর্তনগুলি ঠেলে দিলে তারা হারিয়ে যাবে। git push --force-with-leaseআপনার রিবেসটি কেবল তখনই ধাক্কা দেবে যদি ভাণ্ডারটি আপনার প্রত্যাশা অনুযায়ী থাকে। অন্য কেউ যদি ইতিমধ্যে আপনার ধাক্কা দেয় তবে ব্যর্থ হবে।

দেখুন -force ক্ষতিকর বিবেচিত; গিটের কর্মী-সাথে-ইজারা বোঝা

আমি এই হিসাবে aliasing প্রস্তাব repush = push --force-with-lease

কেউ যদি ইতিমধ্যে রেপো টানতে থাকে? আমি তখন কি করতাম?

তাদের বলুন git pull --rebase=merges। পরিবর্তে একটি git fetch originএবং git merge origin/masterএটি হবে git fetch originএবং git rebase -r origin/master। এটি তাদের স্থানীয় পরিবর্তনগুলি masterনতুন র্যাজেডের শীর্ষে পুনর্লিখন করবে origin/master-rতারা যে কোনও মার্জ করে থাকতে পারে তা সংরক্ষণ করবে।

আমি এটি টানার জন্য ডিফল্ট আচরণ করার পরামর্শ দিচ্ছি। এটি নিরাপদ, অন্যের রিবেসিং পরিচালনা করবে এবং ফলস্বরূপ কম অপ্রয়োজনীয় মার্জ হবে।

[pull]
        rebase = merges

1
সম্মত, এবং upvated। আমার প্রতিরক্ষার জন্য, আমার পুরানো ২০১১ উত্তরটি বিকল্পের প্রবর্তনের দু'বছর আগে লেখা হয়েছিল --force-with-lease
ভোনসি

আমি ইতিমধ্যে (গতকাল) যা করেছে: stackoverflow.com/posts/4647362/revisions
VonC


0

আপনার যদি প্রত্যন্ত রেপোতে সরাসরি অ্যাক্সেস থাকে তবে আপনি সর্বদা ব্যবহার করতে পারেন:

git reset --soft HEAD^

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

আমি কীভাবে গিট বেয়ার স্টোরের মধ্যে শেষ প্রতিশ্রুতিটি বাতিল করতে পারি?


0

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

git reset --hard HEAD^ 
git push -f 

তবে উপরের আমার উত্তর থেকে "নীচের" কীভাবে আলাদা ?
ভোনসি

0

মাথাটি পুনরায় সেট করার এবং পূর্ববর্তী প্রতিশ্রুতিতে রিভার্ট করার উপায়টি

$ git reset HEAD^ --hard
$ git push <branchname> -f

তবে কখনও কখনও এটি দূরবর্তী শাখায় গ্রহণযোগ্য নাও হতে পারে:

To ssh:<git repo>
 ! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'ssh:<git repo>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

তারপরে অন্য উপায়টি হ'ল

git revert HEAD
git push <remote branch>

এটি কাজ করে।

দ্রষ্টব্য: মনে রাখবেন যদি git push -f <force>ব্যর্থ হয় এবং তারপরে আপনি ফিরে যাওয়ার চেষ্টা করেন। এর git pullআগে করুন, যাতে দূরবর্তী এবং স্থানীয় সিঙ্কে থাকে এবং তারপরে চেষ্টা করে git revert। দূরবর্তী এবং স্থানীয় একই SHA1 এর সাথে প্রতিশ্রুতি দেওয়ার একই স্থানে রয়েছে তা নিশ্চিত করতে
চেক করুন git log..

git revert 
A --> B --> C -->D
A--> B --> C --> D --> ^D(taking out the changes and committing reverted diffs)

0

স্থানীয় মাস্টার উপর

git reflog
-- this will list all last commit
  e.g Head@{0} -- wrong push
      Head@{1} -- correct push  
git checkout Head@{1} .
  -- this will reset your last modified files

git status 
git commit -m "reverted to last best"
git push origin/master

অন্যরা টানছে কি না তা চিন্তা করার দরকার নেই।

সম্পন্ন!


0

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

git push origin +origin/master~:master

এটি নিম্নলিখিত বাক্য গঠন ব্যবহার করে:

git push <remote> <refspec>

এখানে, <remote>হয় origin, এবং <refspec>নিম্নলিখিত গঠন রয়েছে:

+origin/master~:master

বিস্তারিত পাওয়া যাবে git-push(1)। পূর্ববর্তী +মানে, এবং "থেকে অন্যান্য অংশ মানে হলো" বল এই সুত্র ধাক্কা " origin/master~থেকে master(রিমোটের একবারে origin)"। এটি জানা শেষ নয় যে origin/master~এটি আগে শেষ প্রতিশ্রুতিবদ্ধ origin/master, তাই না?



0

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

git reset --hard <commit-hash>
git push -f origin master

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

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