স্থানীয় প্রতিশ্রুতি দেওয়ার পরে আমি কীভাবে আমার ফাইলগুলি পুনরায় আনস্টেজ করতে পারি?


268

আমি নিম্নলিখিত কমান্ড কার্যকর করেছি

git add <foo.java>
git commit -m "add the foo.java file"

আমি কীভাবে এখন আমার স্থানীয় প্রতিশ্রুতি মুছে ফেলতে পারি এবং foo.java আনস্টেজ করতে পারি?

যদি আমি টাইপ git reset --hardকরি তবে আমি দেখতে পেলাম যে এটি আমার সংশোধিত মূলটিকে আবার পরিবর্তন foo.javaকরে।

উত্তর:


451

git reset --soft HEAD~1আপনি যা চান তা করা উচিত এর পরে, আপনার সূচীতে প্রথম পরিবর্তন হবে (এর সাথে দৃশ্যমান git diff --cached) এবং আপনার সর্বশেষ পরিবর্তনগুলি মঞ্চস্থ হবে না। git statusএরপরেও এর মতো দেখতে পাবেন:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.java
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.java
#

তারপরে আপনি git add foo.javaএকই সাথে উভয় পরিবর্তন করতে এবং প্রতিশ্রুতিবদ্ধ করতে পারেন ।


আমি উত্তরটি সম্পাদনা করেছি: "প্রতিশ্রুতিবদ্ধ হওয়ার পরিবর্তনগুলির" মধ্যে প্রথম পরিবর্তন আছে এবং "পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হওয়ার জন্য মঞ্চস্থ হয় না" দ্বিতীয় পরিবর্তন রয়েছে।
অ্যান্টি

4
এই উত্তরে যা বর্ণিত হয়েছে তা আসলে কী git commit --amendহয়; তবে আরও অনেক জটিল কর্মপ্রবাহের সাথে। একটি ভাল দিকনির্দেশনা ( git reset) দেওয়ার পরেও ওপি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না ।
7heo.tk

2
এটির কাজ করতে '^' কে '' 'দিয়ে প্রতিস্থাপন করতে হয়েছিল, তাই দেখে মনে হচ্ছে:git reset --soft HEAD~
শাহার

3
গিট রিসেট করুন - সাফ হেড ~ 1 এর পরে গিট রিসেট হেড করুন
জোকো ওয়ান্ডিরো

আমি যা চাই তার নিখুঁত উত্তর!
ডিপআইএনজাভা

78

ব্যবহার করুন:

git reset HEAD^

এটি একটি "মিশ্র" ডিফল্টরূপে পুনরায় সেট করে, যা আপনি যা চান তা করবে; খুব সাম্প্রতিক প্রতিশ্রুতি অপসারণ করে অস্টেজ করে foo.java রাখুন।


2
"মিশ্র" রিসেট, "নরম" রিসেট এবং "হার্ড" রিসেট কী তা আমাকে বোঝাতে আপত্তি করবেন?
কিট হো

1
@ কিট হো - গিট রিসেট ম্যানুয়ালটিতে এগুলির দুর্দান্ত বিবরণ রয়েছে।
মানোজাল্ড

4
@Kit, @manojlds: তাই না stackoverflow.com/questions/2530060/... (লজ্জাহীন প্লাগ)
Cascabel

5
এটি আসলে একমাত্র সঠিক উত্তর। অন্য দুটি উত্তর কমিট করার পরে ফাইলগুলি আবার মঞ্চস্থ করবে ।
7heo.tk

git reset --softকাজ করেনি, তবে git reset HEAD^করেছে
শব্দচেতনা

43

আমার কাছে, নিম্নলিখিতটি আরও বেশি পঠনযোগ্য (এটি পছন্দনীয়) উপায়:

git reset HEAD~1

পরিবর্তে 1, আপনি আনস্টেজ করতে চান এমন অনেকগুলি কমিট থাকতে পারে।


39

git reset --softএটি কেবল তার জন্য: এটির মতো git reset --hard, তবে ফাইলগুলিকে স্পর্শ করে না।


4
এটি আমি এখনও শুনেছি সবচেয়ে সহজেই বোধগম্য ব্যাখ্যা (কেবল 11 শব্দেই)! ধন্যবাদ!
ফ্রেইকহেড

3
উত্তরটি ভুল। git reset"এর মত git reset --hardতবে ফাইলগুলিকে স্পর্শ করে না"। না git reset --softgit reset --softপরিবর্তনগুলি মঞ্চস্থ করবে, সুতরাং আপনি যদি তাদের প্রতিশ্রুতিবদ্ধ হতে চান তবে আপনাকে সেগুলি মঞ্চে যুক্ত করতে হবে না, তবে আপনি যদি তা না করেন তবে আপনাকে git resetতাদের (হ্যাঁ, দ্বিতীয়বার এবং ছাড়া --soft) থাকতে হবে। সুতরাং উত্তরটি সংক্ষিপ্ত, তবে ভুল।
7heo.tk

12

আপনার শেষ প্রতিশ্রুতিতে সমস্ত ফাইল আনস্টেজ করার জন্য -

git reset HEAD~


8

"রিসেট" স্থানীয়ভাবে পরিবর্তনগুলি পূর্বাবস্থায় ফেলার উপায়। প্রতিশ্রুতিবদ্ধ হওয়ার সময়, আপনি প্রথমে " গিট অ্যাড " - এর নামে পরিচিত "স্টেজেজিং" এর সাথে অন্তর্ভুক্ত করতে পরিবর্তনগুলি নির্বাচন করুন । এবং একবার পরিবর্তনগুলি মঞ্চস্থ করার পরে আপনি তাদের " গিট কমিট " করুন।

