গিট রিসেট - মিক্সড, - সাফ্ট এবং --হার্ডের মধ্যে পার্থক্য কী?


740

আমি একটি প্রতিশ্রুতি বিভক্ত করার চেষ্টা করছি এবং কোন রিসেট বিকল্পটি ব্যবহার করবেন তা নিশ্চিত নই।

আমি পৃষ্ঠাটি সরল ইংরেজিতে দেখছিলাম, "গিট রিসেট" কী করবে? , কিন্তু আমি বুঝতে পেরেছি যে গিট সূচক বা মঞ্চের ক্ষেত্রটি কী তা আমি সত্যিই বুঝতে পারি না এবং সুতরাং ব্যাখ্যাগুলি সাহায্য করে না।

এছাড়াও, জন্য ব্যবহারের ক্ষেত্রে --mixedএবং --softএকই আমাকে যে উত্তর দেখুন (যখন আপনি ঠিক করে পেশ করতে চান)। কেউ কি এটিকে আরও ভেঙে দিতে পারে? আমি বুঝতে পারি --mixedসম্ভবত এটির সাথে যাওয়ার বিকল্প, তবে কেন তা জানতে চাই । শেষ অবধি, কি হবে --hard?

3 টি অপশন নির্বাচন করা কীভাবে ঘটতে পারে সে সম্পর্কে কেউ আমাকে একটি ওয়ার্কফ্লো উদাহরণ দিতে পারেন?


1
আমি এই উত্তরটিতে আমার উত্তরটি সম্পাদনা করতে যাব এবং চেষ্টা করুন এবং আরও কিছুটা পরিষ্কার করুন।
ক্যাসকেবেল

@ মকরাসেকের উত্তরটি বেশ ভাল তবে এই প্রশ্নটি একবার দেখে নিতে আগ্রহী হতে পারে ।
ব্র্যান্ডজিজি

3
নিজের জন্য নোট: সাধারণভাবে , soft: stage everything, mixed: unstage everything, hard: ignore everythingকমিট পর্যন্ত আমি থেকে রিসেট করছি।
ব্যবহারকারী 1164937


David Zychস্পষ্ট ব্যাখ্যা সহ আরও একটি ভাল নিবন্ধ - davidzych.com/differences-between-git-reset-soft-mixed- and
hard

উত্তর:


1486

আপনি যখন আপনার সংগ্রহস্থলটিতে কোনও ফাইল পরিবর্তন করেন, পরিবর্তনটি প্রথমে অযৌক্তিক হয়। এটি প্রতিশ্রুতিবদ্ধ করার জন্য, আপনাকে অবশ্যই এটি মঞ্চ করতে হবে - এটি ব্যবহার করে এটি সূচিতে যুক্ত করুন git add। আপনি যখন কোন অঙ্গীকারবদ্ধ হন, তখন যে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হয় সেগুলি হ'ল সূচকগুলিতে যুক্ত করা হয়েছে।

git resetপরিবর্তনগুলি, সর্বনিম্ন, যেখানে বর্তমান শাখা ( HEAD) নির্দেশ করছে। মধ্যে পার্থক্য --mixedএবং --softথাকুক বা না থাকুক আপনার সূচক এছাড়াও পরিবর্তিত হয়। সুতরাং, আমরা যদি masterএই ধারাবাহিক প্রতিশ্রুতি সহ শাখায় থাকি :

- A - B - C (master)

HEADপয়েন্ট Cএবং সূচক মেলে C

যখন আমরা দৌড়ে যাই git reset --soft B, master(এবং এইভাবে HEAD) এখন নির্দেশ করে B, তবে সূচকের এখনও পরিবর্তন রয়েছে C; git statusমঞ্চ হিসাবে তাদের প্রদর্শন করবে। সুতরাং আমরা যদি git commitএই মুহূর্তে চালানো , আমরা একই পরিবর্তন সঙ্গে একটি নতুন অঙ্গীকার পাবেন C


ঠিক আছে, তাই আবার এখান থেকে শুরু:

- A - B - C (master)

