আমি কি গিট কমিট মুছে ফেলতে পারি তবে পরিবর্তনগুলি রাখতে পারি


1054

আমার এক উন্নয়ন শাখায় আমি আমার কোডবেসে কিছু পরিবর্তন করেছি। আমি যে বৈশিষ্ট্যগুলিতে কাজ করেছিলাম তা সম্পূর্ণ করার আগে, আমাকে আমার বর্তমান শাখাটি কিছু বৈশিষ্ট্য ডেমোতে মাস্টার হিসাবে স্যুইচ করতে হয়েছিল। তবে কেবলমাত্র "গিট চেকআউট মাস্টার" ব্যবহার করে আমার বিকাশ শাখায় আমি যে পরিবর্তনগুলি করেছি তা সংরক্ষণ করেছিলাম, এইভাবে মাস্টারে কিছু কার্যকারিতা ভঙ্গ করে। সুতরাং আমি যা করেছি তা হ'ল আমার উন্নয়ন শাখায় পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ "অস্থায়ী প্রতিশ্রুতি" দিয়ে এবং তারপরে ডেমোটির জন্য চেকআউট মাস্টার changes

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


65
পরের বার:git stash
ম্যাট বল

51
@ ম্যাটবাল, অগত্যা নয়। যদিও git stashএকটি ভাল সরঞ্জাম, "কাজ চলছে" থ্রো-এওর কমিটগুলিও একটি বৈধ ডিভাইস।
kostix

3
এই গিটহাব থেকে স্ট্রেইট একটি বড় সম্পদ: পূরণ হবে কীভাবে গীত সঙ্গে (প্রায়) কিছু
jasonleonhard

9
@ ম্যাটবাল @ কোস্টিক্স হ্যাঁ, স্ট্যাশগুলি "দীর্ঘমেয়াদী" স্ট্যাশিংয়ের জন্য বিশেষভাবে উপযুক্ত নয়, এই বিষয়টি বিবেচনা করে যে এটি পুরো রেপোর জন্য একটি বৈশ্বিক স্ট্যাক। আমি কোনও শাখায় পরিবর্তনগুলি সংযোজন করতে এবং তারপরে অন্যান্য শাখাগুলিতে যেতে, অন্য যে কোনও কাজ করতে সক্ষম হতে চাই, কিছুদিন পরে এই উদ্বেগ ছাড়াই ফিরে আসি যে আমি git stashঅন্তর্বর্তী সময়ে অন্য কোনও শাখায় ব্যবহার করতে পারি ।
এলেক

4
একটি বিষয় লক্ষণীয় stashযে এটি সম্পূর্ণ স্থানীয় এবং এটি রেপো-মোছা বা বিনোদন বা হার্ডওয়্যার ব্যর্থতা বা ক্ষতি থেকে কোড ক্ষয় হওয়ার প্রবণতা। আইএমও, এটি সত্যিই কেবল খুব স্বল্পমেয়াদী ডাব্লুআইপি ব্যবহার করা উচিত। ছুটিতে যাওয়ার আগে একটি ডাব্লুআইপি কমিটিকে ভালবাসুন: পি .. একে ব্রেন ডাম্প কমিট বলুন!
εδιϲএম

উত্তর:


1616

এটি এর মতোই সহজ:

git reset HEAD^

দ্রষ্টব্য: কিছু শাঁস ^একটি বিশেষ চরিত্র হিসাবে বিবেচনা করে (উদাহরণস্বরূপ কিছু উইন্ডোজ শেল বা জেডএসএইচ গ্লোববিং সক্ষম ), যাতে আপনাকে "HEAD^"সেই ক্ষেত্রে উদ্ধৃতি দিতে হতে পারে ।

git resetকোনও ছাড়াই --hardবা কোনও ফাইল পরিবর্তন না করে নির্দিষ্ট প্রতিশ্রুতিতে --softআপনার দিকে HEADনির্দেশিত করে। HEAD^আপনার বর্তমান প্রতিশ্রুতি (প্রথম) পিতামাতার প্রতিশ্রুতি বোঝায়, যা আপনার ক্ষেত্রে অস্থায়ী করার আগে প্রতিশ্রুতিবদ্ধ।

নোট করুন যে অন্য একটি বিকল্পটি স্বাভাবিক হিসাবে চালানো এবং তারপরে পরবর্তী কমিট পয়েন্টে তার পরিবর্তে চালনা করুন:

git commit --amend [-m … etc]

যা পরিবর্তে উপরের মতো একই প্রভাব ফেলে সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি সম্পাদনা করবে ।

মনে রাখবেন যে আপনি যদি ইতিমধ্যে খারাপ প্রতিশ্রুতি এমন জায়গায় ঠেলে দেন যেখানে অন্য কেউ এটিকে এড়িয়ে চলেছে তবে এটি (প্রায় প্রতিটি গিট উত্তর হিসাবে) সমস্যার কারণ হতে পারে। তা এড়াতে চেষ্টা করুন


