কীভাবে দূরবর্তী শাখা থেকে স্থায়ীভাবে কয়েকটি কমিট সরিয়ে ফেলা যায়


489

আমি জানি ইতিহাসের পুনর্লিখন যা খারাপ ইয়াদ ইয়াদ।

তবে কীভাবে দূরবর্তী শাখা থেকে স্থায়ীভাবে কয়েকটি কমিট সরিয়ে ফেলবেন?


96
হ্যাঁ, এটি সত্যই খারাপ ইয়াদা ইয়াদা, তবে কোনও কারণে আমার এটি পছন্দ করা প্রয়োজন।
জেমস মরিস

44
আমি জানি এটি নির্বোধ, তবে কখনও কখনও বিষ্ঠা ঘটে - যেমন লগইন পরীক্ষা করা এবং আপনার কোডে সরল পাঠ্য পাসওয়ার্ড ব্যবহার করা, যা আসল লগইন শংসাপত্র। ওহো ...
২৩ শে

6
আসল লগইন শংসাপত্রসমূহ .. হ্যাঁ আমাকে কিছু হুপোসের স্মরণ করিয়ে দেয়
হ্যালো ইউনিভার্সের


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

উত্তর:


368

git reset --hardকার্যকারী গাছ এবং সূচি থেকে পরিবর্তনগুলি সরিয়ে আপনি আপনার স্থানীয় শাখা, এবং আপনি git push --forceরিমোটে আপনার সংশোধিত স্থানীয় শাখা। ( এখানে অন্যান্য সমাধান , দূরবর্তী শাখা মুছে ফেলার সাথে জড়িত এবং এটি আবার চাপ দেওয়া)

এই এই উত্তরটি এই জাতীয় কমান্ডের বিপদকে চিত্রিত করে, বিশেষত যদি লোকেরা তাদের নিজস্ব স্থানীয় রেপগুলির জন্য দূরবর্তী ইতিহাসের উপর নির্ভর করে। ম্যান পৃষ্ঠার পুনরুদ্ধার বিভাগ থেকে
লোকদের নির্দেশ করার জন্য আপনাকে প্রস্তুত থাকতে হবেgit rebase


গিট ২.২৩ (নয় বছর পরে আগস্ট 2019) দিয়ে আপনি নতুন কমান্ডটি ব্যবহার করবেন git switch
এটি: ( অপসারণের সংখ্যার দ্বারা প্রতিস্থাপন করুন )git switch -C mybranch origin/mybranch~n
n

এটি সূচি এবং কার্যকারী গাছকে একটি ইচ্ছার মতো পুনরুদ্ধার git reset --hardকরবে।


স্ট্রেঞ্জ। মনে হচ্ছে আমি ইতিমধ্যে এটি চেষ্টা করেছি। একসাথে কিছু রিবেসিংয়ের সাথে - কবজির মতো কাজ করে। ধন্যবাদ।
অরনিস ল্যাপসা 19

7
@ অরণিস: তারপরে নিখুঁত;) push --forceদূরে
ভোনসি

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

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

1
@ মোশফিউ ট্রু: git gcসবসময় দূরবর্তী দিক দিয়ে পর্যাপ্ত পরিমাণে চালানো হয় না। উদাহরণস্বরূপ গিটহাব: টুইটার.
com

248

last_working_commit_idঅ-কর্মক্ষম প্রতিশ্রুতি ফিরিয়ে দেওয়ার সময় , ব্যবহার করার জন্য কেবল দ্রষ্টব্য

git reset --hard <last_working_commit_id>

সুতরাং আমরা commit_idযা চাই না তা পুনরায় সেট করতে হবে না ।

তারপরে নিশ্চিত, আমাদের অবশ্যই প্রত্যন্ত শাখায় ধাক্কা দিতে হবে:

git push --force

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

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

3
আপনি গিট স্ট্যাশ দিয়ে স্থানীয় পরিবর্তনগুলি সংরক্ষণ করতে পারেন .... কিছু জিনিস তৈরি করুন .... এবং গিট স্ট্যাশ পপ (আপনার স্থানীয় পরিবর্তনগুলি ফিরে এসেছে)
MonTea