এখন করা যাক git reset --mixed B। (দ্রষ্টব্য: --mixedডিফল্ট বিকল্প)। আবার, masterএবং HEADবি নির্দেশ করুন, কিন্তু এবার সূচকটিও মেলানোর জন্য পরিবর্তন করা হয়েছে B। আমরা যদি git commitএই মুহুর্তে চালিয়ে যাই তবে সূচি ম্যাচ হওয়ার পরে কিছুই হবে না HEAD। আমাদের এখনও ওয়ার্কিং ডিরেক্টরিতে পরিবর্তন রয়েছে, তবে যেহেতু তারা সূচকে নেই, git statusএগুলি অচিহ্নিত হিসাবে দেখায়। তাদের প্রতিশ্রুতিবদ্ধ হওয়ার জন্য, আপনি git addএবং তারপরে যথারীতি প্রতিশ্রুতিবদ্ধ।


এবং পরিশেষে, --hardএটি একইরূপে --mixed(এটি আপনার HEADএবং সূচককে পরিবর্তন করে ) ব্যতীত এটি --hardআপনার কার্য-ডিরেক্টরিকেও পরিবর্তন করে। যদি আমরা এখানে থাকি Cএবং চালিত হই git reset --hard B, তবে এতে যুক্ত হওয়া পরিবর্তনগুলি Cপাশাপাশি আপনার যে কোনও অনিচ্ছাকৃত পরিবর্তনগুলি অপসারণ করা হবে এবং আপনার কার্যকরী অনুলিপিতে থাকা ফাইলগুলি কমিটের সাথে মেলে B। যেহেতু আপনি স্থায়ীভাবে এইভাবে পরিবর্তনগুলি হারাতে পারেন, তাই git statusআপনার কার্য ডিরেক্টরিটি পরিষ্কার কিনা তা নিশ্চিত করার জন্য আপনার হার্ড রিসেট করার আগে সর্বদা চালানো উচিত বা আপনার অনির্ধারিত পরিবর্তনগুলি হারাতে আপনি ঠিক আছেন।


এবং অবশেষে, একটি দৃশ্যায়ন: এখানে চিত্র বর্ণনা লিখুন


43
অন্য কথায়, --সোফট সর্বশেষ কমিটকে ছাড়ছে, - মিক্স সর্বশেষ কমিটকে ছাড়ছে এবং যুক্ত করছে
জেমস ওয়াং

11
@EventualEntropy আপনি রিফলগের মাধ্যমে যে কোনও প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি পুনরুদ্ধার করতে পারবেন ; নিরক্ষিত পরিবর্তনগুলি যা দিয়ে মুছে ফেলা reset --hardহয় তা চিরতরে চলে যায়।
মকরাসেক

2
@ রবার্ট না; --mixedআপনার সূচক পরিবর্তন করে তবে আপনার কার্যনির্বাহী ডিরেক্টরিটি পরিবর্তন করে না, তাই কোনও স্থানীয় পরিবর্তনগুলি প্রভাবিত হয় না।
মকরাসেক

3
রঙের সাথে টার্মিনালে গিট ব্যবহারকারী ভিজ্যুয়াল লোকেদের জন্য সহায়ক হতে পারে: 1.'গিট রিসেট --সফট এ 'এবং আপনি বি এবং সি এর স্টাফ সবুজ দেখতে পাবেন (স্টেজড) ২.' গিট রিসেট - মিক্সড এ 'এবং আপনি পাবেন বি এবং সি এর স্টাফগুলি লাল (অচঞ্চলিত) দেখুন'.'গিট রিসেট - হ'ল এ 'এবং আপনি আর কোথাও বি এবং সি এর পরিবর্তনগুলি দেখতে পাবেন না (এমন হবে যেন তারা কখনও উপস্থিত ছিল না)
তিমাহ 2222

2
@ user1933930 1 এবং 3 আপনাকে ছেড়ে যাবে - A - B - C′, যেখানে সি C তে সি হিসাবে একই পরিবর্তন রয়েছে (বিভিন্ন টাইমস্ট্যাম্প এবং সম্ভবত প্রতিশ্রুতিবদ্ধ বার্তা সহ)। 2 এবং 4 আপনাকে ছেড়ে চলে যাবে - A - D, যেখানে ডি এবং বি এবং সি এর সম্মিলিত পরিবর্তন রয়েছে
মকরাসেক

213

সহজ শর্তে:

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