47
এটি এখন পর্যন্ত সহজতম, তবে আপনি যদি ইতিমধ্যে আপনার প্রতিশ্রুতিটিকে একটি প্রত্যন্তের দিকে ঠেলে দিয়ে থাকেন এবং অন্য কেউ এটি টানেন তবে আমি ক্ষমা প্রার্থনা করা ছাড়া কিছু করতে খুব দ্বিধা বোধ করব।
atw13

11
@ সিকোফ্রেনিক, এই উপলক্ষে "রিসেট ডেমাইসিফাইড" পড়ার সুযোগটি মিস করবেন না ।
kostix

33
আমি এটি করার More?পরে পেতে । এই প্রম্পটে আমি যা টাইপ করি তা আমাকে দেয়fatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
দাআউভেলিজপি

50
@ দাআউইউইলিজপি শোনায় আপনি এমন শেল ব্যবহার করছেন যা ^একটি বিশেষ চরিত্র হিসাবে বিবেচনা করে । আপনি হয় রেফারেন্সটি উদ্ধৃত করতে পারেন "HEAD^", বা বিকল্প বাক্য HEAD~1বিনা বাক্য ব্যবহার করতে পারেন
গ্যারেথ

8
আমার জন্য কাজ করেছেন, চরিত্রটি git reset HEAD\^
এড়িয়ে চলতে হয়েছিল

188

এটি পরিচালনা করার দুটি উপায় রয়েছে। কোনটি সহজ তা আপনার পরিস্থিতির উপর নির্ভর করে

রিসেট

আপনি যে প্রতিশ্রুতি থেকে মুক্তি পেতে চান তা হ'ল সর্বশেষ প্রতিশ্রুতি, এবং আপনি কেবলমাত্র ব্যবহার করতে পারেন এমন কোনও অতিরিক্ত কাজ করেন নি git-reset

git reset HEAD^

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

git config --global alias.uncommit 'reset HEAD^'

তারপরে আপনি git uncommitভবিষ্যতে একটি প্রতিশ্রুতি ব্যাক আপ করতে ব্যবহার করতে পারেন ।

স্কোয়াশ করা

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

git rebase -i <ref>

আমি উপরে বলেছি কারণ আমি এটি পরিষ্কার করতে চাই যে এটি কোনও সংখ্যক কমিট হতে পারে। git logআপনি যে প্রতিশ্রুতি থেকে মুক্তি পেতে চান তা চালান এবং এটির SHA1 অনুলিপি করুন এবং এটির জায়গায় ব্যবহার করুন <ref>। গিট আপনাকে ইন্টারেক্টিভ রিবেস মোডে নিয়ে যাবে। এটি আপনার বর্তমান অবস্থা এবং আপনি যা কিছু স্থাপন করেছেন তার মধ্যে সমস্ত চুক্তি প্রদর্শন করবে <ref>। সুতরাং যদি <ref>10 টি পূর্বে কমিট হয় তবে এটি আপনাকে 10 টি কমিট দেখাবে।

প্রতিটি প্রতিশ্রুতি সামনে, এটি শব্দ থাকবে pick। কমিট আপনি পরিত্রাণ পেতে এবং থেকে এটি পরিবর্তন করতে চান খুঁজুন pickকরতে fixupবা squash। ব্যবহার fixupকেবল পরিত্যাগ করে করে বার্তা এবং তালিকায় তার অবিলম্বে পূর্বসুরী মধ্যে পরিবর্তনগুলি সংমিশ্রণে খেলা হয়। squashশব্দ একই জিনিস আছে, কিন্তু আপনি সদ্য মিলিত কমিট বার্তা কমিট সম্পাদনা করতে দেয়।

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

সতর্কতা:

রিবেসিং ইতিহাস পরিবর্তন করে - আপনি ইতিমধ্যে অন্যান্য বিকাশকারীদের সাথে ভাগ করে নেওয়া কোনও কমিটের সাথে এটি করবেন না।

Stashing

ভবিষ্যতে, এই সমস্যাটি এড়াতে git stashঅস্থায়ীভাবে অনির্দিষ্ট কাজ সংরক্ষণ করার জন্য বিবেচনা করুন ।

git stash save 'some message'

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

আপনি আপনার স্ট্যাশ তালিকাটি এর সাথে ব্রাউজ করতে পারেন ...

git stash list

