গিটের একটি শাখা থেকে কমিটগুলি মুছুন


3229

আমি কোন প্রতিশ্রুতি মুছতে হয় তা জানতে চাই।

দ্বারা delete, আমি বলতে চাইছি এটি যেন আমি এই প্রতিশ্রুতিটি তৈরি করি নি এবং ভবিষ্যতে যখন আমি একটি ধাক্কা খাই তখন আমার পরিবর্তনগুলি দূরবর্তী শাখায় চাপ দেবে না।

আমি গিট সহায়তা পড়ি, এবং আমার মনে হয় আমার যে আদেশটি ব্যবহার করা উচিত তা হ'ল git reset --hard HEAD। এটা কি সঠিক?


41
আমি মনে করি এটি গীট পূর্বাবস্থায় ফেরানো শেষ প্রতিশ্রুতির নকল নয় কারণ এটি কোনও শাখা থেকে কোনও প্রতিশ্রুতি মুছতে কিভাবে জিজ্ঞাসা করে । আমি এও মনে করি যে উত্তরগুলির উত্তর ছাড়াই প্রকৃতপক্ষে এই প্রশ্নের সমাধান রয়েছে। তারা সকলেই সর্বশেষ প্রতিশ্রুতিগুলি রিওয়াইন্ড করে, এবং একক প্রতিশ্রুতি যা কিছুক্ষণ আগে ঘটেছিল। cherry-pickdelete
ক্রিস

12
@ ক্রিস, উত্তরটি প্রশ্নের সাথে উত্তর git rebase -i HEAD~10দেয়, কারণ এটি আপনাকে স্বেচ্ছায় মুছে ফেলার অঙ্গীকার বাছাই করতে দেয় না। লগ থেকে সরিয়ে নেওয়া কমিটগুলি উপেক্ষা করে গিটটি আপনাকে একের পর এক নির্দিষ্ট রেঞ্জের কমিটগুলি প্রয়োগ করে। আমি আজই এই আদেশটি ব্যবহার করেছি শীর্ষস্থানীয়কে ধরে রেখে আমার রেপোতে সাম্প্রতিক দ্বিতীয় এবং তৃতীয় প্রতিশ্রুতি থেকে মুক্তি পেতে। আমি সম্মত যে অন্যান্য উত্তরগুলির কোনওটি সন্তোষজনক নয়।
এমএসটি

@ এমএসটি হ্যাঁ, আমার বলা উচিত ছিল, গ্রহণযোগ্য উত্তরের বিকল্পগুলির মধ্যে এই প্রশ্নটি সম্বোধন করা উচিত, তবে আপনি একেবারেই সঠিক - এই আদেশটি কাজ করছে বলে মনে হচ্ছে
ক্রিস

উত্তর:


4120

সাবধানতা: git reset --hard আপনার কাজকর্মের পরিবর্তনগুলি মুছে ফেলবে । করতে ভুলবেন না কোন স্থানীয় পরিবর্তনগুলি রাখতে চান লুকিয়ে এই কমান্ড চালানোর আগে।

ধরে নিই যে আপনি সেই প্রতিশ্রুতিতে বসে আছেন, তাহলে এই আদেশটি এটি নষ্ট করবে ...

git reset --hard HEAD~1

HEAD~1মানে মাথা সামনে কমিট।

অথবা, আপনি আউটপুটটি git logদেখতে পারেন, যে প্রতিশ্রুতিতে ব্যাক আপ নিতে চান তার প্রতিশ্রুতি আইডিটি খুঁজে পেতে পারেন এবং তারপরে এটি করুন:

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

আপনি যদি ইতিমধ্যে এটি ঠেলাঠেলি করেন তবে এ থেকে মুক্তি পাওয়ার জন্য আপনাকে একটি জোর ধাক্কা দিতে হবে ...

git push origin HEAD --force

তবে অন্যরা যদি এটি টানতে পারে তবে আপনি একটি নতুন শাখা শুরু করা ভাল। কারণ যখন তারা টানবে, এটি এটিকে কেবল তাদের কাজে মিশিয়ে দেবে এবং আপনি এটিকে আবার পিছনে ঠেলে দেবেন।

আপনি যদি ইতিমধ্যে ধাক্কা দিয়ে থাকেন তবে এটি ব্যবহার করা ভাল git revert, একটি "মিরর চিত্র" প্রতিশ্রুতি তৈরি করা যা পরিবর্তনগুলি পূর্বাবস্থায় ফিরে আসবে। তবে উভয় কমিটই লগতে থাকবে।


FYI - git reset --hard HEADদুর্দান্ত যদি আপনি অগ্রগতিতে কাজ থেকে মুক্তি পেতে চান। এটি আপনাকে সাম্প্রতিকতম প্রতিশ্রুতিতে পুনরায় সেট করবে এবং আপনার কার্যকারী গাছ এবং সূচীর সমস্ত পরিবর্তন মুছে ফেলবে।


শেষ অবধি, যদি আপনি কোনও "মুছে ফেলা" প্রতিশ্রুতি সন্ধান করতে চান git reflogতবে আপনার আবর্জনা সংগ্রহ না করা অবধি এটি উপস্থিত থাকে ।


