সরল ইংরেজিতে, "গিট রিসেট" কী করে?


674

আমি সূক্ষ্মতা সম্পর্কে ব্যাখ্যা আকর্ষণীয় পোস্ট দেখেছি git reset

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

আমি মনে করি git resetএটি খুব কাছাকাছি hg revert, তবে এটির মধ্যে পার্থক্য রয়েছে বলে মনে হয়।

সুতরাং ঠিক কি করে git reset? সম্পর্কে বিস্তারিত ব্যাখ্যা অন্তর্ভুক্ত করুন:

  • বিকল্পগুলি --hard, --softএবং --merge;
  • আপনি HEADযেমন HEAD^এবং এর সাথে অদ্ভুত স্বরলিপি ব্যবহার করেন HEAD~1;
  • কংক্রিট ব্যবহারের ক্ষেত্রে এবং কাজের প্রবাহ;
  • কাজের অনুলিপি, HEADএবং আপনার বৈশ্বিক চাপের স্তরের ফলাফল।

17
আমি মনে করি একটি সাধারণ গিট কমান্ড ব্যবহার করার সময় একটি ভিজ্যুয়াল গিট রেফারেন্স কী ঘটে তা ভাল অন্তর্দৃষ্টি দেয়।

উত্তর:


992

সাধারণভাবে, git resetএর কাজটি হ'ল বর্তমান শাখাটি নিয়ে যাওয়া এবং অন্য কোথাও নির্দেশ করার জন্য এটি পুনরায় সেট করা এবং সম্ভবত সূচক এবং কাজের গাছটি সাথে আনতে হবে। আরও দৃ concrete়ভাবে, যদি আপনার মাস্টার শাখা (বর্তমানে চেক আউট) এর মতো হয়:

- A - B - C (HEAD, master)

এবং আপনি বুঝতে পেরেছেন যে আপনি মাস্টার বি এর দিকে নির্দেশ করতে চান, সি নয়, আপনি git reset Bএটি সেখানে স্থানান্তর করতে ব্যবহার করবেন:

- A - B (HEAD, master)      # - C is still here, but there's no branch pointing to it anymore

ডিগ্রেশন: এটি একটি চেকআউট থেকে পৃথক। আপনি যদি চালাতে চান তবে আপনি git checkout Bএটি পেয়েছেন:

- A - B (HEAD) - C (master)

আপনি একটি বিচ্ছিন্ন হেড অবস্থায় শেষ করেছেন। HEAD, কাজের গাছ, সূচক সব মিলছে Bতবে মাস্টার শাখাটি পিছনে ছিল C। আপনি যদি Dএই সময়ে নতুন প্রতিশ্রুতিবদ্ধ হন তবে আপনি এটি পাবেন যা সম্ভবত আপনি যা চান তা নয়:

- A - B - C (master)
       \
        D (HEAD)

মনে রাখবেন, রিসেট কমিট করে না, এটি একটি পৃথক কমিটকে নির্দেশ করার জন্য একটি শাখা (যা প্রতিশ্রুতির প্রতি নির্দেশক) আপডেট করে। বাকিটি কেবল আপনার সূচক এবং কাজের গাছের সাথে কী ঘটে তার বিশদ।

ব্যবহারের ক্ষেত্রে

আমি git resetপরের অংশে বিভিন্ন বিকল্পের আমার বর্ণনার মধ্যে মূল ব্যবহারের অনেকগুলি বিষয় আবরণ করি । এটি সত্যই বিভিন্ন ধরণের জন্য ব্যবহার করা যেতে পারে; সাধারণ থ্রেডটি হ'ল এগুলির সকলের মধ্যে একটি প্রদত্ত প্রতিশ্রুতি দেখানোর / মেলে চিহ্নিত করার জন্য শাখা, সূচক এবং / অথবা কাজের ট্রি পুনরায় সেট করা জড়িত।

বিষয়গুলি যত্নবান হতে হবে

  • --hardআপনাকে সত্যই কাজ হারাতে পারে। এটি আপনার কাজের গাছকে পরিবর্তন করে।

  • git reset [options] commitআপনাকে (বাছাই করা) কমিটগুলি হারাতে পারে। উপরের খেলনা উদাহরণে, আমরা প্রতিশ্রুতি হারিয়েছি C। এটি এখনও রেপোতে রয়েছে এবং আপনি এটি দেখে git reflog show HEADবা এটি খুঁজে পেতে পারেন git reflog show masterতবে এটি এখন কোনও শাখা থেকে অ্যাক্সেসযোগ্য নয়।

  • গিট 30 দিনের পরে এই ধরনের কমিটগুলি স্থায়ীভাবে মুছে ফেলে, তবে ততক্ষণে আপনি এর উপরে আবার একটি শাখা দেখিয়ে সি পুনরুদ্ধার করতে পারেন git checkout C; git branch <new branch name>

