আমি কীভাবে চাপযুক্ত গিট কমিটগুলি মুছব?


946

আমি দুর্ঘটনাক্রমে ভুল শাখায় প্রতিশ্রুতিবদ্ধ। আমি কীভাবে সেই প্রতিশ্রুতি মুছে ফেলব?

উত্তর:


1806

আপনি যে কাজটি করেছেন তা রেখে সাম্প্রতিক প্রতিশ্রুতি মুছুন:

git reset --soft HEAD~1

আপনি যে কাজটি করেছেন তা ধ্বংস করে অতি সাম্প্রতিক প্রতিশ্রুতি মুছুন :

git reset --hard HEAD~1

13
নিশ্চিত করুন যে হেড শাখাটির দিকে ইঙ্গিত করছে .. (প্রথমে এটি দেখুন)
ফ্রাঙ্ক শুইটারম্যান

128
এবং নিশ্চিত করুন যে হেড ~ 1 হল প্রতিশ্রুতিবদ্ধ ... আপনি এটি করতেও পারেনgit reset --hard origin
দেনিথ

13
git remoteআমার জন্য চিন্তার তালিকা উত্স, git reset --hard originবলেছেন fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.। কেন?
trss

7
এটা সত্যিই দারুন. শুধু আমার জীবন বাঁচিয়েছি।
নিনজাবয়

2
git reset HEAD~1আপনার সমস্ত পরিবর্তনগুলিও রাখবে তবে আপনাকে সবকিছু রাখার পরিবর্তে খালি সূচি দিয়ে ফেলে দেবে ( --softবিকল্পটি যেমন হবে)।
ফাঁকা

138

আমি অবাক হয়েছি কেন আমি যে সেরা উত্তর খুঁজে পেয়েছি তা কেন কেবল মন্তব্যে! ( দেনিথ 86 টি ভোট দিয়ে )

git reset --hard origin

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

git reset --hard origin/<branch>

16
এর জন্য ধন্যবাদ, ব্যাখ্যাটি কিছুটা প্রসারিত করে: একটি নির্দিষ্ট শাখার জন্য:git reset --hard origin/<branch>
ক্লিয়ারী

4
বা git reset --soft origin/<branch>, আপনি যদি অঙ্গীকার থেকে মুক্তি পেতে চান তবে স্থানীয় কাজটি চালিয়ে যান।
রিভারহর্স

1
আমি পেয়েছি fatal: ambiguous argument 'origin': unknown revision or path not in the working tree., আপনার যেমন শাখাটি নির্দিষ্ট করা দরকার:git reset --hard origin/feature/my-cool-stuff
কিপ করুন

উজ্জ্বল! এটি "স্বীকৃত" উত্তরের বিপরীতে কাজ করে যা কেবলমাত্র মাথাটি আলাদা করে এবং আপনাকে ঝুলিয়ে রাখে।
মে

55

এটি মুছবেন না: কেবল একটি প্রতিশ্রুতিবদ্ধতার জন্য git cherry-pick যথেষ্ট।

তবে আপনার যদি ভুল শাখায় বেশ কয়েকটি প্রতিশ্রুতি থাকে তবে তাgit rebase --onto জ্বলে উঠছে:

ধরুন আপনার কাছে এটি রয়েছে:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, তারপরে আপনি masterযেখানে চিহ্নিত হতে চান সেখানে চিহ্নিত করে এটি স্থানান্তর করতে পারবেন :

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

, y শাখা যেখানে এটি হওয়া উচিত ছিল তা পুনরায় সেট করুন:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

, এবং অবশেষে আপনার কমিটগুলি সরান (এগুলি প্রয়োগ করুন, বাস্তবে নতুন কমিট তৈরি করুন)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

দুর্ভাগ্যক্রমে, এটি প্রশ্ন ছিল না।
কাটারিয়াএ

1
@ কাটারিয়াএ এটি ভুল শাখায় করা প্রতিশ্রুতি মুছে ফেলার বৈধ বিকল্প এবং এটি একই পরিস্থিতিতে অন্যকে সহায়তা করবে (ভুল শাখায় করা ভাল প্রতিশ্রুতি)।
ভোনসি

14

আপনি git rebase -i FAR_ENOUGH_BACKযে প্রতিশ্রুতি চান না তার জন্য একটি করুন এবং লাইনটি ফেলে দিন।


6

আপনি যদি সেই প্রতিশ্রুতি অন্য কোনও শাখায় স্থানান্তর করতে চান তবে কমিটের এসএইচএকে প্রশ্নবিদ্ধ করুন

git rev-parse HEAD

তারপরে বর্তমান শাখাটি স্যুইচ করুন

git checkout other-branch

এবং cherry-pickপ্রতিশ্রুতিবদ্ধother-branch

git cherry-pick <sha-of-the-commit>

আমার অভিজ্ঞতা থেকে, এটি মূল শাখা থেকে প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরবে না, এইভাবে git reset --hard HEAD~1পরে প্রয়োজন necess আমি মনে করি reset --softতারপরে শাখাগুলি স্যুইচ করা এবং পুনরায় প্রতিশ্রুতিবদ্ধকরণের ফলে অতিরিক্ত কাজ বাঁচানো যেত। তারপরে আবার আমি সোর্স ট্রি ব্যবহার করে আমার বেশিরভাগ বুনিয়াদি জিনিসগুলি ব্যবহার করছিলাম, আমার ত্রুটির পরে কেবল এটির সাথে লাইন-ইন-কমান্ড করুন।
Justopi