59
HEAD~1বা ঠিক HEAD^। যদি আপনি ঠেলাঠেলি করেন তবে আপনার git revertপরিবর্তে ব্যবহার করা উচিত ।
জাকুব নরবস্কি

13
স্পষ্টতই আপনি আপনার মাথা থেকে কমিটগুলি HEAD~n"ফিরে যেতে" ব্যবহার করতে পারেন n। সম্ভবত এই জায়গা থেকে আপনি => মোছা কাজ চলমান ... --hard HEADহিসাবেও ব্যাখ্যা করতে পারেন HEAD~0
নুয়াল

13
@ beamrider9 imho গিট রিবেস কমিটগুলি মুছে ফেলার প্রায়শই ভাল উপায় (গ্রেগ হিউগিলের উত্তরে বর্ণিত) - কমপক্ষে না কারণ রিবেসে আসলে একটি বড় সতর্কতা অন্তর্ভুক্ত থাকে যে আপনি স্টাফ 4realz মুছে ফেলবেন।
নোয়া সুসমান

20
এটি যদিও কমিট ট্রি থেকে পরিবর্তনগুলি মুছবে না। ওপি ইতিমধ্যে করা প্রতিশ্রুতি চেয়েছিল। যদি আপনি reset --hardএবং এটি পরীক্ষা করেন log --oneline --allতবে কমিটগুলি এখনও গাছের মধ্যে থেকে যায়। কীভাবে আমরা গাছ থেকে এই কমিটগুলি মুছব? ধন্যবাদ।
আইগবানাম

17
reset --softস্থানীয় প্রতিশ্রুতি মুছে ফেলার জন্য ব্যবহারের কাজটি আবারও চলছে!

704

আপনি যদি এখনও প্রতিশ্রুতি কোথাও ঠেকেন না, আপনি git rebase -iসেই প্রতিশ্রুতিটি সরিয়ে দিতে ব্যবহার করতে পারেন। প্রথমে খুঁজে বের করুন যে প্রতিশ্রুতি কতটা পিছনে (আনুমানিক)। তারপরে:

git rebase -i HEAD~N

~Nমানে গত রি-বেসের ফলে Nকরে ( Nউদাহরণস্বরূপ, একটি সংখ্যা হতে হবে HEAD~10)। তারপরে, আপনি আপত্তিজনক প্রতিশ্রুতি মোছার জন্য গিট আপনার কাছে উপস্থিত ফাইল সম্পাদনা করতে পারেন। এই ফাইলটি সংরক্ষণ করার পরে, গিট নীচের সমস্ত কমিটগুলি আবার লিখবে যেমন আপনি মুছে ফেলা একটির উপস্থিতি নেই।

গিট বুকের ছবি এবং উদাহরণ সহ রিবিসিংয়ের একটি ভাল বিভাগ রয়েছে

এই যদিও থেকে সতর্ক থাকুন, কারণ আপনি এমন কিছু বিষয় যা আপনি পরিবর্তন আছে অন্যত্র ধাক্কা, অন্য পদ্ধতির প্রয়োজন হবে যদি না আপনি একটি শক্তি ধাক্কা করতে পরিকল্পনা করা হয়।