যুক্তি

ম্যান পেজটি প্যারাফ্রেস করে, সর্বাধিক সাধারণ ব্যবহার ফর্মটির git reset [<commit>] [paths...], যা প্রদত্ত প্রতিশ্রুতি থেকে প্রদত্ত পাথগুলিকে তাদের রাজ্যে পুনরায় সেট করবে। যদি পথগুলি সরবরাহ না করা হয় তবে পুরো গাছটি পুনরায় সেট করা হয়, এবং যদি প্রতিশ্রুতি প্রদান করা হয় না, তবে এটি প্রধান (বর্তমান প্রতিশ্রুতি) হিসাবে নেওয়া হবে। এটি গিট কমান্ড জুড়ে একটি সাধারণ প্যাটার্ন (যেমন চেকআউট, ডিফ, লগ, যদিও সঠিক শব্দার্থবিজ্ঞানের ভিন্নতা রয়েছে), তাই এটি খুব আশ্চর্য হওয়া উচিত নয়।

উদাহরণস্বরূপ, git reset other-branch path/to/fooপাথ / টু / ফু-তে সমস্ত কিছু অন্য শাখায় তার রাজ্যে git reset -- .পুনরায় সেট করে, বর্তমান ডিরেক্টরিটি তার হেডে তার রাজ্যে পুনরায় সেট করে এবং একটি সরল git resetসবকিছুই তার রাজ্যে পুনরায় সেট করে।

প্রধান কাজের গাছ এবং সূচক বিকল্পগুলি

রিসেটের সময় আপনার কাজের গাছ এবং সূচকে কী ঘটে তা নিয়ন্ত্রণ করার জন্য এখানে চারটি প্রধান বিকল্প রয়েছে।

মনে রাখবেন, সূচকটি গিটের "স্টেজিং এরিয়া" - আপনি যখন git addপ্রতিশ্রুতি দেওয়ার প্রস্তুতিতে বলেন তখন জিনিসগুলি চলে ।

  • --hardআপনি যে প্রতিশ্রুতি পুনরায় সেট করেছেন তার সাথে সমস্ত কিছু মিলে যায়। এটি সম্ভবত বোঝা সহজ iest আপনার স্থানীয় পরিবর্তনগুলি সমস্ত ক্লোবারড হয়ে যায়। একটি প্রাথমিক ব্যবহার হ'ল আপনার কাজকে উড়িয়ে দিচ্ছে তবে কমিটস স্যুইচ করা হচ্ছে না: git reset --hardমানে git reset --hard HEAD, শাখাটি পরিবর্তন করবেন না তবে সমস্ত স্থানীয় পরিবর্তনগুলি থেকে মুক্তি পান। অন্যটি কেবল একটি স্থান থেকে অন্য স্থানে একটি শাখা স্থানান্তরিত করছে এবং সূচী / কাজের গাছটিকে সিঙ্কে রাখছে। এটিই আপনাকে সত্যিকার অর্থে কাজ হারাতে পারে, কারণ এটি আপনার কাজের গাছকে পরিবর্তন করে। খুব নিশ্চিত হন যে আপনি কোনও কাজ চালানোর আগে স্থানীয় কাজ ফেলে দিতে চান reset --hard

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

  • --softসূচক বা কাজের গাছ স্পর্শ করে না । আপনার সমস্ত ফাইল যেমন ছিল তেমন অক্ষত --mixedতবে সমস্ত পরিবর্তনগুলি changes to be committedগিট স্ট্যাটাসের সাথে প্রদর্শিত হয় (অর্থাত্ প্রতিশ্রুতি দেওয়ার প্রস্তুতিতে চেক ইন করা হয়েছে)। আপনি যখন বুঝতে পারেন যে আপনি কিছু খারাপ প্রতিশ্রুতি করেছেন তখন এটি ব্যবহার করুন, তবে কাজটি ভাল - আপনাকে যা করতে হবে তা অন্যরকমভাবে পুনরায় স্বীকার করতে হবে। সূচকটি অচ্ছুত রয়েছে, তাই আপনি চাইলে সাথে সাথে প্রতিশ্রুতিবদ্ধ করতে পারেন - ফলস্বরূপ প্রতিশ্রুতিতে পুনরায় সেট করার আগে আপনি যেখানে ছিলেন সেখানে একই রকম সামগ্রী থাকবে।

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

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

