আমি জানি ইতিহাসের পুনর্লিখন যা খারাপ ইয়াদ ইয়াদ।
তবে কীভাবে দূরবর্তী শাখা থেকে স্থায়ীভাবে কয়েকটি কমিট সরিয়ে ফেলবেন?
আমি জানি ইতিহাসের পুনর্লিখন যা খারাপ ইয়াদ ইয়াদ।
তবে কীভাবে দূরবর্তী শাখা থেকে স্থায়ীভাবে কয়েকটি কমিট সরিয়ে ফেলবেন?
উত্তর:
git reset --hardকার্যকারী গাছ এবং সূচি থেকে পরিবর্তনগুলি সরিয়ে আপনি আপনার স্থানীয় শাখা, এবং আপনি git push --forceরিমোটে আপনার সংশোধিত স্থানীয় শাখা। ( এখানে অন্যান্য সমাধান , দূরবর্তী শাখা মুছে ফেলার সাথে জড়িত এবং এটি আবার চাপ দেওয়া)
এই এই উত্তরটি এই জাতীয় কমান্ডের বিপদকে চিত্রিত করে, বিশেষত যদি লোকেরা তাদের নিজস্ব স্থানীয় রেপগুলির জন্য দূরবর্তী ইতিহাসের উপর নির্ভর করে। ম্যান পৃষ্ঠার পুনরুদ্ধার বিভাগ থেকে
লোকদের নির্দেশ করার জন্য আপনাকে প্রস্তুত থাকতে হবেgit rebase
গিট ২.২৩ (নয় বছর পরে আগস্ট 2019) দিয়ে আপনি নতুন কমান্ডটি ব্যবহার করবেন git switch।
এটি:
( অপসারণের সংখ্যার দ্বারা প্রতিস্থাপন করুন )git switch -C mybranch origin/mybranch~nn
এটি সূচি এবং কার্যকারী গাছকে একটি ইচ্ছার মতো পুনরুদ্ধার git reset --hardকরবে।
push --forceদূরে
last_working_commit_idঅ-কর্মক্ষম প্রতিশ্রুতি ফিরিয়ে দেওয়ার সময় , ব্যবহার করার জন্য কেবল দ্রষ্টব্য
git reset --hard <last_working_commit_id>
সুতরাং আমরা commit_idযা চাই না তা পুনরায় সেট করতে হবে না ।
তারপরে নিশ্চিত, আমাদের অবশ্যই প্রত্যন্ত শাখায় ধাক্কা দিতে হবে:
git push --force
git reset --hardকরার কথা রয়েছে।
এই টিউটোরিয়ালে তিনটি বিকল্প দেখানো হয়েছে । লিঙ্কটি ভাঙার ক্ষেত্রে আমি এখানে মূল পদক্ষেপগুলি ছেড়ে দেব।
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
আপনি যদি সর্বশেষ 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বলেছেন:
সূচী পুনরায় সেট করে তবে কার্যনির্বাহী গাছ নয় (অর্থাত্ পরিবর্তিত ফাইলগুলি সংরক্ষিত থাকলেও প্রতিশ্রুতিবদ্ধ হিসাবে চিহ্নিত করা হয় না) এবং আপডেট করা হয়নি বলে প্রতিবেদন করে।
এটি খুব অল্প দেরীতে হতে পারে তবে যা আমাকে সাহায্য করেছিল তা হ'ল শীতল শোনানো 'পারমাণবিক' বিকল্প। মূলত কমান্ডটি ব্যবহার করে filter-branchআপনি ফাইলগুলি সরিয়ে ফেলতে পারেন বা আপনার পুরো গিট ইতিহাস জুড়ে বিপুল সংখ্যক ফাইলের উপর কিছু পরিবর্তন করতে পারেন।
এটি এখানে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে ।
একইভাবে এই ব্লগ পোস্টের উপর ভিত্তি করে, প্যাকট্রোলের উত্তর থেকে সরলকরণ ।
# 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
কখনও কখনও এই সমস্যাটি সমাধানের সবচেয়ে সহজ উপায় হ'ল কোডটি ভাল জানেন সেই জায়গা থেকে নতুন শাখা তৈরি করা। তারপরে আপনার যদি অন্য কমেটগুলি পরে চেরি-বাছাই করতে হয় তবে আপনি ভুল শাখার ইতিহাসকে একা রেখে যেতে পারেন। এটি নিশ্চিত করে যে আপনি কোনও প্রতিশ্রুতিবদ্ধ ইতিহাস হারিয়েছেন নি।
আপনার স্থানীয় ভুল শাখা থেকে:
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
ফিরে নিজেকে প্যাট।