8
সেরা উত্তর কারণ উত্তরটি একটি সম্পূর্ণ উত্তর প্রদান করতে প্রযুক্তিগত শর্তাদি ব্যবহার করে যা সবচেয়ে সংক্ষিপ্তও
ট্রেভর বয়েড স্মিথ

1
আমি যখন একটি ফাইল প্রতিশ্রুতিবদ্ধ (আনপশড) করেছি এবং আমার একটি নতুন তৈরি করা তালাবিহীন ফাইল আছে, তখন গিট রিসেট --হার্ড কিছুই করে না? আমি যখন তালিকার চিহ্নবিহীন ফাইলটি স্টেজ করি কেবল তখনই এটি আমার ওয়ার্কিং ডিরেক্টরি থেকে সরিয়ে দেয়।
মাইকেল 21

1
@ নিখিল আপনি উত্তর দিতে পারেন যেখানে এই উত্তরটি ভুল?
নেড ব্যাচেল্ডার

1
@ নেডব্যাচেল্ডার বিন্দুগুলির কোনওটিই সঠিক নয়: যখন এই কমান্ডগুলি ব্যবহার করা হয় তখন অসমাপ্ত কখনও হয় না।
নিখিল

1
@ নিখিল সম্ভবত আপনার অর্থটি হ'ল আসল প্রতিশ্রুতি এখনও বিদ্যমান, যা সত্য। কিন্তু শাখাটি পরিবর্তন করা হয়েছে যাতে প্রতিশ্রুতিবদ্ধতা আর শাখার অংশ না হয়। আমরা কি তাতে একমত?
নেড ব্যাচেল্ডার

69

দয়া করে সচেতন হন, এই জটিল কার্যকারিতাটি বোঝার জন্য এটি প্রথম পদক্ষেপ হিসাবে লক্ষ্য করা একটি সরল ব্যাখ্যা।

এই ভিজ্যুয়াল শিখার জন্য সহায়ক হতে পারে যারা এই প্রকল্পের প্রতিটি আদেশের পরে তাদের প্রকল্পের অবস্থা কেমন দেখতে ভিজ্যুয়ালাইজ করতে চায়:


যারা রঙ দিয়ে টার্মিনাল ব্যবহার করেন তাদের জন্য (গিট কনফিগারেশন - গ্লোবাল রঙ.উই অটো):

git reset --soft A এবং আপনি সবুজ বি এবং সি এর স্টাফ দেখতে পাবেন (মঞ্চযুক্ত এবং প্রতিশ্রুতিবদ্ধ প্রস্তুত)

git reset --mixed A(বা git reset A) এবং আপনি বি এবং সি এর স্টাডগুলিকে লাল রঙে দেখতে পাবেন (আনস্টেজড এবং স্টেজ করার জন্য প্রস্তুত (সবুজ) এবং তারপরে প্রতিশ্রুতিবদ্ধ)

git reset --hard A এবং আপনি আর কোথাও বি এবং সি এর পরিবর্তনগুলি দেখতে পাবেন না (এমন হবে যেন তারা কখনও অস্তিত্ব রাখে না)


বা যারা 'টাওয়ার' বা 'সোর্সট্রি'র মতো জিইউআই প্রোগ্রাম ব্যবহার করেন তাদের জন্য

git reset --soft A এবং আপনি বি এবং সি এর স্টাফগুলি দেখতে পাবেন 'স্টেজড ফাইল' এরিয়াতে প্রতিশ্রুতি দেওয়ার জন্য প্রস্তুত area

git reset --mixed A(বা git reset A) এবং আপনি 'স্টেস্টেড না হওয়া ফাইল' অঞ্চলে বি এবং সি এর স্টাফ দেখতে পাবেন মঞ্চে স্থানান্তরিত করার জন্য প্রস্তুত এবং তারপরে প্রতিশ্রুতিবদ্ধ

git reset --hard A এবং আপনি আর কোথাও বি এবং সি এর পরিবর্তনগুলি দেখতে পাবেন না (এমন হবে যেন তারা কখনও অস্তিত্ব রাখে না)


1
এটি সর্বোপরি বিভ্রান্তিকর: আপনার উত্তরটি এমনভাবে পড়ে যা git resetকেবলমাত্র git statusআউটপুটটির চেহারা পরিবর্তন করে ।
jub0bs