আরো জানতে চান?

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

অদ্ভুত স্বরলিপি

"অদ্ভুত স্বরলিপি" ( HEAD^এবং HEAD~1) আপনি উল্লেখ করেছেন কেবল হ্যাশ নাম ব্যবহার না করেই কমিটগুলি নির্দিষ্ট করার জন্য একটি শর্টহ্যান্ড 3ebe3f6। এটি সম্পূর্ণ উদাহরণ এবং সম্পর্কিত বাক্য গঠন সহ গিট-রেভ-পার্সের জন্য ম্যান পৃষ্ঠার "নির্দিষ্টকরণের সংশোধনী" বিভাগে সম্পূর্ণ নথিবদ্ধ । ক্যারেট এবং টিলড আসলে বিভিন্ন জিনিস বোঝায় :

  • HEAD~সংক্ষিপ্ত HEAD~1এবং এর অর্থ কমিটের প্রথম পিতামাতা। HEAD~2মানে কমিটের প্রথম পিতামাতার প্রথম পিতামাতা। HEAD~n"হেডের আগে এন কমিট" বা "হেডের নবম প্রজন্মের পূর্বপুরুষ" হিসাবে ভাবুন ।
  • HEAD^(বা HEAD^1) অর্থ কমিটের প্রথম পিতামাতা। HEAD^2মানে কমিটের দ্বিতীয় পিতা বা মাতা। মনে রাখবেন, একটি সাধারণ মার্জ কমিটের দুটি পিতা-মাতা থাকে - প্রথম পিতামাতা হ'ল মার্জড-ইন কমিট and সাধারণভাবে, সংশ্লেষগুলি আসলে নির্বিচারে অনেক বাবা-মা থাকতে পারে (অক্টোপাস মার্জ)।
  • ^এবং ~অপারেটরদের একসঙ্গে গ্রথিত করা যেতে পারে, হিসাবে HEAD~3^2, এর তৃতীয় প্রজন্মের পূর্বপুরুষ দ্বিতীয় পিতা বা মাতা HEAD, HEAD^^2, প্রথম পিতা বা মাতা দ্বিতীয় পিতা বা মাতা HEAD, অথবা এমনকি HEAD^^^, যা সমতূল্য HEAD~3

ক্যারেট এবং টিলড


"আপনি গিট রিসেটটি সেখানে স্থানান্তরিত করতে ব্যবহার করবেন" " আপনি এটি করতে গিট চেকআউট ব্যবহার করবেন না কেন?
ই-সন্তুষ্ট

5
@ ই-সন্তুষ্ট: গিট চেকআউট শিরোনামে স্থানান্তরিত করবে, তবে যেখানে শাখা ছিল তা ছেড়ে দাও। আপনি যখন শাখাটি স্থানান্তর করতে চান এটির জন্য এটি।
ক্যাসকেবেল

সুতরাং যদি আমি ভালভাবে বুঝতে পারি, তবে পুনরায় সেট করুন বি করবেন: - এ - বি - সি - বি (মাস্টার) চেকআউট বি করার সময় - এ - বি (মাস্টার)?
ই-সন্তুষ্ট

32
ডকগুলি এগুলি পড়তে চিরকালের জন্য লাগে যদিও তারা খুব ভাল এবং এগুলি খুব ঘন এবং তারা যাচাই করে এটি যাচাই করে তা আপনার চিরকালের জন্য এটি চিরকালের জন্য লাগে যে এটি ইতিমধ্যে আপনার কীভাবে কাজ করে তা আপনার ইতিমধ্যে জানে। ডক্স পছন্দের নয় আমার কাছে ভালই হয় ...
কারবি

4
একটি সহজ এবং বোধগম্য ব্যাখ্যা এই এসও উত্তর দিয়ে দেওয়া হয়েছে: stackoverflow.com/questions/3528245/what-the-differences-between-git-reset-mixed-soft-and-hard
নিতিন বানসাল

80