3

আপনার রেফারেন্সের জন্য, আমি বিশ্বাস করি যে আপনি "হার্ড কাট" আপনার বর্তমান শাখা থেকে কেবল গিট রিসেট --হার্ডের সাথেই নয়, নিম্নলিখিত কমান্ডের মাধ্যমেও প্রতিশ্রুতিবদ্ধ করতে পারেন:

git checkout -B <branch-name> <SHA>

আসলে, যদি আপনি চেক আউট সম্পর্কে চিন্তা না করেন তবে আপনি যা চান তার সাথে শাখাটি সেট করতে পারেন:

git branch -f <branch-name> <SHA>

এটি কোনও শাখা থেকে কমিটগুলি সরিয়ে ফেলার একটি প্রোগ্রামিক উপায় হবে, উদাহরণস্বরূপ, এতে নতুন কমিটগুলি অনুলিপি করার জন্য (পুনরায় ব্যবহার করা)।

ধরুন আপনার কাছে একটি শাখা রয়েছে যা মাস্টার থেকে সংযোগ বিচ্ছিন্ন হয়েছে কারণ আপনি অন্য কোনও স্থান থেকে উত্স নিয়েছেন এবং শাখায় ফেলে দিয়েছেন।

আপনার এখন একটি শাখা রয়েছে যেখানে আপনি পরিবর্তনগুলি প্রয়োগ করেছেন, আসুন এটি "বিষয়" বলি।

আপনি এখন আপনার বিষয় শাখার সদৃশ তৈরি করবেন এবং তারপরে শাখা "ডাম্প" বসা সোর্স কোড ডাম্পের উপর এটি পুনরায় চালু করবেন:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

এখন আপনার পরিবর্তনগুলি শাখা টপিক-ডুপ্লিকেটে "ডাম্প" শুরুর পয়েন্টের ভিত্তিতে পুনরায় প্রয়োগ করা হবে তবে কেবলমাত্র "মাস্টার" এর পরে ঘটে যাওয়া কমিটগুলিই করা হবে। সুতরাং মাস্টার থেকে আপনার পরিবর্তনগুলি এখন "ডাম্প" এর শীর্ষে প্রয়োগ করা হয়েছে তবে ফলাফলটি "টপিক_ডুপ্লিকেট" এ শেষ হবে।

তারপরে আপনি "বিষয়_ নকল" দিয়ে "ডাম্প" প্রতিস্থাপন করতে পারেন:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

বা সাথে

git branch -M topic_duplicate dump

বা কেবল ডাম্প ফেলে দিয়ে

git branch -D dump

বর্তমান "টপিক_ডুপ্লিকেট" সাফ করার পরে আপনি কেবল চেরি-পিক করতে পারেন।

আমি যা বলার চেষ্টা করছি তা হ'ল আপনি যদি পূর্বসূরীর ভিত্তিতে বর্তমান "নকল" শাখাকে আপডেট করতে চান তবে আপনাকে অবশ্যই প্রথমে "চেরিপিক্সড" কমিটগুলি মুছে ফেলতে হবে git reset --hard <last-commit-to-retain>বা দ্বারাgit branch -f topic_duplicate <last-commit-to-retain> এবং তারপর উপর অন্য করে কপি (প্রধান থেকে বিষয় শাখা) হয় ছাড় বা চেরি-বাছাই করে by

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

চেরিপিক করা অনেক সহজ:

git cherry-pick master..topic

সুতরাং পুরো ক্রমটি নেমে আসবে:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

যখন আপনার বিষয়-সদৃশ শাখাটি পরীক্ষা করা হয়েছে। এটি বর্তমান নকল থেকে পূর্বের-চেরি-বাছাই করা কমিটগুলি সরিয়ে ফেলবে এবং কেবলমাত্র আপনার বর্তমান "ডাম্প" (বিভিন্ন পূর্বপুরুষ) এর শীর্ষে "বিষয়" এ ঘটে যাওয়া সমস্ত পরিবর্তন পুনরায় প্রয়োগ করবে। আপনার স্থানীয় পরিবর্তনগুলি এখনও এটির জন্য প্রযোজ্য কিনা তা পরীক্ষা করার জন্য ভিন্ন "ডাউনস্ট্রিম" মাস্টার ব্যবহার করার সময় "রিয়েল" আপস্ট্রিম মাস্টারের উপর আপনার বিকাশকে যুক্তিসঙ্গত সুবিধাজনক উপায় বলে মনে হয়। বিকল্পভাবে আপনি কেবল একটি ভিন্নতা তৈরি করতে পারেন এবং তারপরে এটি কোনও গিট উত্স গাছের বাইরে প্রয়োগ করতে পারেন। তবে এইভাবে আপনি একটি আপ-টু-ডেট মডিফাইড (প্যাচড) সংস্করণ রাখতে পারেন যা আপনার বিতরণের সংস্করণের উপর ভিত্তি করে যখন আপনার আসল বিকাশ আসল প্রবাহের মাস্টার বিরোধী।

সুতরাং কেবল প্রদর্শন করতে:

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

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


0

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

গিট রিসেট - মূল উত্স

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