3
আমি আপনার বক্তব্যটি দেখছি, তবে একমত নই কারণ ভিজ্যুয়াল লার্নার হিসাবে আমার প্রকল্পটি 3 টি কমান্ড ব্যবহার করার পরে কীভাবে 'দেখছিল' তা দেখে তারা কী করছে তা বুঝতে সাহায্য করেছিল!
tihc22

মানুষকে বাস্তবে যা ঘটছে তাতে স্বাচ্ছন্দ্য বজায় রাখতে আমি এটিকে 'ডামিদের জন্য গিট' ধরণের ধারণা আরও দেখতে পেয়েছি। আপনি কীভাবে এটির উন্নতি হতে পারে যাতে ভ্রান্ত না হয় সে সম্পর্কে কী ভাবতে পারেন
timhc22

8
না, আমাদের এই উত্তরটি পরিবর্তন করার দরকার নেই। এটি একটি সহজ "চিট শীট" সরবরাহ করে। এটি সম্পর্কে ভাবুন: নরম = সবুজ, মিশ্রিত = লাল, শক্ত = কিছুই (মানে গেছে)! মনে রাখা কত সহজ! এই নবজাতক যারা তাদের রঙের প্রকৃত অর্থ কী তা বুঝতে পারেন না, তারা গিট সম্পর্কে খুব কম জানেন এবং তারা যে কোনও উপায়ে রাস্তা থেকে কঠোর শিক্ষা নিতে চলেছেন, এবং এটি @ungma এর দোষ নয়! বিটিডাব্লু, আমি আগের উত্তরটিকে প্রতিহত করার জন্য এই উত্তরটিকে সরিয়ে নিয়েছি ote ভাল কাজ, @ ইউনেগমা!
রায়লুও

5
আমি অন্য কোথাও সেগুলি পড়ার সাথে সাথে অভ্যন্তরীণ কাজগুলি আরও ভালভাবে বোঝার জন্য এটি দুর্দান্ত পরিপূরক সংক্ষিপ্তসার হিসাবে কাজ করেছে। ধন্যবাদ!
স্পেকস

24

অন্যান্য সমস্ত উত্তর মহান, কিন্তু আমি এটা ভাল নিচে তিনটি শ্রেণীতে ফাইল ভঙ্গ তাদের বুঝতে খুঁজে পেয়েছেন: unstaged, staged, commit:

  • --hard বুঝতে সহজ হওয়া উচিত, এটি সবকিছু পুনরুদ্ধার করে
  • --mixed (ডিফল্ট) :
    1. unstagedফাইল: পরিবর্তন করবেন না
    2. staged ফাইল: সরান unstaged
    3. commit ফাইল: সরান unstaged
  • --soft:
    1. unstagedফাইল: পরিবর্তন করবেন না
    2. stagedফাইল: পরিবর্তন না
    3. commit ফাইল: সরান staged

সংক্ষেপে:

  • --softবিকল্পটি সমস্ত কিছু ( unstagedফাইল ব্যতীত ) এ সরিয়ে ফেলবেstaging area
  • --mixed বিকল্প সব কিছু সরানো হবে unstaged area

22

TortoiseGit ব্যবহারকারীদের জন্য এখানে একটি প্রাথমিক ব্যাখ্যা:

git reset --softএবং --mixedআপনার ফাইলগুলি অচ্ছুত রেখে দিন।

git reset --hardআপনি যে রিটেটেডটিতে প্রতিশ্রুতি দিয়েছেন তার সাথে মিল রাখতে আসলে আপনার ফাইলগুলি পরিবর্তন করুন

কচ্ছপবিশেষে, সূচকের ধারণাটি জিইউআই খুব লুকিয়ে আছে। আপনি যখন কোনও ফাইল পরিবর্তন করেন, আপনাকে git addস্টেজিং এরিয়া / ইনডেক্সে পরিবর্তন যুক্ত করতে দৌড়াতে হবে না । যখন কেবল বিদ্যমান ফাইলগুলিতে পরিবর্তনগুলির সাথে ডিল করা হয় যা ফাইলের নাম পরিবর্তন করে না git reset --softএবং --mixedএকই রকম হয়! আপনি যদি নতুন ফাইল যুক্ত করেছেন বা ফাইলগুলির নাম পরিবর্তন করেছেন তবে আপনি কেবলমাত্র একটি পার্থক্য লক্ষ্য করবেন। এই ক্ষেত্রে, যদি আপনি গিট রিসেট - মিক্সড চালনা করেন তবে আপনাকে সংস্করণ নয় ফাইল তালিকা থেকে আপনার ফাইলগুলি পুনরায় যুক্ত করতে হবে ।


