উত্তর:
প্রথমত, আপনি যদি একই কোড ভান্ডারে অন্যান্য লোকের সাথে কাজ করছেন, আপনার কোনও প্রতিশ্রুতি মুছে ফেলা উচিত নয় যেহেতু আপনি যখন ভাণ্ডারটিতে আপডেটটি চাপিয়ে দেবেন তখন এটি আপনার সহকর্মীদের স্থানীয় ভান্ডারগুলিকে একটি অবৈধ অবস্থায় ফেলে রাখবে (যেমন তারা যদি আপনি মুছে ফেলার পরে কমিট করেছেন, সেই কমিটগুলি অবৈধ হবে যেহেতু সেগুলি এখন অস্তিত্বহীন প্রতিশ্রুতি ভিত্তিক ছিল)।
বলেছিলেন, আপনি যা করতে পারেন তা কমিটকে ফিরিয়ে দেওয়া । আপনি যে সিভিএস ব্যবহার করছেন তার উপর নির্ভর করে এই পদ্ধতিটি আলাদাভাবে (বিভিন্ন কমান্ড) করা হয়:
গিট উপর :
git revert <commit>
উপর তত্পর :
hg backout <REV>
সম্পাদনা: রিভার্ট অপারেশন একটি নতুন প্রতিশ্রুতি তৈরি করে যা প্রত্যাবর্তিত প্রতিশ্রুতির চেয়ে বিপরীত হয় (উদাহরণস্বরূপ যদি মূল প্রতিশ্রুতি একটি লাইন যুক্ত করে, তবে রিভার্ট কমিট সেই লাইনটি মুছে দেয়), কার্যকরভাবে সংগ্রহস্থলের ইতিহাস পুনর্লিখন না করে অনাকাঙ্ক্ষিত কমিটের পরিবর্তনগুলি সরিয়ে দেয়।
git backout <REV>
? বা: hg backout <REV>
?
যদি আপনি অন্যের সাথে কাজ না করে থাকেন (বা তাদের উল্লেখযোগ্য বিরক্তির কারণ হিসাবে খুশি হন) , তবে বিটবাকেট শাখা থেকে কমিটগুলি সরিয়ে ফেলা সম্ভব।
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
গিটে সাধারণত, মাস্টার শাখাটি বিশেষ নয় - এটি কেবল একটি সম্মেলন। যাইহোক, বিটবাকেট এবং গিথুব এবং অনুরূপ সাইটগুলিতে সাধারণত সেখানে একটি প্রধান শাখা হওয়ার প্রয়োজন হয় (সম্ভবত কোনও ইভেন্টের পরিচালনা করার জন্য আরও কোড লেখার চেয়ে সহজ যে - কোনও নিশ্চিত নেই)। সুতরাং আপনাকে একটি নতুন শাখা তৈরি করতে হবে এবং এটি প্রধান শাখা তৈরি করতে হবে:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
বিটবকেটে, সংগ্রহস্থল সেটিংসে যান এবং "মেইন ব্রাঞ্চ" master_temp
পরিবর্তন করুন (গিথুবে, "ডিফল্ট শাখা" পরিবর্তন করুন)।
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
এখন বিটবকেটে যান এবং আপনি যে ইতিহাস চান তা দেখতে হবে। আপনি এখন সেটিংস পৃষ্ঠায় যেতে পারেন এবং প্রধান শাখাটি এতে পরিবর্তন করতে পারেন master
।
এই প্রক্রিয়াটি অন্য যে কোনও ইতিহাসের পরিবর্তনের সাথেও কাজ করবে (উদাঃ git filter-branch
)। পুরানো থেকে নতুন ইতিহাস বিচ্ছিন্ন হওয়ার আগে আপনাকে যথাযথ কমিটে পুনরায় সেট করতে হবে তা নিশ্চিত করতে হবে।
সম্পাদনা : আপাতদৃষ্টিতে আপনাকে গিথুবে এই সমস্ত ঝামেলাতে যাওয়ার দরকার নেই, কারণ আপনি রিসেট শাখাকে জোর করে চাপতে পারেন ।
পরের বার কেউ আপনার সংগ্রহশালা থেকে টানতে চেষ্টা করবে, (যদি তারা ইতিমধ্যে খারাপ প্রতিশ্রুতিটি টানতে থাকে), টানটি ব্যর্থ হবে। পরিবর্তিত ইতিহাসের আগে তাদের ম্যানুয়ালি একটি প্রতিশ্রুতিতে পুনরায় সেট করতে হবে এবং তারপরে আবার টানতে হবে।
git reset HEAD^
git pull
যদি তারা খারাপ প্রতিশ্রুতি টেনে নিয়ে আসে এবং এর উপরে প্রতিশ্রুতিবদ্ধ হয় তবে তাদের পুনরায় সেট করতে হবে এবং তারপরে git cherry-pick
তারা যে ভাল প্রতিশ্রুতি তৈরি করতে চায় তা কার্যকরভাবে খারাপ প্রতিশ্রুতি ছাড়াই পুরো শাখাটি পুনরায় তৈরি করতে পারে।
যদি তারা কখনই খারাপ প্রতিশ্রুতি টান না, তবে এই পুরো প্রক্রিয়াটি তাদের প্রভাবিত করবে না এবং তারা স্বাভাবিক হিসাবে টানতে পারে।
আপনি পুনরায় সেট করতে পারেন HEAD^
তারপরে চাপ দিন push
git reset HEAD^
git push -u origin master --force
এটি আপনার শেষ প্রতিশ্রুতি মুছে ফেলবে এবং কমিট মোছা হিসাবে বিটবাকেটে প্রতিফলিত হবে তবে এখনও তাদের সার্ভারে থাকবে।
অতীতে গিট রিভার্ট করতে আমার সমস্যা হয়েছিল (মূলত কারণ এটি কীভাবে কাজ করে তা আমি পুরোপুরি নিশ্চিত নই।) একীভূত সমস্যাগুলির কারণে আমার আবার ফিরে আসতে সমস্যা হয়েছিল ..
আমার সহজ সমাধান এটি।
ধাপ 1.
git clone <your repos URL> .
অন্য প্রকল্পে আপনার প্রকল্প, তারপরে:
ধাপ ২.
git reset --hard <the commit you wanna go to>
তারপর পদক্ষেপ 3।
আপনার সর্বশেষ (এবং মূল) প্রজেক্টের দির (সমস্যাটি যেটি শেষ সমস্যাটি রয়েছে) পদক্ষেপ 2 এর ফাইলগুলি পেস্ট করুন
পদক্ষেপ 4।
git commit -m "Fixing the previous messy commit"
পদক্ষেপ 5।
উপভোগ করুন
git revert
সহজ: এটি একটি নতুন প্রতিশ্রুতি তৈরি করে যা পূর্ববর্তী প্রতিশ্রুতি (বা একাধিক কমিট) এর পরিবর্তনের বিপরীত করে। এটি কমিটগুলি মুছে দেয় না, সুতরাং এটি এই প্রশ্নের জন্য প্রাসঙ্গিক নয়। এছাড়াও, এখানে ক্লোনিং পদক্ষেপটি সত্যই প্রয়োজনীয় নয়।
এখানে 4 টি ধাপ পর্যন্ত একটি সহজ পদ্ধতির:
0 - আপনি যে দলটিকে সংগ্রহস্থলটি ঠিক করতে চলেছেন তাকে পরামর্শ দিন
দলের সাথে সংযুক্ত হন এবং আসন্ন পরিবর্তনগুলি তাদের জানান।
1 - শেষ প্রতিশ্রুতি মুছে ফেলুন
আপনার লক্ষ্য শাখাটি ধরে নেওয়া master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
এই মুহুর্তে আপনি কাজ করছেন যদি আপনি একা কাজ করছেন।
2 - আপনার সতীর্থের স্থানীয় ভান্ডারগুলি ঠিক করুন
আপনার সতীর্থের উপর:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
যদি আপনার সতীর্থের কোনও নতুন কমিট না থাকে তবে আপনি এই মুহুর্তে সম্পন্ন হয়ে গেছেন এবং আপনার সিঙ্কে থাকা উচিত।
3 - হারিয়ে যাওয়া কমিটগুলি ফিরিয়ে আনা
আসুন আমরা বলি যে কোনও সতীর্থের একটি নতুন এবং অপ্রকাশিত প্রতিশ্রুতি ছিল যা এই প্রক্রিয়াটিতে হারিয়েছিল।
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
প্রয়োজনীয় হিসাবে অনেক কমিটের জন্য এটি করুন।
আমি এই পদ্ধতিটি বহুবার সাফল্যের সাথে ব্যবহার করেছি। সবকিছু সিঙ্ক্রোনাইজ করা হয়েছে তা নিশ্চিত করার জন্য এটির একটি দলের প্রচেষ্টা প্রয়োজন।
অন্যরা যেমন বলেছে, সাধারণত আপনি ব্যবহার করতে চান hg backout
বা git revert
। তবে, কখনও কখনও আপনি কোনও প্রতিশ্রুতি থেকে মুক্তি পেতে চান rid
প্রথমত, আপনি আপনার সংগ্রহস্থলের সেটিংসে যেতে চাইবেন। Strip commits
লিঙ্কে ক্লিক করুন ।
আপনি যে পরিবর্তনটি ধ্বংস করতে চান তার জন্য চেঞ্জসেট আইডি প্রবেশ করুন এবং ক্লিক করুন Preview strip
। এটি আপনাকে দেখতে দেবে যে আপনি এটি করার আগে আপনি কী ধরণের ক্ষতি করতে চলেছেন। তারপরে কেবল ক্লিক করুন Confirm
এবং আপনার প্রতিশ্রুতিবদ্ধতা আর ইতিহাস নয়। নিশ্চিত হয়ে নিন যে আপনি কী করেছেন তা আপনার সমস্ত সহযোগীদের জানিয়ে দিয়েছেন, যাতে তারা ঘটনাক্রমে আক্রমণাত্মক প্রতিশ্রুতি ফিরিয়ে দেয় না।
পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হওয়ার পরে এটি মুছতে সক্ষম হবে না। কারণ প্রতিশ্রুতিবদ্ধ মৌলিক প্রকৃতি মুছে ফেলা হয় না।
আপনি যে কাজটি করতে পারবেন (সহজ এবং নিরাপদ পদ্ধতি),
ইন্টারেক্টিভ রিবেস:
1) git rebase -i HEAD~2
# আপনার সাম্প্রতিক 2 টি কমিট প্রদর্শন করবে
2) আপনার প্রতিশ্রুতিবদ্ধতার মতো তালিকা তৈরি হবে, সাম্প্রতিক পৃষ্ঠার নীচে LILO প্রদর্শিত হবে (সর্বশেষে শেষ)
সম্পূর্ণ কমিট সারিটি পুরোপুরি মুছুন
3) দ্বারা ctrl+X
বা এটি সংরক্ষণ করুনESC:wq
এখন আপনার শাখাটি আপনার শেষ প্রতিশ্রুতি ব্যতীত আপডেট হবে ..
ডাস্টিনের দ্বারা উল্লিখিত বিটবকেটের জন্যও আপনি কমান্ডটি লিখতে পারেন :
git push -f origin HEAD^:master
দ্রষ্টব্য: মাস্টার পরিবর্তে আপনি যে কোনও শাখা ব্যবহার করতে পারেন। এবং এটি মুছে ফেলা বিটবুকিটের উপর চাপ দিন।
স্থানীয়ভাবে গিট ব্যবহারে কমিটগুলি অপসারণ করতে:
git reset --hard HEAD~1
এখন অবধি, ক্লাউড বিটবাকেট (কোন সংস্করণটি আমি নিশ্চিত নই) নীচে ফাইল সিস্টেম থেকে একটি প্রতিশ্রুতি ফিরিয়ে আনতে দেয় (ক্রোম ব্রাউজারে বিটবকেট ইন্টারফেস থেকে কীভাবে ফিরে যেতে হবে তা আমি দেখতে পাই না)।
আপনি অজান্তে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি সুরক্ষিত করতে আপনার সম্পূর্ণ ডিরেক্টরিটি ব্যাকআপ করুন
চেক আউট ডিরেক্টরি নির্বাচন করুন
ডান মাউস বোতাম: কচ্ছপ গিট মেনু
-রেপো-ব্রাউজার (মেনু অপশন 'রিভার্ট' কেবলমাত্র অনাকাঙ্ক্ষিত পরিবর্তনগুলি পূর্বাবস্থায় ফেলেছে)
হেড বোতাম টিপুন
- উপরের লাইনটি নির্বাচন করুন (শেষ প্রতিশ্রুতি)
ডানদিকের মাউস বোতাম: এই প্রতিশ্রুতি দ্বারা পরিবর্তনটি ফিরিয়ে দিন
- এরপরে এটি ফাইল সিস্টেমে পরিবর্তনগুলি অস্বীকার করে প্রতিশ্রুতিবদ্ধ চাপুন
এই বার্তাটি 'রিভার্ট (আপনার পূর্ববর্তী বার্তা) সহ জিআইটি আপডেট করে with এটি প্রতিশ্রুতি ফিরে আসে
- 'কমিট এবং ধাক্কা' নির্বাচন করুন।