আমি কীভাবে একটি নির্দিষ্ট কমিটের গিথুব সংগ্রহস্থলের রোলব্যাক করতে পারি?


431

আমার গিথুব এখনই এটিতে 100 টি কমিট করেছে। আমাকে 80 প্রতিশ্রুতিবদ্ধ করার জন্য সংগ্রহস্থলটি রোলব্যাক করতে হবে এবং পরবর্তী সমস্তগুলি মুছে ফেলতে হবে।

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

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

যাইহোক, গিটটি আমাকে প্রচুর দ্বন্দ্ব পরিচালনা করতে চায়। একটি সহজ উপায় আছে কি?

উত্তর:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

দ্রষ্টব্য: নীচে মন্তব্যগুলিতে যেমন লেখা আছে, এটি একটি সহযোগী পরিবেশে বিপজ্জনক: আপনি ইতিহাস আবার লিখছেন


43
মানুষ, না git push -f origin branch। আমার খুব খারাপ সময় হয়েছিল, কারণ আমি তা মিস করেছি।
সুমিত এম আসক

21
এর থেকে সাবধান! আপনি স্থানীয়ভাবে আপনার সমস্ত প্রতিশ্রুতি হারাবেন এবং আপনি যদি ধাক্কা দেন তবে আর কোনও উপায় থাকবে না
টমাস

8
এটি সত্য নয়, আপনি গিট রিফ্লোগ ব্যবহার করে পুরানো কমিটগুলি পেতে পারেন
জান স্কেফার

27
এটির git push origin HEAD --forceপরিবর্তে আপনার প্রয়োজন হতে পারে যা git push -f origin branchআমাকে error: src refspec branch does not match any.ত্রুটি দিচ্ছিল
স্প্রোকট 12

1
হ্যাঁ, আপনাকে ধন্যবাদ আমি যা চাই তা করতে পেরেছি। আমি যে প্রতিশ্রুতিটি রোলব্যাক করতে চেয়েছিলাম তার আগে আমি প্রথমে একটি পৃথক শাখা তৈরি করেছি। এটি স্থানীয়ভাবে ক্লোন করা হয়েছে। তারপরে সেই অনুলিপিটিতে আপনার প্রস্তাবগুলি প্রয়োগ করুন, আমি আমার মূল শাখায় আপস করিনি ...
গৌথির বোয়াগলিও

21

সাম্প্রতিক প্রতিশ্রুতি পূর্বাবস্থায় নেওয়ার জন্য আমি এটি করছি:

প্রথম:

git log

পূর্বাবস্থায় ফিরে আসার জন্য খুব সাম্প্রতিকতম SHA আইডি পান।

git revert SHA

এটি একটি নতুন প্রতিশ্রুতি তৈরি করবে যা আপনার প্রতিশ্রুতির একেবারে বিপরীত করে। তারপরে আপনি আপনার অ্যাপ্লিকেশনটিকে আগের অবস্থায় আনতে এই নতুন প্রতিশ্রুতিটি চাপতে পারেন এবং আপনার গিট ইতিহাস সেই অনুসারে এই পরিবর্তনগুলি দেখায়।

আপনার সবেমাত্র প্রতিশ্রুতিবদ্ধ এমন কিছু কাজ করার জন্য তাৎক্ষণিক পুনরায় করার জন্য এটি ভাল, যা আমি দেখতে পাই আমার ক্ষেত্রে প্রায়শই ঘটে।

মাইক যেমন উল্লেখ করেছেন, আপনি এটিও করতে পারেন:

git revert HEAD

8
git revert HEADহ্যাশটি সন্ধান না করেই শেষ প্রতিশ্রুতি ফিরিয়ে দেবে।
মাইক বারানজাক

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

19

অন্য উপায়:

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

তারপরে আপনার সংগ্রহস্থলের স্থানীয় ডিরেক্টরিতে নেভিগেট করুন এবং এই আদেশটি চালান:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

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


1
/Me@github.com/me/repo_name.git: অবগতির জন্য "REPOSITORY_NAME" HTTPS ভালো কিছু হতে হবে
টিম

3
আপনি যদি এই আদেশটিটি ভেঙে ব্যাখ্যা করেন এবং এটি ব্যাখ্যা করেন তবে এটি আরও সহায়ক হবে।
cst1992

3

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

কমিট # 80 থেকে একটি নতুন শাখা তৈরি করুন এবং সেই শাখায় এগিয়ে যাবেন। অন্যান্য 20 টি কমিট পুরানো এতিম শাখায় থাকবে।

আপনি যদি নিজের নতুন শাখার একই নাম রাখতে চান তবে মনে রাখবেন যে শাখাটি মূলত কেবলমাত্র লেবেল els কেবলমাত্র আপনার পুরানো শাখার অন্য কোনও নামকরণ করুন, তারপরে কমিট # 80 এ আপনার নতুন নামটি দিয়ে নতুন শাখা তৈরি করুন।


আমি অনুমান করছি যে এটি আগ্রহী শাখার ইতিহাসের প্রত্যেকের স্থানীয় সংস্করণগুলির সাথেও সমস্যাযুক্ত হয়ে যায়।
রেজারডেল

2

মাস্টারের কাছ থেকে শাখা আপডেটগুলি করার সময় আমি লক্ষ্য করি যে আমি কখনও কখনও ওভার-ক্লিক করি এবং শাখাটিও মাস্টারের সাথে মিশে যায় to এটিকে পূর্বাবস্থায় ফেলার একটি উপায় খুঁজে পেয়েছি।

যদি আপনার শেষ প্রতিশ্রুতিটি মার্জ হত তবে আরও কিছু ভালবাসার প্রয়োজন:

গিট রিভার্ট-মি 1 হেড


1

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

  1. ডিফল্ট শাখা নয়
  2. কোনও উদ্বোধনী পোলের অনুরোধ নেই।
  3. শাখাটি সুরক্ষিত নয়।

আগের কমিট পয়েন্টটি নির্দেশ করতে এখন এটি আপনার স্থানীয় সংগ্রহস্থলে পুনরায় তৈরি করুন। এবং এটি রিমোট রেপোতে যুক্ত করুন।

git checkout -b master 734c2b9b   # replace with your commit point

তারপরে স্থানীয় শাখাকে দূরবর্তী স্থানে চাপ দিন

git push -u origin master

ডিফল্ট শাখা এবং শাখা সুরক্ষা ইত্যাদি যোগ করুন etc.

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