এই উত্তরটি খুব স্পষ্ট নয় নরম এবং মিশ্রের মধ্যে পার্থক্য। এমনকি এটি জানাতেও খারিজ হয়ে যায়। এই নিম্নলিখিত উত্তর যে এটি আরও স্পষ্ট। stackoverflow.com/questions/2530060/...
barlop

2
গিটহাব ডেস্কটপের একটি ব্যবহারকারী যা একই আচরণ করল, এই উত্তর কেন আমায় আমি বিভ্রান্ত রাখা কিছু স্বচ্ছতা দেয় --mixedএবং --soft
চেন লি ইওং

20

এই ক্ষেত্রে আমি একটি চাক্ষুষ পছন্দ করি যা আশা করে এটি ব্যাখ্যা করতে পারে:

git reset --[hard/mixed/soft] :

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

সুতরাং প্রতিটি প্রভাব বিভিন্ন স্কোপ

  1. হার্ড => ওয়ার্কিংডির + ইনডেক্স + হেড
  2. মিশ্র => সূচক + হেড
  3. নরম => কেবলমাত্র শিরোনাম (সূচক এবং কার্যকরী ডির অপরিবর্তিত)।

15

তিন ধরণের আক্ষেপ

প্রচুর বিদ্যমান উত্তরগুলি আসল প্রশ্নের উত্তর বলে মনে হচ্ছে না। তারা কমান্ডগুলি কী করে তা সম্পর্কে, আপনি (ব্যবহারকারী) কী চান - ব্যবহারের ক্ষেত্রে তা নয় । তবে ওপি এমনটাই জিজ্ঞাসা করেছিল!

বিবরণটি যথাযথভাবে কীভাবে আপনি একটি আদেশ দেওয়ার সময় অনুশোচনা করেছেন তা বিবেচনা করতে আরও সহায়ক হতে পারে git reset। ধরা যাক আমাদের এটি আছে:

A - B - C - D <- HEAD

এখানে কিছু সম্ভাব্য অনুশোচনা এবং সেগুলি সম্পর্কে কী করবেন:

1. আমি আক্ষেপ করছি যে বি, সি এবং ডি একটি প্রতিশ্রুতিবদ্ধ নয়।

git reset --soft A। আমি এখন অবিলম্বে কমিট করতে পারেন এবং প্রবঁচনাময়, সমস্ত একটি যেহেতু পরিবর্তন হয় এক কমিট।

২. আমি দুঃখিত যে বি, সি এবং ডি দশটি কমিট নয়।

git reset --mixed A। কমিটগুলি শেষ হয়ে গেছে এবং সূচকটি এ এ ফিরে এসেছে, তবে কাজের ক্ষেত্রটি এখনও ডি এর পরে যেমনটি দেখায় তাই এখন আমি সম্পূর্ণ আলাদা গ্রুপিংয়ে যুক্ত এবং প্রতিশ্রুতিবদ্ধ করতে পারি।

৩. আমি দুঃখিত যে বি, সি এবং ডি এই শাখায় ঘটেছিল ; আমি চাই আমি A এর পরে শাখা করি এবং সেগুলি অন্য শাখায় ঘটেছিল।

একটি নতুন শাখা তৈরি করুন otherbranch, এবং তারপর git reset --hard A। বর্তমান শাখাটি এখন এ-তে শেষ হবে, otherbranchএটি থেকে ডালপালা দিয়ে ।

(অবশ্যই আপনি একটি হার্ড রিসেটও ব্যবহার করতে পারেন কারণ আপনি চান বি, সি এবং ডি কখনই ঘটেছিল না))


5

এগুলির মধ্যে পার্থক্য মনে রাখতে আপনাকে নিজেকে বাধ্য করতে হবে না। আপনি কীভাবে আসলে প্রতিশ্রুতিবদ্ধ তা ভেবে দেখুন।