2
দ্রষ্টব্য: যদি আপনি এই শেষ ব্যাচে কমিটের কোনও - কোনও- ff সংযুক্তি ঘটে থাকে তবে রিবাজে তাদের কসাই করবে :( এই পৃষ্ঠার নীচে -p উল্লেখ করা হয়েছে , সমস্যাটি হ'ল আপনি যদি -i এর সাথে প্রতিস্থাপন করেন, আপনি "এই প্রতিশ্রুতি সম্পাদনা করুন, সেইটিকেই সম্পাদন করুন" ইত্যাদি ইত্যাদির পছন্দগুলি দিয়ে এখনই পপ আপ পাবেন না কেউ সমাধান কী জানেন?
বুকভ

4
আপনি যদি এটি ঠেলাঠেলি করে থাকেন? (কেবলমাত্র আমি রিমোট রেপো ব্যবহার করছি)
কোস্টা

6
@ কোস্টা আপনি push -fচাপ প্রয়োগ করতে এবং স্থানীয় স্থানীয় সাথে রিমোট শাখাটি প্রতিস্থাপন করতে ব্যবহার করতে পারেন । এটি যদি কেবল নিজের দূরবর্তী রেপো হয় তবে সমস্যা নেই। এর মধ্যে অন্য কেউ আনলে সমস্যা শুরু হয়।
গ্রেগ হিউগিল

3
আমি একটি ডেটা ফাইল যুক্ত এবং প্রতিশ্রুতিবদ্ধ করেছি যা গিটহাবের পক্ষে খুব বড় ছিল (হ্যাঁ, এটি সম্ভবত উত্স রেপোতে আর হওয়া উচিত নয়; ওহ ভাল)। আমি যখন ধাক্কা দেওয়ার চেষ্টা করেছি তখন খুব বড় ফাইলের কারণে গিটহাব প্রত্যাখ্যান করেছিল। আমি যা করতে চেয়েছিলাম তা হ'ল এই এক প্রতিশ্রুতিটি পূর্বাবস্থায় ফেরা, আর এরপরে ঘটে যাওয়া কয়েকটি অন্যান্য সম্পর্কযুক্ত চুক্তি সংরক্ষণ করার সময় saving git rebase -i HEAD~5কমান্ড ছিল ঠিক কি আমি সম্পূর্ণরূপে এই আমার স্থানীয় রেপো থেকে কমিট মুছে ফেলার জন্য প্রয়োজন! ধন্যবাদ!
aldo

4
@ ডাম্বল্যাড: এর সাথে rebase -iমুছে ফেলা অঙ্গীকারের সাথে সম্পর্কিত পরিবর্তনগুলি সংরক্ষিত হয় না।
গ্রেগ হিউগিল

517

আর একটি সম্ভাবনা আমার ব্যক্তিগত প্রিয় কমান্ডগুলির মধ্যে একটি:

git rebase -i <commit>~1

-iআপনি যেটি প্রতিশ্রুতিবদ্ধ হতে চান তার ঠিক আগে পয়েন্টে এটি ইন্টারেক্টিভ মোডে রিবেস শুরু করবে । সম্পাদক তারপরে সমস্ত কমিটের তালিকা শুরু করবে। আপনি মুছে ফেলতে এবং ফাইলটি সংরক্ষণ করতে চান এমন প্রতিশ্রুতিযুক্ত লাইনটি মুছুন। রিবেস বাকী কাজটি করবে, কেবল সেই প্রতিশ্রুতি মুছে ফেলবে এবং অন্য সমস্তকে আবার লগ-এ পুনরায় খেলবে।


3
থেক্স, বিটিডব্লিউ যদি আপনি কোনও সমস্যা নিয়ে যান (যেমন শূন্য কমিট) আপনি ব্যবহার করতে পারেনgit rebase --continue
realgt

8
আরও সহজ: git rebase -i HEAD~1
মিমেল

2
Wowzers থেকে। git rebase -i HEAD~1সত্যিই রেপো অনেক পরিষ্কার! এটি ঠিক কী করেছে তা বলা শক্ত, তবে পুরো জিনিসটি আরও পরিষ্কার দেখা যাচ্ছে। একটু উদ্বেগজনক, আসলে।
চার্লস উড

7
আমি মনে করি এটি কমিয়ে আনার মতো বিষয় নয় যে কেবল এই তালিকা থেকে সরিয়ে দেওয়া হয়েছে mere আপনি যদি জগাখিচুড়ি করেন তবে আপনি রিফ্লগটি ব্যবহার করে প্রতিশ্রুতি ফিরে পেতে পারেন ।
জাজ

6
লাইনটি মুছে ফেলা কি ডি / ড্রপের মতো?
লিও

344

আমি এই উত্তরটি সংযোজন করছি কারণ আমি দেখতে পাচ্ছি না যে কেবলমাত্র যে কেউ কাজটি করার চেষ্টা করেছে সে গিট ব্যবহার করে কিছু ভুল করার কারণে কেন সেই সমস্ত কাজ মুছে ফেলতে চাইবে!

আপনি যদি নিজের কাজটি রাখতে চান এবং কেবল 'পূর্বাবস্থায়িত হন' যে কমান্ড কমিট করে (আপনি রেপোতে চাপ দেওয়ার আগে ধরা পড়েছিলেন):

git reset --soft HEAD~1

শেষ প্রতিশ্রুতি থেকে আপনার কাজটি অগ্রগতিতে ধ্বংস করতে না চাইলে - - পতাকাটি ব্যবহার করবেন না


5
কেন এর উদাহরণ এখানে: আপনি বিকাশকারী সার্ভারে একটি ছোট টুকরো কাজ করেন যা আপনি প্রতিশ্রুতিবদ্ধ করেন। তারপরে দেখা যাচ্ছে যে সেই সার্ভারটির বহির্গামী HTTPS অ্যাক্সেস নেই, সুতরাং আপনি প্রতিশ্রুতি কোথাও ঠেলাতে পারবেন না। এটির আগে কখনও ঘটেনি বলে ভান করা সবচেয়ে সহজ এবং আপনার স্থানীয় মেশিন থেকে প্যাচটি আবার করুন।
স্টিভ বেনেট

1
@ কার্তিকবোস এখানে সর্বদা পুনরায় ব্লগ হবে। এমনকি git reset --hard HEAD~1আপনার পূর্ববর্তী প্রতিশ্রুতি রিফ্লগের মাধ্যমে উপলব্ধ হবে (আপনি এটি শেষ না হওয়া পর্যন্ত); এখানেও দেখুন: gitready.com/interedia/2009/02/09/…
কোডেলিং

4
ধন্যবাদ। এই উত্তরটিকে উচ্চতর স্থান দেওয়া উচিত বা গৃহীত উত্তরের অন্তর্ভুক্ত করা উচিত। প্রতিশ্রুতি মুছে ফেলা হচ্ছে!
অ্যালসিএন্ডে

2
@ র্যান্ডলফকার্টার: আপনি এখনও যে কোনও অনির্দিষ্ট পরিবর্তন হারাবেন।
nnot101

7
@ রব, একটি উদাহরণ হ'ল আপনি যখন দুর্ঘটনাক্রমে এমন কোনও ফাইল প্রতিশ্রুতি দেন যা কোনও গোপন (যেমন একটি পাসওয়ার্ড) ধারণ করে যা কখনই উত্স নিয়ন্ত্রণে রাখা উচিত নয়। স্থানীয় প্রতিশ্রুতি অবশ্যই পূর্বাবস্থায়িত করা নয়, ধ্বংস করা উচিত , সুতরাং এটি কখনই সার্ভারে ঠেলাঠেলি করবে না।
বব মায়ার্স

141

একটি সম্পূর্ণ প্রতিশ্রুতি অপসারণ

git rebase -p --onto SHA^ SHA

আপনি যে রেফারেন্স থেকে মুক্তি পেতে চান তা অবশ্যই "এসএএএ" প্রতিস্থাপন করুন। এই কমান্ডের "^" আক্ষরিক হয়।

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep


26
এই উত্তর আমি কীভাবে আরও উঁচু করে তুলতে পারি ??? অন্যান্য সমাধানগুলি কেবলমাত্র ইন্টারেক্টিভভাবে এটি কীভাবে করতে হয় বা শীর্ষকীয় কমিটগুলি সরানোর জন্য তা দেখায়।
ribamar

5
-p, --preserve-merges পুনর্নির্মাণ মার্জ কমিটগুলি পুনর্বিবেচনা করে ইতিহাসকে সমতল করার পরিবর্তে মার্জ কমিট প্রবর্তন করে। একত্রিত করার জন্য সংঘাতের সমাধানগুলি বা ম্যানুয়াল সংশোধনগুলি মার্জ করে সংরক্ষণ করা হয় না।
'11 এ

5
এটি আসল সঠিক উত্তর
হামমান স্যামুয়েল

9
এটি বলে, "আপনি যে রেফারেন্স থেকে মুক্তি পেতে চান তার সাথে এসএইচএ প্রতিস্থাপন করুন" তবে লাইনে সেখানে দু'বার এসএইচএ রয়েছে। এখানে আমি কি করেছি। গিট রিবেস -p --onto 5ca8832c120 ^ 5ca8832c120 তবে কিছুই পরিবর্তন হয়নি। আমার কি একই এসএএচএ দুবার ব্যবহার করার কথা রয়েছে? যদি তা না হয়, তবে কমিটমেন্ট অপসারণের জন্য এসএইচএ এবং অন্য এসএইচএ কী হওয়ার কথা?
রুবিকসম্যান

3
বাহ, এটি ত্রুটিহীনভাবে কাজ করেছে! এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
লিরান এইচ

51

আপনি যদি সর্বশেষ প্রতিশ্রুতি অপসারণ করতে পরিবর্তনগুলি প্রকাশ না করেন তবে আপনি এটি করতে পারেন

$ git reset --hard HEAD^

(দ্রষ্টব্য যে এটি সমস্ত আপত্তিজনক পরিবর্তনগুলি সরিয়ে ফেলবে; যত্ন সহ ব্যবহার করুন)।

যদি আপনি ইতিমধ্যে মুছে ফেলা প্রতিশ্রুতি প্রকাশ করেন তবে গিট রিভার্ট ব্যবহার করুন

$ git revert HEAD

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

@ কোস্টা: কোন কাজ হয়নি (উদাহরণস্বরূপ আপনি কোন সংস্করণটি ব্যবহার করেছেন) এবং আপনি কীভাবে লগ করলেন?
জাকুব নরবস্কি

আমি এই প্রশ্নোত্তর প্রায় সব চেষ্টা করেছি। (আমি খুব সম্প্রতি গিট রিভার্ট করার চেষ্টা করেছি) আমার গিট লগ:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
কোস্টা

1
আমি কেবল কমিটগুলি মুছতে চাই (যেমন তারা কখনও উপস্থিত ছিল না)। আমি কয়েকটি অদ্ভুত কোডিং অ্যাডভেঞ্চারে গিয়েছিলাম, বেশ কয়েকটি নতুন কমিট করে, এবং এগুলি সমস্ত জঞ্জালের মধ্যে পড়ে। আমার গিট লগ থেকে আমি কীভাবে এটিগুলি মুছতে পারি?
কস্টা

2
পবিত্র কৃপণ কিছু যাদুকরীভাবে আমি যা চেয়েছিলাম ঠিক তা করেছে .... সেই আদেশগুলির মধ্যে কোনটি এটি করেছে? !! ?!
কোস্টা

44

বলুন আমরা রেপো থেকে 2 এবং 4 টি কমিট সরিয়ে নিতে চাই।

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

দ্রষ্টব্য: আপনি ব্যবহার করছেন --hardএবং যেহেতু আপনার রেপোর উপর প্রশাসকের অধিকার থাকা দরকার-f

  • git checkout b3d92c5 শেষ ব্যবহারযোগ্য প্রতিশ্রুতি চেকআউট করুন।
  • git checkout -b repair কাজ করার জন্য একটি নতুন শাখা তৈরি করুন।
  • git cherry-pick 77b9b82 প্রতিশ্রুতি মাধ্যমে চালানো 3।
  • git cherry-pick 2c6a45b প্রতিশ্রুতি মাধ্যমে চালানো 1।
  • git checkout master চেকআউট মাস্টার।
  • git reset --hard b3d92c5 শেষ ব্যবহারযোগ্য প্রতিশ্রুতিতে মাস্টার পুনরায় সেট করুন।
  • git merge repair মাস্টারে আমাদের নতুন শাখাটি মার্জ করুন।
  • git push -f origin master দূরবর্তী রেপোতে মাস্টার চাপুন।

1
শেষ পদক্ষেপের git push -f origin masterকোনও বিকল্প থাকা উচিত--hard
ভিভেক্স

2
আমি অনুমান করি এর commit 0চেয়েও বয়স্ক commit 1। দয়া করে আপনি আমাকে বলতে পারেন কেন প্রথমে commit 3(চেরি-পিক দ্বারা) এবং তারপরে চালাবেন commit 1? এর চেকআউট পর b3d92cd( commit 0) আমি চেরি-বাছাই আশা commit 1, তারপর commit 3। ধন্যবাদ।
জারেক সি

@ জারেকসি আমি মনে করি যে শীর্ষস্থানীয় প্রতিশ্রুতিবদ্ধতা এখানে নতুন প্রতিশ্রুতিবদ্ধ, যদি না আমি কিছু ভুল দেখি ...
জেফ হুইজম্যানস

41
git reset --hard commitId

git push <origin> <branch> --force

পিএস: কমিটআইডি সেইটিকে বোঝায় যা আপনি ফিরে যেতে চান


গিট পুশ - ফোর্সেস <ওরিগিন> <ফ্রেঞ্চনাম>। শাখার নাম উল্লেখ না করে এটি দূরবর্তী সমস্ত ফাইল পরিবর্তন করতে পারে।
শীলপ্রিয়

39

জোর করে ইতিহাস পরিবর্তন করুন

ধরে নিই যে আপনি কেবল শেষ প্রতিশ্রুতি মুছে ফেলতে চান না, তবে আপনি সর্বশেষ এন কমিটগুলির নির্দিষ্ট কমিটগুলি মুছতে চান, সাথে যান:

git rebase -i HEAD~<number of commits to go back>, সুতরাং git rebase -i HEAD~5যদি আপনি শেষ পাঁচটি কমিট দেখতে চান।

তারপর টেক্সট এডিটর শব্দ পরিবর্তন pickকরার জন্য dropযে কমিট করার জন্য আপনাকে সরাতে চাইছে আগামী। সম্পাদকটি সংরক্ষণ করুন এবং প্রস্থান করুন। ভাল খবর!

Additively ইতিহাস পরিবর্তন করুন

ব্যবহার করে দেখুন git revert <commit hash>প্রত্যাবর্তন একটি নতুন প্রতিশ্রুতি তৈরি করবে যা নির্দিষ্ট প্রতিশ্রুতি বাতিল করে।


dropকীওয়ার্ড সংজ্ঞায়িত করা হয় না। কোন কমিট মুছে ফেলতে কেবল পুরো লাইনটি সরিয়ে ফেলুন।
শায়ান সালেহিয়ান

1
আমার জন্য ড্রপকে কীওয়ার্ড হিসাবে সংজ্ঞায়িত করা হয়েছিল, তবে একটি ড্রপ করা ইতিহাস থেকে প্রতিশ্রুতি সরিয়ে ফেলবে বলে মনে হয় না। ইন্টারেক্টিভ রিবেস থেকে লাইনটি সরিয়ে ফেলা যাইহোক।
অ্যাডাম পার্কিন

এটাই আমার দরকার ছিল। দুর্দান্ত কাজ করে; ধন্যবাদ!
ডাইকানস্টডারফিউজ

30

আপনি যদি আপনার সর্বশেষ প্রতিশ্রুতিটি ঠিক করতে চান তবে আপনি এই প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরতে পারেন এবং এতে ফাইলগুলি আনস্টেজ করতে পারেন:

git reset HEAD~1

ফাইলগুলি মঞ্চস্থ করা গিট অ্যাড কমান্ডের আগে এটি আপনার স্টোরগুলিকে তার অবস্থায় ফিরিয়ে দেবে। আপনার পরিবর্তনগুলি আপনার কার্যনির্বাহী ডিরেক্টরিতে থাকবে। হেড ~ 1 শাখার বর্তমান উপরিভাগের নীচে প্রতিশ্রুতি বোঝায়।

আপনি যদি এন কমিটসকে অসম্মতি দিতে চান তবে কোডটি আপনার ওয়ার্কিং ডিরেক্টরিতে রাখুন:

git reset HEAD~N

আপনি যদি আপনার সর্বশেষ প্রতিশ্রুতি থেকে মুক্তি পেতে চান এবং কোড পরিবর্তন রাখতে না চান, আপনি একটি "হার্ড" রিসেট করতে পারেন।

git reset --hard HEAD~1

তেমনিভাবে, আপনি যদি সর্বশেষ এন কমিটগুলি বাতিল করতে চান এবং কোড পরিবর্তন রাখতে চান না:

git reset --hard HEAD~N

22
git rebase -i HEAD~2

এখানে '2' হল আপনি পুনঃবাস করতে চান এমন কমিটের সংখ্যা।

'git rebase -i HEAD`

আপনি যদি সমস্ত কমিটগুলি পুনরায় চালু করতে চান তবে।

তারপরে আপনি এই বিকল্পগুলির মধ্যে একটি চয়ন করতে সক্ষম হবেন।

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

এই লাইনগুলি পুনরায় অর্ডার করা যেতে পারে; তারা উপরে থেকে নীচে কার্যকর করা হয়। আপনি যদি এখানে একটি লাইন সরিয়ে ফেলেন তবে কমিট হারিয়ে যাবে। তবে, আপনি যদি সমস্ত কিছু সরিয়ে ফেলেন তবে রিবেসটি বাতিল করা হবে। নোট করুন যে খালি কমিটগুলি মন্তব্য করা হয়েছে

বিকল্পটি "d" ব্যবহার করে বা আপনার প্রতিশ্রুতিবদ্ধ একটি লাইন সরানো আপনি কেবল সেই প্রতিশ্রুতিটি সরাতে পারেন।


সর্বশেষ Git সংস্করণে আর বিকল্প নেই । আপনার মুছে ফেলার জন্য পুনরায় কমিটস সহ লাইনগুলি সরিয়ে ফেলতে হবে।
ওলেগ আব্রাজাইভ

17

স্থানীয় শাখায় মুছতে, ব্যবহার করুন

git reset --hard HEAD~1

একটি দূরবর্তী শাখায় মুছতে, ব্যবহার করুন

git push origin HEAD --force

12

[দ্রুত উত্তর]

আপনার অনেক বিকল্প রয়েছে, উদাহরণস্বরূপ:

  • বিকল্প 1:

    git rebase -i <YourCommitId>~1
    

    আপনি যে প্রতিশ্রুতিতে ফিরে যেতে চান সেই সংখ্যার জন্য আপনার কমিটআইডি পরিবর্তন করুন।

  • বিকল্প 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    আপনি যে প্রতিশ্রুতিতে ফিরে যেতে চান সেই সংখ্যার জন্য আপনার কমিটআইডি পরিবর্তন করুন।

    আমি এই বিকল্পটির প্রস্তাব দিচ্ছি না কারণ আপনি আপনার কাজটি এগিয়ে চলছে।

  • বিকল্প 3:

    git reset --soft HEAD~1
    

    আপনি আপনার কাজ রাখতে পারেন এবং কেবল প্রতিশ্রুতি পূর্বাবস্থা করতে পারেন।


থ্যানকিউ থ্যানকিউ থ্যানকিউ থানকিউ (ওয়াই)
হাবিব রেহমান

11

সূত্র: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

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

উদাহরণস্বরূপ আপনার শেষ প্রতিশ্রুতি

গিট পুশ অরিজিন + aa61ab32 ^: মাস্টার

এখন আপনি এই প্রতিশ্রুতিটি মুছতে চান তারপরে এটি করার একটি সহজ উপায়

ধাপ

  1. বর্তমান কমিটের পিতামাতার সাথে প্রথমে শাখাটি পুনরায় সেট করুন

  2. এটিকে জোর করে রিমোটে চাপুন।

git reset HEAD^ --hard

git push origin -f

নির্দিষ্ট প্রতিশ্রুতিবদ্ধতার জন্য, আপনি পুনরায় সেট করতে চান নিম্নলিখিত অনুসরণ করছেন

git reset bb676878^ --hard

git push origin -f

9

এটি করার আরেকটি উপায় এখানে:

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

git reset --hard COMMIT_ID

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

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

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

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


9

ভুলটি:

আমি git rebase -i --rootআমার শাখাটি সম্পাদনা করছি, অজ্ঞতাবশত আমি ভাবছিলাম যে আমি প্রথম প্রতিশ্রুতিটি মাস্টারের থেকে পৃথক হয়ে উঠতে পারি ( উইন্ডোজ ডিফল্ট ভিউর জন্য গিটহাব মাস্টারের সাথে তুলনা করা, এটি পুরোপুরি গোপন করে)।

আমি একটি সিলিকন ভ্যালি দাড়ি বাড়িয়েছিলাম যখন 900+ কমিট তাদের সাব্লাইমে লোড করে। কোনও পরিবর্তন ছাড়াই প্রস্থান করে, আমি আমার ব্যাটারিটি চার্জ করে তারপর শেভ করতে এগিয়ে গেলাম, কারণ সমস্ত 900+ ব্যক্তি স্বতঃস্ফূর্তভাবে পুনর্বাসনের জন্য প্রতিশ্রুতি দেয় - তাদের প্রতিশ্রুতি সময়কে এখনই পুনরায় সেট করে।

গিটকে মারতে এবং আসল সময়গুলি সংরক্ষণ করার জন্য নির্ধারিত, আমি এই স্থানীয় সংগ্রহস্থলটি মুছে ফেলেছি এবং রিমোট থেকে পুনরায় ক্লোনিং করেছি।

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

অপশন ক্লান্ত করা:

আমি ইচ্ছা করিনি git revert- এটি একটি অতিরিক্ত প্রতিশ্রুতি তৈরি করবে, গিটকে উপরের হাত দিয়ে।

git reset --hard HEADreflogশেষ এবং শুধুমাত্র পরীক্ষা করার পরে, কিছুই করেনিHEAD ক্লোনটি ছিল - গিট জিতল।

অতি সাম্প্রতিক এসএইচএ পেতে, আমি গিথুব ডট কম-এ রিমোট রিপোজিটরি যাচাই করেছিলাম - গৌণ জয়।

ভাবনার পরে git reset --hard <SHA> কাজ , আমি আরেকটি শাখাকে মাস্টার এবং 1 ... 2 ... পুফে আপডেট করেছি! প্রতিশ্রুতি ফিরে এসেছিল - গিট জিতল।

মাস্টারের কাছে ফিরে চেষ্টা করা git rebase -i <SHA>, চেষ্টা করার সময় , তারপর লাইনটি সরিয়ে দিন ... কোনও লাভ নেই, দুঃখের সাথে বলতে হবে। " আপনি যদি এখানে একটি লাইন সরিয়ে ফেলেন তবে কমিট লস হয়ে যাবে "। আহ ... উপর নতুন বৈশিষ্ট্য glossed দানব n00b মধ্যে 2.8.3 রিলিজ নোট

সমাধান:

git rebase -i <SHA> তারপর d, drop = remove commit

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

https://twitter.com/holman/status/706006896273063936

তোমার দিন ভালো যাক.


8

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

আমি মনে করি যে চীনামাটির বাসন কমান্ডগুলি দিয়ে কোনও প্রতিশ্রুতি অপসারণ করার কোনও উপায় নেই । একমাত্র উপায় হ'ল লগ এবং রিফ্লগ থেকে এটি সরিয়ে ফেলা এবং তারপরে একটি চালানো git prune --expire -now


1
স্ট্যাকওভারফ্লোতে যে ক্রমতে উত্তরগুলি প্রদর্শিত হবে তা স্থির নয়। দয়া করে "উপরের সমস্ত কমান্ড" উল্লেখ করুন না। আপনার নিজের উত্তরটি স্বয়ংসম্পূর্ণ করুন।
পাস্কেল কুয়াক

এই উত্তর সম্পূর্ণ সঠিক নয়। git prune আসলে "পোরসিলাইন" কমান্ডগুলির মধ্যে একটি । এছাড়াও, এটি বিরল যে আপনি আপনার রিফলগ সম্পূর্ণরূপে সাফ করতে চান (একটি ব্যবহারের ক্ষেত্রে আপনার রেপো থেকে সংবেদনশীল তথ্য সরিয়ে ফেলা, তবে আমি যেমন বলেছি, এটি বিরল ব্যবহারের ক্ষেত্রে) case আপনার ডেটা পুনরুদ্ধারের প্রয়োজনে আপনি প্রায়শই পুরানো কমিটগুলি রিফ্লগের মধ্যে রাখতে চান old প্রো গিট দেখুন : 9.7 গিট অভ্যন্তরীণ - রক্ষণাবেক্ষণ এবং ডেটা পুনরুদ্ধার

8

আপনি যদি ইতিহাস বজায় রাখতে চান, প্রতিশ্রুতিবদ্ধতা এবং প্রত্যাবর্তন প্রদর্শন করে, আপনার ব্যবহার করা উচিত:

git revert GIT_COMMIT_HASH

আপনি কেন আবার উল্টাচ্ছেন এবং তারপরে বার্তাটি প্রবেশ করান:

git push  

আপনি ইস্যু করলে আপনি git logউভয়ই "ভুল" প্রতিশ্রুতি দেখবেন এবং লগ বার্তাগুলি ফিরে পাবেন।


হ্যাঁ, তবে ওপি পরিষ্কার ছিল যে তারা যা চায় তা নয়।
স্টিভ বেনেট

7

আপনি যদি নিজের শেষ প্রতিশ্রুতিটি সবেমাত্র ভুল করে ফেলে থাকেন (ভুল বার্তা, কিছু পরিবর্তন যুক্ত করতে ভুলে গিয়েছেন) এবং কোনও পাবলিক রেপোতে চাপ দেওয়ার আগে এটি ঠিক করতে চান তবে কেন ব্যবহার করবেন না:

git commit --amend -m "New message here"

আপনার যদি নতুন মঞ্চ পরিবর্তন হয় তবে সেগুলি শেষ প্রতিশ্রুতি (যা আপনি পরিত্রাণের চেষ্টা করছেন) এর সাথে মিলিত হবে এবং সেই প্রতিশ্রুতি প্রতিস্থাপন করবে।

অবশ্যই যদি আপনি কোনও প্রতিশ্রুতি সংশোধন করার পরে সংশোধন করেন তবে আপনি ইতিহাস পুনর্লিখন করছেন যাতে আপনি যদি তা বোঝেন তা নিশ্চিত হন।

আপনি যদি আগের কমিটের বার্তাটি ব্যবহার করতে পছন্দ করেন তবে '-ম' এর পরিবর্তে '- না-সম্পাদনা' বিকল্পটিও পাস করতে পারেন।

দস্তাবেজ: http://git-scm.com/docs/git-commit.html


2
ওপি যা চাইছে তা নয়।
স্টিভ বেনেট

5

আপনি যদি ইতিমধ্যে ঠেলাঠেলি করেন, প্রথমে আপনি HEAD ($ GIT_COMMIT_HASH_HERE) এ থাকতে চান এমন প্রতিশ্রুতি সন্ধান করুন , তারপরে নিম্নলিখিতগুলি চালান:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

তারপরে প্রতিটি জায়গাতেই রেপো ক্লোন করা হয়েছে, চালান:

git reset --hard origin/master

5

আমি যখন প্রতিশ্রুতিবদ্ধ এবং ধাক্কা দিই তখন আমি সাধারণত যা করি (যদি কেউ তার প্রতিশ্রুতি দেয় তবে সমস্যাটি সমাধান হয়):

git reset --hard HEAD~1

git push -f origin

এই সাহায্য আশা করি


5

আমি ইতিমধ্যে ঠেলাঠেলি করেছি। দূর থেকে কিছু কমিট ফিরিয়ে দেওয়া দরকার। অনেক বৈচিত্র চেষ্টা করেছি, কিন্তু শুধুমাত্র এই থেকে জাস্টিন Git গুল্ম মাধ্যমে আমার জন্য সূক্ষ্ম কাজ করা হয়:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

4

স্থানীয় শাখায় পুনরায় সেট করুন

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

উত্স দিকে চাপ দিন

git push -f origin

3

অস্থায়ী ফোল্ডারে আপনার কোডের ব্যাকআপ নিন। নিম্নলিখিত আদেশটি সার্ভারের মতো পুনরায় সেট করবে।

git reset --hard HEAD
git clean -f
git pull

আপনি যদি নিজের পরিবর্তনগুলি রাখতে চান এবং সাম্প্রতিক কমিটগুলি সরাতে চান

git reset --soft HEAD^
git pull


2

স্থানীয় প্রতিশ্রুতি মুছুন

উপরের চিত্রটিতে আপনি দেখতে পাচ্ছেন যে আমি "পরীক্ষার পরিবর্তন 2" কমিট (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 মুছে ফেলতে চাই) (আপনি গিট ব্যাশেgitk কমান্ড ব্যবহার করে SHA1 আইডি পেতে পারেন )।

তার জন্য আমি ব্যবহার করতে পারি (নীচের সমস্ত কমান্ড কেবলমাত্র লোকালটিতে কাজ করে you

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// এটা ব্যাক আপ আপনি যে কমিট (এর SHA1 এ আইডি পরীক্ষা পরিবর্তন 4 কমিট হয় 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // এটি প্রতিশ্রুতি দেওয়ার আগে আপনাকে ব্যাক-আপ করবে।
  3. git reset --hard HEAD^ // গিট থেকে শেষ প্রতিশ্রুতি অপসারণ করতে

মুছে ফেলার পরে:

কমিট ডিলিট করার পরে


2

git reset --hard HEAD~1
আপনি এখন আগের মাথাতে থাকবেন। শাখাটি টানুন। নতুন কোড পুশ করুন। কমিট গিট থেকে সরানো হবে


যদি না আপনি ইতিমধ্যে পরিবর্তনগুলিকে ধাক্কা দিয়ে থাকেন। সেক্ষেত্রে হার্ড রিসেট আপনার রিমোট পরিষ্কার করবে না। সেক্ষেত্রে রিবেস ভাল বিকল্প
c0der512

1

গিট রিসেট --হার্ড

গিট পুশ অরিজিন হেড - ফোর্স

যদি এক বা একাধিক কমিট ট্যাগ হয় তবে প্রথমে ট্যাগ (গুলি) মুছুন। অন্যথায় ট্যাগ প্রতিশ্রুতি অপসারণ করা হয় না।


0

গিট রিভার্ট ব্যবহার করুন https://git-scm.com/docs/git-revert .এটি সমস্ত কোড রিভার্ট করবে তারপরে আপনি পরবর্তী কমিটগুলি করতে পারেন hen তারপরে সেই শেষ প্রতিশ্রুতিতে নির্দেশ করা হবে। রিভার্টেড কমিটগুলি কখনই মুছে না তবে এটি আপনার শেষ প্রতিশ্রুতিতে প্রভাব ফেলবে না।


0

আমার ক্ষেত্রে, এই pupose জন্য আমার যাদু কোডটি হ'ল:

git reset --hard @{u}

এটি পরীক্ষা করে বলুন। আমি কয়েকটি পৃথক চেষ্টা করেছি, তবে এই একমাত্র আমাকে সাহায্য করেছিল।

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