মনে রাখবেন যে আপনার মধ্যে git:

  • HEADপয়েন্টার , যা আপনি কি কাজ করছি কমিট বলে
  • কাজ গাছ , যা আপনার সিস্টেমে ফাইল রাষ্ট্র প্রতিনিধিত্ব করে
  • উপস্থাপনকারী এলাকা (নামেও সূচক ), যা "পর্যায়" তাই যে পরিবর্তন তারা পরে একসঙ্গে সংঘটিত করা যেতে পারে

সম্পর্কে বিস্তারিত ব্যাখ্যা অন্তর্ভুক্ত করুন:

--hard, --softএবং --merge;

বিপজ্জনক-নেসের ক্রমবর্ধমান ক্রম:

  • --softচলাফেরা করে HEADকিন্তু মঞ্চের অঞ্চল বা কার্যকরী গাছকে স্পর্শ করে না।
  • --mixedHEADমঞ্চস্থ স্থানটি সরানো এবং আপডেট করে তবে কার্যকারী বৃক্ষ নয়।
  • --mergeHEADমঞ্চস্থ স্থানটি সরানো , পুনরায় সেট করা এবং আপনার কার্যকারী গাছের সমস্ত পরিবর্তনকে নতুন কার্যকারী বৃক্ষে স্থানান্তরিত করার চেষ্টা করে।
  • --hardপ্যাচসমূহ HEAD এবং adjusts আপনার উপস্থাপনকারী এলাকা এবং নতুন কাজ গাছ HEAD, সবকিছু দূরে নিক্ষেপ।

কংক্রিট ব্যবহারের কেস এবং কর্মপ্রবাহ;

  • --softআপনি যখন "নিজের জায়গাটি হারাবেন না" ততক্ষণ অন্য প্রতিশ্রুতিবদ্ধ হয়ে জিনিসগুলি প্যাচ করতে চান তখন ব্যবহার করুন । আপনার এটি প্রয়োজন এটি খুব বিরল।

-

# git reset --soft example
touch foo                            // Add a file, make some changes.
git add foo                          // 
git commit -m "bad commit message"   // Commit... D'oh, that was a mistake!
git reset --soft HEAD^               // Go back one commit and fix things.
git commit -m "good commit"          // There, now it's right.

-

  • --mixedযখন অন্য কোন প্রতিশ্রুতিতে জিনিসগুলি দেখতে কেমন তা দেখতে চাইলে ব্যবহার করুন (যা পূর্বনির্ধারিত) তবে আপনি ইতিমধ্যে থাকা কোনও পরিবর্তন হারাতে চান না।

  • --mergeআপনি যখন নতুন স্থানে যেতে চান তবে ব্যবহার করুন তবে ইতিমধ্যে সেই কার্যকারী গাছের মধ্যে আপনার পরিবর্তনগুলি অন্তর্ভুক্ত করুন।

  • --hardসবকিছু মুছতে এবং নতুন প্রতিশ্রুতিতে একটি নতুন স্লেট শুরু করতে ব্যবহার করুন ।


2
এটি এর উদ্দেশ্যে ব্যবহারের ক্ষেত্রে নয় reset --merge। এটি ত্রি-মুখী মার্জটি সম্পাদন করে না। ডক্সে বর্ণিত হিসাবে এটি কেবলমাত্র বিবাদযুক্ত মার্জগুলি পুনরায় সেট করার জন্য। আপনি যা checkout --mergeবলছেন তা করতে আপনি ব্যবহার করতে চাইবেন । আপনি যদি পাশাপাশি শাখাটি স্থানান্তর করতে চান তবে আমার মনে হয় একমাত্র উপায় হ'ল এটির সাথে টেনে আনার জন্য কিছু চেকআউট / পুনরায় সেট করা।
ক্যাসাবেল

@ জেফ্রমি »হ্যাঁ, আমি এটি খুব একটা ভাল করে ফেলিনি। "একটি নতুন স্পট" দ্বারা আমি বোঝাতে চাইছি "একটি তাজা জায়গা যেখানে আপনার বিরোধী সংহত নেই"।
জন Feminella

1
আহ আমি দেখি. আমি মনে করি এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল আপনি যা করছেন তা সত্যই যদি না জানেন তবে আপনি সম্ভবত reset --merge(ডিফল্ট) ছাড়া আর কোনও লক্ষ্য নিয়ে ব্যবহার করতে চান না HEAD, কারণ একটি বিবাদযুক্ত মার্জটি বাতিল করার পাশাপাশি এটি ফেলে দিতে চলেছে আপনি অন্যথায় সংরক্ষণ করতে পারে যে তথ্য।
ক্যাসাবেল