1. কিছু পরিবর্তন করুন।

2.git অ্যাড।

3.gc -m "আমি কিছু করেছি"

নরম, মিশ্রিত এবং শক্ত হ'ল উপায়টি আপনাকে 3 থেকে 1 সাল পর্যন্ত চালিয়ে যাওয়া অপারেশনগুলি ছেড়ে দিতে সক্ষম করে।

আপনি কখন "জিসি-এম" করেছেন তা দেখার জন্য সফট "ভান করে"।

আপনি কখনও "গিট অ্যাড" করেননি তা দেখতে মিশ্রিত "ভানিত"।

আপনি ফাইল পরিবর্তন করেছেন তা কখনই না দেখতে হার্ড "ভান করে"।


4

এই তিনটি অপশনে যাওয়ার আগে অবশ্যই 3 টি জিনিস বুঝতে হবে।

1) ইতিহাস / হেড

2) পর্যায় / সূচী

3) ওয়ার্কিং ডিরেক্টরি

পুনরায় সেট করুন - সাফ্ট: ইতিহাস পরিবর্তিত হয়েছে, শিরোনাম পরিবর্তিত হয়েছে, কার্যকারী ডিরেক্টরিটি পরিবর্তন করা হয়নি।

পুনরায় সেট করুন - মিক্সড: ইতিহাস বদলেছে, শিরোনাম পরিবর্তিত হয়েছে, স্টেরিস্টিকেশনটি স্টেঞ্জ না করা ডেটা দিয়ে পরিবর্তন করা হয়েছে।

পুনরায় সেট করুন - ইতিহাস: ইতিহাস বদলেছে, শিরোনাম পরিবর্তিত হয়েছে, হারানো ডেটার সাথে ওয়ার্কিং ডিরেক্টরি পরিবর্তন করা হয়েছে।

গিট - সাফ্টের সাথে যাওয়া সর্বদা নিরাপদ। জটিল প্রয়োজনে অন্যের বিকল্প ব্যবহার করা উচিত।


3

সম্পর্কে একটি ভুল ধারণা সহ এখানে বেশ কয়েকটি উত্তর রয়েছে git reset --soft। যদিও সেখানে একটি নির্দিষ্ট শর্ত রয়েছে যা git reset --softকেবলমাত্র পরিবর্তিত হবে HEAD(একটি বিচ্ছিন্ন প্রধানের রাষ্ট্র থেকে শুরু করে), সাধারণত (এবং উদ্দেশ্যযুক্ত ব্যবহারের জন্য), এটি বর্তমানে আপনি যে শাখার রেফারেন্সটি পরীক্ষা করেছেন তা সরিয়ে দেয়। অবশ্যই যদি আপনার কোনও শাখা পরীক্ষা করে না নেওয়া হয় তবে এটি এটি করতে পারে না (সুতরাং নির্দিষ্ট শর্ত যেখানে git reset --softকেবল পরিবর্তন হবে HEAD)।

আমি এটি সম্পর্কে চিন্তা করার সেরা উপায় হিসাবে খুঁজে পেয়েছি git reset। আপনি কেবল নড়াচড়া করছেন না HEAD( সব কিছু এটি করে ), আপনি শাখা রেফও সরিয়ে নিচ্ছেন , যেমন master,। এটি যখন ঘটে তখন আপনি যা করতে চান তার সাথে মিল রয়েছে git commit(বর্তমান শাখাটি বরাবর সরে যায় HEAD), নতুন প্রতিশ্রুতি তৈরি (এবং এতে সরানো) বাদ দিয়ে আপনি পূর্বের প্রতিশ্রুতিতে যান।

এটি হ'ল বিন্দুটি reset, একটি নতুন শাখা পরিবর্তনের পরিবর্তে কোনও নতুন অঙ্গীকার ব্যতীত কোনও শাখা পরিবর্তন করা HEAD আপনি এটি দলিলের উদাহরণে দেখতে পারেন:

একটি অঙ্গীকারকে পূর্বাবস্থায় ফিরিয়ে আনুন, এটিকে একটি বিষয় শাখা করে

          $ git branch topic/wip     (1)
          $ git reset --hard HEAD~3  (2)
          $ git checkout topic/wip   (3)
  1. আপনি কিছু কমিট করেছেন, তবে বুঝতে পারেন যে তারা "মাস্টার" শাখায় থাকার অকাল ছিল। আপনি তাদের কোনও টপিক শাখায় পোলিশ করা চালিয়ে যেতে চান, সুতরাং বর্তমান হেডের বাইরে "টপিক / উইপ" শাখা তৈরি করুন।
  2. এই তিনটি কমিট থেকে মুক্তি পেতে মাস্টার শাখাটি রিওয়াইন্ড করুন।
  3. "বিষয় / wip" শাখায় স্যুইচ করুন এবং কাজ চালিয়ে যান।

এই সিরিজের কমান্ডগুলির বিন্দুটি কী? আপনি এখানে একটি শাখা স্থানান্তরিত করতে চান master, তাই আপনি masterচেক আউট করার সময়, আপনি চালিত হন git reset

এখানে শীর্ষে ভোট দেওয়া উত্তর সাধারণত ভাল তবে আমি ভেবেছিলাম যে আমি ভুল যুক্তি দিয়ে বিভিন্ন উত্তর সংশোধন করতে এটি যুক্ত করব।

আপনার শাখা পরিবর্তন করুন

git reset --soft <ref>: সুনির্দিষ্ট রেফারেন্সে কমিট করার জন্য বর্তমানে পরীক্ষিত শাখার জন্য শাখা পয়েন্টার পুনরায় সেট করে <ref>। আপনার কার্যকারী ডিরেক্টরি এবং সূচীর ফাইলগুলি পরিবর্তন করা হয়নি। এই পর্যায়ে থেকে প্রতিশ্রুতিবদ্ধ হওয়া আপনাকে git resetআদেশের ঠিক আগে যেখানে নিয়ে এসেছিল সেখানে নিয়ে যাবে ।

আপনার সূচকটিও পরিবর্তন করুন

git reset --mixed <ref>

বা সমতুল্য

git reset <ref>:

এবং যা --softকরে তা নির্দিষ্ট রেফারেন্সে কমিটের সাথে ম্যাচের জন্য সূচকটি পুনরায় সেট করে। যখন কিছুই হয় না (কারণ এটি চেক আউট শাখাকে চেক আউট শাখায় সরিয়ে দেয়) , বা সমতুল্য , একটি সাধারণ এবং দরকারী কমান্ড কারণ এটি সূচকটি আপনার শেষ প্রতিশ্রুতিবদ্ধ অবস্থার সাথে পুনরায় সেট করে।git reset --soft HEADgit reset --mixed HEADgit reset HEAD

আপনার কাজের ডিরেক্টরিটিও পরিবর্তন করুন

git reset --hard <ref>: যা --mixedকরে এবং আপনার কার্যকারী ডিরেক্টরিকেও ওভাররাইট করে। এই কমান্ডটি অনুরূপ git checkout <ref>, ব্যতীত (এবং এটি সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট reset) শাখা রেফটি নির্দেশ করছে যে সমস্ত ধরণের git resetপদক্ষেপ HEAD

"এই জাতীয় এবং এই জাতীয় কমান্ড শিরোনাম" সম্পর্কে একটি নোট:

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


2
"শাখা রেফ চলমান": ভাল পয়েন্ট। আমাকে স্ট্যাকওভারফ্লো . com/a/5203843/6309 আপডেট করতে হয়েছিল ।
ভোনসি

1

3 বিকল্পগুলি কী প্রসঙ্গে ব্যবহৃত হয় তার একটি সংক্ষিপ্ত উত্তর:

কোডটিতে বর্তমান পরিবর্তনগুলি রাখতে কিন্তু প্রতিশ্রুতিবদ্ধ ইতিহাস পুনরায় লেখার জন্য:

  • soft: আপনি একবারে সবকিছু প্রতিশ্রুতিবদ্ধ করতে এবং একটি নতুন বিবরণ দিয়ে একটি নতুন প্রতিশ্রুতি তৈরি করতে পারেন (আপনি যদি টরোটাইজ গিট বা অন্য কোনও জিইআইআই ব্যবহার করেন তবে এটিই ব্যবহারযোগ্য, কারণ আপনি এখনও প্রতিশ্রুতিতে কোন ফাইলগুলি চান তা টিক করতে পারেন এবং একাধিক তৈরি করতে পারেন বিভিন্ন ফাইলের সাথে সেভাবে প্রতিশ্রুতি দেয় Source সোর্সট্রিতে সমস্ত ফাইল কমিট করার জন্য মঞ্চস্থ করা হবে would)
  • mixed: আপনি কমিট করার আগে আপনাকে পৃথক ফাইলগুলি আবার সূচকে যুক্ত করতে হবে (সোর্সট্রিতে সমস্ত পরিবর্তিত ফাইল আনস্টেজ করা হবে না)