মঞ্চ বা প্রতিশ্রুতিবদ্ধতা থেকে ব্যাক আউট করতে, আপনি হেডকে "রিসেট" করেন। একটি শাখায়, হেড হ'ল একটি গিট ভেরিয়েবল যা সাম্প্রতিক প্রতিশ্রুতিতে নির্দেশ করে। সুতরাং আপনি যদি মঞ্চস্থ হন তবে প্রতিশ্রুতিবদ্ধ না হন, আপনি " গিট পুনরায় সেট করুন ।" যা মঞ্চ থেকে পরিবর্তন নিয়ে বর্তমান হেডের ব্যাক আপ করে। এটা তোলে এর জন্য সাধারণভাবে সংক্ষেপে " Git রিসেট মস্তক ~ 0 --mixed ।"

যদি আপনি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ থাকেন তবে শিরোনাম ইতিমধ্যে উন্নত হয়ে গেছে, সুতরাং আপনার পূর্ববর্তী প্রতিশ্রুতিতে ব্যাক আপ নেওয়া দরকার। এখানে আপনি " HEAD ~ 1 পুনরায় সেট করুন " বা " পুনরায় সেট করুন HEAD ^ 1 " বা " পুনরায় সেট করুন HEAD ~ " বা " পুনরায় সেট করুন HEAD ^ " - সমস্ত রেফারেন্স হেড বিয়োগকে এক।

এর চেয়ে ভাল প্রতীক কোনটি, ~ বা ^? ~ টিলডিকে একটি একক ধারা হিসাবে ভাবুন - যখন প্রতিটি প্রতিশ্রুতির একক পিতা বা মাতা থাকে এবং এটি কেবল ধারাবাহিকভাবে পরিবর্তনের একটি সিরিজ হয়, তখন আপনি টিলড ব্যবহার করে স্ট্রিমটির ব্যাক আপ নিতে পারেন, হেড ~ 1, হেড ~ 2, হেড হিসাবে ~ 3, পিতা বা মাতা, পিতামহ, মহান-পিতামহ, ইত্যাদি জন্য (টেকনিক্যালি এটা খোঁজার এর প্রথম পূর্ববর্তী প্রজন্মে পিতা বা মাতা)।

যখন একত্রীকরণ আছে, তখন কমিটদের একাধিক পিতামাতারা থাকে। ^ ক্যারেটটি খেলায় আসলে - আপনি মনে করতে পারেন কারণ এটি শাখাগুলি একত্রিত করে দেখায়। ক্যারেটটি ব্যবহার করে, হেড ^ 1 হ'ল প্রথম পিতা-মাতা এবং হেড ^ 2 হবেন একক প্রতিশ্রুতির দ্বিতীয় পিতা - মাতা এবং পিতা for

সুতরাং আপনি যদি কেবলমাত্র একক-পিতা-মাতার প্রতিশ্রুতিতে একটি হপ পিছনে ফিরে যাচ্ছেন, তবে শিরোনাম ~ এবং শিরোনাম equivalent সমান - আপনি যে কোনও একটি ব্যবহার করতে পারেন।

এছাড়াও, রিসেট করা যাবে --soft , --mixed , অথবা --hard । একটি সফট রিসেট কেবল কমিটিকে ব্যাক করে দেয় - এটি হেডকে পুনরায় সেট করে, তবে এটি পূর্বের প্রতিশ্রুতি থেকে ফাইলগুলি চেক করে না, সুতরাং কার্যকরী ডিরেক্টরিতে সমস্ত পরিবর্তনগুলি সংরক্ষিত আছে। এবং - সফ্ট রিসেট এমনকি মঞ্চটি সাফ করে না ( সূচক হিসাবেও পরিচিত ), সুতরাং মঞ্চ করা সমস্ত ফাইল এখনও মঞ্চে থাকবে।

একটি - মিক্সড রিসেট (ডিফল্ট) পূর্ববর্তী প্রতিশ্রুতি থেকে ফাইলগুলিও পরীক্ষা করে না, সুতরাং সমস্ত পরিবর্তনগুলি সংরক্ষণ করা হয়, তবে পর্যায়টি সাফ হয়ে যায়। এজন্য একটি সাধারণ " গিট রিসেট হেড " মঞ্চটি সরিয়ে ফেলবে।

--হার্ড রিসেটটি হেডের পুনরায় সেট করে, এবং এটি মঞ্চটি সাফ করে, তবে এটি পূর্বের প্রতিশ্রুতি থেকে সমস্ত ফাইলও পরীক্ষা করে এবং তাই এটি কোনও পরিবর্তনকে ওভাররাইট করে।

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

অন্যথা, আপনি করতে পারেন লুকিয়ে আপনার পরিবর্তনগুলি আপনি তাদের রাখা, চান তাহলে খুঁজে বার করো আগের কমিট, পরিবর্তন আন-লুকিয়ে, মঞ্চ তাদের তৈরি একটি নতুন কমিট, এবং তারপর যে ধাক্কা।


অপারেশনের বিশদ ব্যাখ্যার জন্য +1। আইএমওর এই গ্রহণযোগ্য উত্তর হওয়া উচিত!
আইএসএই

2

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

যেখানে কমিট হ্যাশগুলি নিম্নরূপ:

  • H1
  • এইচ 2 ...
  • HN
  • HN +1

তারপরে নিম্নলিখিত কমান্ডটি চালান:
git reset hn

এখন এইচএইচডি হবে এইচএন +1 এ। এইচ 1 থেকে এইচএন থেকে পরিবর্তনগুলি অস্টেজ করা হবে।

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