2
আমি এই উত্তরটি সবচেয়ে সহজ এবং সর্বাধিক সহায়ক বলে খুঁজে পেয়েছি
জাজেপি

দয়া করে এই আদেশগুলি সম্পর্কে তথ্য যুক্ত করুন: git resetএবং git reset -- .
ফ্লিম 15

35

প্রো গিট ব্লগে রিসেট ডেমাইসাইফড পোস্টটি এবং এর উপর খুব মস্তিষ্কের ব্যাখ্যা দেয় ।git resetgit checkout

এই পোস্টের শীর্ষে সমস্ত সহায়ক আলোচনার পরে, লেখক নীচের সাধারণ তিনটি ধাপে নিয়মগুলি হ্রাস করেছেন:

মূলত এটি। resetকমান্ড একটি নির্দিষ্ট অনুক্রম এই তিনটি গাছ মুছে ফেলা হয় বাঁধন যখন আপনি এটি দেখতে বলুন।

  1. যে শাখা শিরোনামটি নির্দেশ করবে তা সরান (যদি থামুন --soft)
  2. তারপরে, সূচকটি দেখতে দেখতে (যতক্ষণ না এখানে এখানে থামুন --hard)
  3. তারপরে, ওয়ার্কিং ডিরেক্টরীটিকে সেটির মতো দেখান

এছাড়াও আছে --mergeএবং --keepবিকল্পগুলি, কিন্তু আমি বরং আপাতত জিনিসগুলিকে আরও সহজ রাখতে চাই - এটি অন্য কোনও নিবন্ধের জন্য।


25

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

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

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

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

গিট রিসেট

এটি আপনার সূচকটি সাফ করে, আপনার কার্য-ডিরেক্টরিকে অচল করে ফেলে। (কেবল সমস্ত কিছু আনস্টেজ করা)।

এটি এর সাথে বিকল্পগুলির সংখ্যা সহ ব্যবহার করা যেতে পারে। গিট রিসেটের সাথে ব্যবহার করার জন্য তিনটি প্রধান বিকল্প রয়েছে : --হার্ড, - সোফ্ট এবং - মিক্সড । এগুলি আপনি রিসেট করার সময় হেড পয়েন্টার ছাড়াও কী রিসেট করবেন তা প্রভাবিত করে।

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

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

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

গিট রিভার্ট এবং গিট রিসেটের মধ্যে পার্থক্য : -


সহজ কথায়, গিট রিসেট হ'ল "ফিক্স-অবিস্মরণযুক্ত ভুল" করার একটি কমান্ড এবং গিট রিভার্ট হ'ল "ফিক্স-কমিটেড ভুল" করার একটি কমান্ড ।

এর অর্থ যদি আমরা কিছু পরিবর্তনে কিছু ত্রুটি করেছি এবং কমিট করেছি এবং গিট রেপোতে একই ধাক্কা দিয়েছি, তবে গিট রিভার্ট হ'ল সমাধান। এবং যদি আমরা ধাক্কা দেওয়ার / কমিট করার আগে একই ত্রুটিটি চিহ্নিত করেছি তবে আমরা গিট রিসেট ব্যবহার করতে পারি সমস্যাটি ঠিক ।

আমি আশা করি এটি আপনার বিভ্রান্তি থেকে মুক্তি পেতে সহায়তা করবে।


2
এটি ওপি দ্বারা জিজ্ঞাসা করা একটি দুর্দান্ত সরল ইংরেজী উত্তর।
এপিসোডেক্স

1
যদিও আমি আপনার উত্তরে এটি মিস করতে পারি। কি git reset HEADডিফল্টরূপে? --hard, --softবা --mixed? দুর্দান্ত উত্তর বিটিডব্লিউ।
জিয়ানিস ক্রিস্টোফাকিস 26'18