আসলে করার আপনার পরিবর্তনগুলি হারান পাশাপাশি কোডে:

  • hard: আপনি কেবল ইতিহাস পুনর্লিখন করেন না তবে পুনরায় সেট করার পয়েন্ট পর্যন্ত আপনার সমস্ত পরিবর্তনও হারাবেন

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

পরিবর্তনগুলি পুনরায় স্মরণ করা হচ্ছে। কোনও বিপরীত প্রতিশ্রুতি থাকবে না।
নিকপিক

1

গিট রিসেট কমান্ডের বিভিন্ন বিকল্পের মধ্যে মূল পার্থক্য নীচের মত as

  • - সফ্ট: আপনি নির্বাচিত প্রতিশ্রুতিগুলির জন্য কেবলমাত্র হেডকে পুনরায় সেট করে। গিট চেকআউট হিসাবে মূলত একই কাজ করে তবে আলাদা মাথাব্যথা তৈরি করে না।
  • --মিক্সড (ডিফল্ট বিকল্প): ইতিহাসের উভয় ক্ষেত্রে আপনি যে প্রতিশ্রুতি নির্বাচন করেছেন তা হেডকে পুনরায় সেট করে এবং সূচীর পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে দেয়।
  • --হার্ড: ইতিহাসের উভয় ক্ষেত্রে আপনি যে প্রতিশ্রুতিটি নির্বাচন করেছেন তা পুনরায় সেট করে, সূচকের পরিবর্তনগুলি পূর্বাবস্থায় ফিরে আসে এবং আপনার কার্যনির্বাহী ডিরেক্টরিতে পরিবর্তনগুলি বাতিল করে দেয়।

1

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

--mixed: নরমের মতোই, এটি হেডকে অন্য প্রতিশ্রুতিতে পুনরায় সেট করবে। কাজের সূচকে স্পর্শ করা হবে না এমন সময় এটি মেলতে সূচকটি পুনরায় সেট করবে will সমস্ত পরিবর্তনগুলি কার্যকারী ডিরেক্টরিতে থাকবে এবং পরিবর্তিত হিসাবে উপস্থিত হবে, তবে মঞ্চস্থ হবে না।

--hard: এটি সমস্ত কিছু পুনরায় সেট করে - এটি আবার অন্য প্রতিশ্রুতিতে শিরোনামকে পুনরায় সেট করে, এটির সাথে তাল মিলিয়ে সূচকটি পুনরায় সেট করে এবং এটিও মিলানোর জন্য কার্যকরী ডিরেক্টরিটি পুনরায় সেট করে।

--mixedএবং এর মধ্যে প্রধান পার্থক্য --softহ'ল আপনার সূচকটিও সংশোধিত হয়েছে। এখানে এই সম্পর্কে আরও চেক করুন


0

মকরাসেকের উত্তর দুর্দান্ত, সহজ ভাষায় আমরা বলতে পারি ...

  • git reset --soft: HEADউদ্দেশ্যবদ্ধ প্রতিশ্রুতিতে সেট করুন তবে আপনার পরিবর্তনগুলি সর্বশেষ কমিট থেকে মঞ্চায়িত করুন
  • git reset --mixed: এটি একই git reset --softতবে একই পার্থক্যটি হ'ল সর্বশেষ কমিটগুলি থেকে আপনার পরিবর্তনগুলি পর্যালোচনা করে
  • git reset --hard: HEADআপনি যে প্রতিশ্রুতিটি নির্দিষ্ট করেছেন তাতে সেট করুন এবং অবিশ্রুত পরিবর্তন সহ সর্বশেষ কমিটগুলি থেকে আপনার সমস্ত পরিবর্তন পুনরায় সেট করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.