এটি আপনাকে আপনার সমস্ত স্ট্যাশাগুলি, কী শাখায় সেগুলি করা হয়েছিল, এবং বার্তাটি এবং প্রতিটি লাইনের শুরুতে এবং সেই স্ট্যাশটির জন্য সনাক্তকারী যা দেখায় stash@{#}যেখানে স্ট্যাশগুলির অ্যারেতে এটির অবস্থান #।

কোনও স্ট্যাশ পুনরুদ্ধার করতে (যা কোনও শাখায় করা যেতে পারে, স্ট্যাশ যেখানে মূলত তৈরি হয়েছিল তা নির্বিশেষে) আপনি কেবল চালান ...

git stash apply stash@{#}

আবার, স্ট্যাশগুলির অ্যারেতে # অবস্থান রয়েছে। আপনি যে স্ট্যাশ পুনরুদ্ধার করতে চান তা যদি সেই 0অবস্থানে থাকে - তবে এটি যদি সর্বাধিক সাম্প্রতিক স্ট্যাশ থাকে। তারপর আপনি শুধু লুকোবার জায়গা অবস্থান নির্দিষ্ট না করে কমান্ড চালাতে পারেন, Git অনুমান করবে গত এক বলতে চাইছেন: git stash apply

সুতরাং, উদাহরণস্বরূপ, যদি আমি নিজেকে ভুল শাখায় কাজ করতে দেখি - আমি নিম্নলিখিত কমান্ডের ক্রমটি চালাতে পারি।

git stash
git checkout <correct_branch>
git stash apply

আপনার ক্ষেত্রে আপনি আরও কিছু শাখাগুলি ঘুরেছেন তবে একই ধারণাটি এখনও প্রযোজ্য।

আশাকরি এটা সাহায্য করবে.


6
git config --global alias.uncommit reset HEAD^পুনরায় সেট করতে অসামান্য এলিয়াসগুলি। পরিবর্তে, নাgit config --global alias.uncommit 'reset HEAD^'
mernst

3
নোট করুন যে উইন্ডোজ কমান্ড প্রম্পট ব্যবহার করে আপনাকে of পরিবর্তে use ব্যবহার করতে হবে।
প্রমোদ বিআর

106

আমি মনে করি আপনি এটি খুঁজছেন

git reset --soft HEAD~1

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


7
ধন্যবাদ। এটি আমার পক্ষে কাজ করেছে। git reset HEAD^উইন্ডোজে কল করা কেবল "আরও কি?" - এর অর্থ যাই হোক না কেন
টায়রন

12
@ টায়রন ^ডস-এ একটি পালানোর চরিত্র। যখন একটি নতুন লাইনের সাথে যুক্ত করা হয়, এটি পূর্ববর্তী কমান্ডের একটি ধারাবাহিকতা প্রম্পট হিসাবে কাজ করে। টাইপিং git reset HEAD^^উইন্ডোজ কাজ করা উচিত।
trk

40

হ্যাঁ, আপনি পরিবর্তনগুলি মোছা ছাড়াই আপনার প্রতিশ্রুতি মুছতে পারেন: গিট রিসেট @ ~ ~


7
এটি সত্যই আমি চাই এবং এটি আমার মতে গৃহীত উত্তর হবে, দুর্দান্ত ধন্যবাদ!
কার্লোস লিউ

2
আকর্ষণীয়, কমপ্যাক্ট বাক্য গঠন, আমি এর আগে এটি ব্যবহার করি নি। কীভাবে git reset --softবা এর থেকে আলাদা git reset --keep?
ব্যবহারকারী 776686

18

আপনি হয় git reset HEAD^ --softবা খুঁজছেন git reset HEAD^ --mixed

রিসেট কমান্ড হিসাবে বিবৃত 3 মোড আছে ডক্স :

git reset HEAD^ --soft

পূর্বাবস্থা git commit। কার্যকারী গাছ (প্রকল্পের ফোল্ডার) -এ এখনও পরিবর্তনগুলি বিদ্যমান রয়েছে + সূচক (--যুক্ত)

git reset HEAD^ --mixed

পূর্বাবস্থা git commit+ git add। কাজের গাছটিতে এখনও পরিবর্তন রয়েছে

git reset HEAD^ --hard

আপনি কখনও কোডবেসে এই পরিবর্তনগুলি করেন নি। কার্যকারী গাছ থেকে পরিবর্তনগুলি চলে গেছে।


9

যারা zsh ব্যবহার করছেন তাদের জন্য আপনাকে নিম্নলিখিতগুলি ব্যবহার করতে হবে:

git reset --soft HEAD\^

এখানে ব্যাখ্যা করা হয়েছে: https://github.com/robbyrussell/oh-my-zsh/issues/449

যদি ইউআরএল মারা যায় তবে গুরুত্বপূর্ণ অংশটি হ'ল:

আপনার কমান্ডে Escape এড়িয়ে চলুন

আপনি বিকল্পভাবে হেড ব্যবহার করতে পারেন ~ যাতে আপনাকে প্রতিবার এড়াতে হবে না।


15
আমি এই আদেশটি কখনই মনে করতে পারি না এবং এটি গুগল করতে এবং নিজের উত্তরটি খুঁজতে হবে হাহাহাহা
গ্রেগ হিলস্টন

2
git reset HEAD^আমার জন্য zsh এ কাজ করছে, ঠিক হয়ে গেছে।
বেন কল্যা ম্যানসলে

@ বেনকোল্যা ম্যানসলে আপনি zsh এর কোন সংস্করণটি চালাচ্ছেন?
গ্রেগ হিলস্টন

আমি ব্যবহার করছিzsh 5.3 (x86_64-apple-darwin18.0)
বেন কল্যা ম্যানসলে

7

আমার ক্ষেত্রে, আমি ইতিমধ্যে রেপোতে ধাক্কা দিয়েছি। সেকি!

আপনার স্থানীয় ফাইলগুলিতে পরিবর্তনগুলি রেখে আপনি একটি নির্দিষ্ট প্রতিশ্রুতি ফিরিয়ে দিতে পারেন:

git revert -n <sha>

এইভাবে আমি আমার প্রয়োজনীয় পরিবর্তনগুলি রাখতে সক্ষম হয়েছি এবং এমন প্রতিশ্রুতি পূর্ন করতে পেরেছি যা ইতিমধ্যে ঠেলে দেওয়া হয়েছিল।


আমার ক্ষেত্রে, আমি ইতিমধ্যে দূরবর্তী সংগ্রহস্থলটিতে ধাক্কা খেয়েছে এমন কিছু আবার ফিরিয়ে আনা দরকার ছিল। আরও আউট! সর্বোত্তম উপায়টি ছিল git revert bad-commit-shaতখন git revert -n revert-commit-just-created-shaএবং সেখান থেকে মেরামত করা। আপনি অর্ধেক আমাকে পেয়েছেন। ধন্যবাদ!
টিঙ্কারটেনারসফটওয়্যারগুই

এই কি মনে হয় বিপরীত না, না? এটি নতুন পরিবর্তনগুলি তৈরি করে যা নির্বাচিত প্রতিশ্রুতি অনুসারে পরিবর্তিত পরিবর্তনের সাথে মিলে যায়। আপনি যদি এই নতুন পরিবর্তনগুলি সম্পাদন করতে চান তবে আপনি যে কাজটি করতে চান তা আপনি পূর্বাবস্থায় ফিরিয়ে আনতে পারবেন।
সাব্যস্ত করে

3

গিট ২.৯ ব্যবহার করে (নিখুঁতভাবে ২.৯.২. উইন্ডোজ .১) git reset HEAD^আরও জিজ্ঞাসা করা হয় ; নিশ্চিত না কি এখানে প্রত্যাশিত ইনপুট। স্ক্রিনশট নীচে উল্লেখ করুন

এখানে চিত্র বর্ণনা লিখুন

git reset HEAD~#numberOfCommitsআপনার পরিবর্তনগুলি অক্ষত রেখে আপনি পুনরায় সেট করতে চান এমন স্থানীয় কমিটের সংখ্যা নির্বাচন করতে আমরা এটি ব্যবহার করে এমন কোনও সমাধান খুঁজে পেয়েছি । সুতরাং, আমরা সমস্ত স্থানীয় কমিট পাশাপাশি সীমিত সংখ্যক স্থানীয় কমিটকে ফেলে দেওয়ার সুযোগ পাই।

স্ক্রিনশটগুলি git reset HEAD~1ক্রিয়াকলাপে দেখানো নীচে দেখুন : এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


আপনার সম্ভবত ^ চরিত্রটি থেকে বাঁচতে হবে - গিট রিসেট "HEAD ^" চেষ্টা করুন বা গিট রিসেট করুন হেড \ ^
মার্ক ফিশার

এটি যুক্ত করে, গিট রিসেট হেড AD একক হিসাবে কাজ করে a এটি একটি নতুন লাইন হিসাবে বিবেচিত হয়।
জন ওস

2

এটি করার আরও একটি উপায়।

অস্থায়ী প্রতিশ্রুতি শীর্ষে অঙ্গীকার যুক্ত করুন এবং তারপরে:

git rebase -i

দুটি কমিটিকে একটিতে মার্জ করার জন্য (কমান্ড স্পষ্ট নির্দেশাবলীর সাথে পাঠ্য ফাইলটি খুলবে, এটি সম্পাদনা করবে)।


2
প্রযুক্তিগতভাবে সঠিক তবে সহজ করার মতো মার্জিত আর কোথাও নেই git reset HEAD^। গিট রিবেজে এখানে ত্রুটির জন্য প্রচুর জায়গা রয়েছে।
দ্য বজসউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.