1
দুর্দান্ত উত্তর, তবে আমি এটি আরও পরিষ্কার করে git reset --hardদেব যা আপনাকে কিছু ডেটা হারাতে বাধ্য করবে। এবং এমন একটি বিষয় রয়েছে যা ভুল হতে পারে (যদিও আমি ১০০% নিশ্চিত নই ... তবুও শিখছি!): --mixedআপনার সম্পর্কে কথা বলছেন যে "আমরা গিট কমিট-এ-এর প্রতিশ্রুতি দেওয়ার চেয়ে বেশি প্রতিশ্রুতি দিলে আমরা কখনও কখনও এটি ব্যবহার করি"। আপনি কি বলতে চাইছেন: "আমরা যদি এর চেয়ে বেশি মঞ্চস্থ হই git stage ."? যদি আপনি সত্যিই এটি প্রতিশ্রুতিবদ্ধ থাকেন তবে আমি মনে করি এটি অনেক দেরি হয়ে গেছে (আপনি যেমন শেষে বলেছেন, গিট রিসেট হ'ল "নির্বিঘ্নিত ভুলগুলি সংশোধন করার আদেশ")
ফ্যাবিও মনিকা

6

টি এল; ডিআর

git resetশেষ প্রতিশ্রুতি থেকে স্টেটিং পুনরায় সেট। --hardশেষ প্রতিশ্রুতিতে আপনার ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলি পুনরায় সেট করতেও ব্যবহার করুন ।

দীর্ঘ সংস্করণ

তবে এটি স্পষ্টতই সরল কারণ অনেকগুলি ভার্জিক উত্তর। git resetপূর্বাবস্থায় ফিরে আসা পরিবর্তনগুলির প্রসঙ্গে আমার পড়ার বিষয়টি আরও বোধগম্য হয়েছিল । যেমন এটি দেখুন:

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

Https://www.atlassian.com/git/tutorials/undoing-changes/git-reset থেকে

এবং এই

কমিট-লেভেলে, রিসেট করা কোনও শাখার ডগাটিকে ভিন্ন প্রতিশ্রুতিতে স্থানান্তরিত করার একটি উপায়। এটি বর্তমান শাখা থেকে কমিটগুলি অপসারণ করতে ব্যবহার করা যেতে পারে।

Https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operation থেকে


2

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

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


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

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

চেকআউট একটি নির্দিষ্ট প্রতিশ্রুতিতে মাথা নির্দেশ করে।

একটি নির্দিষ্ট অঙ্গীকারের উপর একটি শাখা পুনরায় সেট করুন। (একটি শাখা একটি অঙ্গীকারের জন্য নির্দেশক))

ঘটনাক্রমে, যদি আপনার মাথা কোনও অঙ্গীকারকে নির্দেশ না করে যা একটি শাখা দ্বারাও নির্দেশিত হয় তবে আপনার মাথা পৃথক det (ভুল হতে পারে। মন্তব্য দেখুন ...)


1
না nitpick, কিন্তু (হ্যাঁ, এটি আসলে হয় nitpicking কিন্তু আসুন সমাপ্তির জন্য এটি যোগ) আপনার 3 য় বাক্য টেকনিক্যালি মিথ্যা। আসুন আমরা বলি যে আপনার হেডটি শাখা বি এর দিকে ইঙ্গিত করছে যা ঘুরে ফিরে abc123 প্রতিশ্রুতিবদ্ধ। আপনি যদি এখন abc123 প্রতিশ্রুতিবদ্ধভাবে চেকআউট করেন তবে আপনার হেড এবং শাখা বি উভয়ই abc123 প্রতিশ্রুতি দেওয়ার দিকে নির্দেশ করছে এবং আপনার হেড পৃথক করা হয়েছে। এই মুহূর্তে প্রতিশ্রুতিবদ্ধ করা শাখা খ এর অবস্থান আপডেট করবে না । আপনি বলতে পারতেন "যদি আপনার মাথা কোনও শাখার দিকে ইঙ্গিত না করে তবে আপনার মাথা আলাদা থাকে"
RomainValeri

@ রোমাইনভ্যালারি এই পরিস্থিতিতে কী করবে?
ইয়ান ওয়ারবার্টন

1
প্রতিশ্রুতিবদ্ধ কমিটগুলি তৈরি করবে যা কোনও শাখা দ্বারা রেফারেন্সযুক্ত নয়, এবং শাখা বি আপনাকে তার পরে একাধিকবার প্রতিশ্রুতিবদ্ধ করার পরেও একই প্রতিশ্রুতিবদ্ধ abc123 এর দিকে ইঙ্গিত করতে থাকবে। এটি সূচিত করে যে এই কমিটগুলি আবর্জনা সংগ্রহের প্রার্থী হয়ে উঠবে যখন হেড এই 'বুনো' সিরিজের কমিটগুলির শেষ প্রতিশ্রুতি দেখানো বন্ধ করে দেয়।
রোমেনভ্যালারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.