এটি আমাকে "রিমোট: ত্রুটি: নন-ফাস্ট-ফরোয়ার্ড রেফ / হেড / মাস্টারকে অস্বীকার করে (আপনার প্রথমে
টানতে হবে

@ অ্যারওয়েভেক্স এটিই git reset --hardকরার কথা রয়েছে।
লুক

146

গুরুত্বপূর্ণ: নিশ্চিত করুন যে আপনি "গিট পুশ-এফ" এর উপর কোন শাখা নির্দিষ্ট করেছেন বা আপনি অজান্তে অন্য শাখাগুলি সংশোধন করতে পারেন! [*]

এই টিউটোরিয়ালে তিনটি বিকল্প দেখানো হয়েছে । লিঙ্কটি ভাঙার ক্ষেত্রে আমি এখানে মূল পদক্ষেপগুলি ছেড়ে দেব।

  1. সম্পূর্ণ প্রতিশ্রুতি ফিরে
  2. শেষ প্রতিশ্রুতি মুছুন
  3. একটি তালিকা থেকে প্রতিশ্রুতি মুছুন

1 সম্পূর্ণ প্রতিশ্রুতি ফিরে

git revert dd61ab23

2 শেষ প্রতিশ্রুতি মুছুন

git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>

বা, যদি শাখাটি স্থানীয়ভাবে পাওয়া যায়

git reset HEAD^ --hard
git push <<remote>> -f

যেখানে + ডিডি 61 ... আপনার প্রতিশ্রুতিবদ্ধ হ্যাশ এবং গিট হ'ল এক্স-কে এক্স এর পিতামাতা এবং + জোরপূর্বক নন-ফাস্টফোরওয়ার্ড পুশ হিসাবে ব্যাখ্যা করবে।

3 একটি তালিকা থেকে প্রতিশ্রুতি মুছুন

git rebase -i dd61ab23^

এটি খোলার এবং সম্পাদককে সমস্ত কমিটের একটি তালিকা প্রদর্শন করবে। আপনি যাকে ছাড়তে চান সেটি মুছুন। রিবেস শেষ করুন এবং রেপোতে চাপ দিন।

git rebase --continue
git push <remote_repo> <remote_branch> -f

5
নিশ্চিত করুন যে আপনি "গিট পুশ <রেমোট_রেপো <<কমান্ড_ব্রঞ্চ> -f" এর উপর কোন শাখা নির্দিষ্ট করেছেন বা আপনি অজান্তেই অন্য শাখাগুলি সংশোধন করতে পারেন!
নাইজেল শেরিডান-স্মিথ

কেবলমাত্র 1 এবং 2 পদক্ষেপটি কাজটি করেছিল এবং মূল প্রশ্নের উত্তর দিয়েছে। (পদক্ষেপ 3 চালাবেন না)
সাদ বেনবউজিদ

এগুলি বিভিন্ন দৃশ্যের জন্য বিকল্পগুলি, কোনও পদক্ষেপ নেওয়ার নয়। আমার ক্ষেত্রে, ইন্টারেক্টিভ রিবেস (বিকল্প 3) আমি যা খুঁজছিলাম তা করেছিল।
স্টিভ ব্ল্যাকওয়েল

যদিও আমাকে ৩ য় ধাপ করতে হয়েছিল। আপনি এই @ সাড চালাবেন না কেন? ভাগ্যক্রমে আমার <<রেডিও>> কেবলমাত্র ডিফল্ট 'উত্স' এবং <ক্রেডিট_বাংলা> ডিফল্ট 'মাস্টার' ছিল
বার্ট

30

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

git reset --hard HEAD~3

তারপরে রিমোট শাখাকে তার ইতিহাস পুনরায় লেখার জন্য বাধ্য করতে নিম্নলিখিত কমান্ডটি (আপনার স্থানীয় মেশিনে) চালান:

git push --force

অভিনন্দন! সব শেষ!

কিছু নোট:

আপনি চালিয়ে কাঙ্ক্ষিত কমিট আইডি পুনরুদ্ধার করতে পারেন

git log

তারপর আপনি প্রতিস্থাপন করতে পারেন HEAD~Nসঙ্গে <desired-commit-id>ভালো:

git reset --hard <desired-commit-id>

আপনি যদি ফাইল সিস্টেমে পরিবর্তনগুলি রাখতে চান এবং কেবল সূচক (অঙ্গীকারের ইতিহাস) পরিবর্তন করতে চান তবে --softফ্ল্যাগের মতো ব্যবহার করুন git reset --soft HEAD~3। তারপরে আপনার সর্বশেষ পরিবর্তনগুলি যাচাই করার এবং সেগুলির সমস্ত বা কিছু অংশ রাখার বা বাদ দেওয়ার সুযোগ রয়েছে। পরবর্তী ক্ষেত্রে রাননিগ git statusফাইলগুলি পরিবর্তিত দেখায় <desired-commit-id>। আপনি যদি --hardবিকল্পটি ব্যবহার করেন তবে আপনাকে git statusবলবে যে আপনার স্থানীয় শাখাটি দূরবর্তী শাখার মতোই। আপনি ব্যবহার না করেন তাহলে --hardনা --soft, ডিফল্ট মোড ব্যবহার করা হয় যে --mixed। এই মোডে, git help resetবলেছেন:

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


10

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

এটি এখানে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে


9
খুব বেশি দেরি হয়নি। অনুরূপ সমস্যার সাথে ঘুরে
বেড়ানোগুলির

9

একইভাবে এই ব্লগ পোস্টের উপর ভিত্তি করে, প্যাকট্রোলের উত্তর থেকে সরলকরণ ।

# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote

2
ধন্যবাদ আমার জন্য কাজ করে এবং আমি দূরবর্তী শাখার ইতিহাস থেকে একটি প্রতিশ্রুতি (উদাহরণস্বরূপ পিডাব্লুডির অন্তর্ভুক্ত) মুছে ফেলতে চাই, এটি কীভাবে করবেন?
1:59

1
আমার জন্যও কাজ করে, তবে হাসির চেয়ে আমারও একই প্রশ্ন, আমি কারও কাছে ইতিহাসে আমার প্রতিশ্রুতিবদ্ধ / পুনর্বার দেখতে চাই না .. আমি কীভাবে এটি সরিয়ে দেব?
রবার্তো রদ্রিগেজ

4

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

আপনার স্থানীয় ভুল শাখা থেকে:

git log

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

git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch

আপনি যেভাবে চান তার এখন আপনার কাছে একটি নতুন শাখা রয়েছে।

আপনার নতুন শাখায় নেই এমন ভুল শাখা থেকেও যদি আপনার একটি নির্দিষ্ট প্রতিশ্রুতি রাখতে হয় তবে আপনি কেবল সেই নির্দিষ্ট প্রতিশ্রুতিটি চেরি-বাছাই করতে পারেন:

git checkout the_errant_branch
git log

আপনাকে একটি ভাল শাখায় টানতে এবং গিট লগ থেকে প্রস্থান করার জন্য একটি প্রতিশ্রুতিবদ্ধের কমিট হ্যাশ অনুলিপি করুন।

git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied

ফিরে নিজেকে প্যাট।


খুব সহজ এবং যদি আপনার একটি মরা-পায়ের শাখা থাকে তবে কে যত্নশীল? একটি নতুন শাখা তৈরি করুন এবং এটি দিয়ে সম্পন্ন করুন!
অ্যান্ড্রু ফক্স

এটি একটি সত্যিই চমৎকার উত্তর। আমি আনন্দিত যে চেরি-বাছাইয়ের আদেশের পরিবর্তে, বা দূরবর্তী শাখাটি পরিচালনা করার পরিবর্তে আমি এটি করেছি।
ম্যাগনাইলেক্স

0
 git reset --soft commit_id
 git stash save "message"
 git reset --hard commit_id
 git stash apply stash stash@{0}
 git push --force
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.