"গিট রিসেট" এবং "গিট চেকআউট" এর মধ্যে পার্থক্য কী?


440

আমি সবসময় চিন্তা করে থাকেন git resetএবং git checkoutএই অর্থে যে উভয় একটি নির্দিষ্ট কমিট প্রকল্প ফিরিয়ে আনতে একই হিসাবে। যাইহোক, আমি অনুভব করি যে তারা একেবারে এক হতে পারে না, এটি অনর্থক হবে। দুজনের মধ্যে আসল পার্থক্য কী? আমি কিছুটা বিভ্রান্ত, কারণ এসএনএনকে কেবল svn coপ্রতিশ্রুতি ফিরিয়ে দিতে হবে।

যোগ করা হয়েছে

ভনসি এবং চার্লস পার্থক্যগুলি git resetএবং git checkoutসত্যই ভালভাবে ব্যাখ্যা করেছিলেন । আমার বর্তমান বোঝাপড়াটি হ'ল git resetসমস্ত পরিবর্তনগুলি একটি নির্দিষ্ট প্রতিশ্রুতিতে ফিরিয়ে দেয়, যেখানে git checkoutকম-বেশি একটি শাখার জন্য প্রস্তুত থাকে। এই বোঝার জন্য আমি নিম্নলিখিত দুটি চিত্রটি বেশ কার্যকর বলে মনে করেছি:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

যুক্ত 3

থেকে http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , চেকআউট এবং পুনরায় সেট করতে পারেন অনুকরণ রিবেস।

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

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

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


কটাক্ষপাত আছে git-scm.com/blog/2011/07/11/reset.html
pedrorijo91

পুনরায়: "এটি কি ভুল বা অতিরিক্ত সরল?" হ্যাঁ, সেই প্রথম চিত্রটি চেকআউট এবং পুনরায় সেট করার মধ্যে পার্থক্য সম্পর্কে বিভ্রান্ত করছে। ( -- filesভেরিয়েন্টগুলি সম্পর্কে এটি ঠিক আছে ; আমি নিশ্চিত নই।) এই চিত্রটি এটিকে মূল পার্থক্যের মতো দেখায় যা তারা সূচক বা ডাব্লুডিকে প্রভাবিত করে। যে সম্পর্কে আমার উত্তর দেখুন। দ্বিতীয় এবং তৃতীয় চিত্রগুলি আসল পার্থক্যটি দেখার জন্য খুব সহায়ক। 4 তম এবং 5 ম চিত্রগুলি এই আদেশগুলি কী করে তা আপনি বুঝতে পেরেছেন কিনা তা যাচাই করতে দরকারী, তবে আপনাকে সেখানে পৌঁছাতে সত্যিই সহায়তা করবে না।
লার্শ

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

1
প্রোসেক: আপনি যদি লার্সএইচ এর সাথে সম্মত হন যে প্রথম চিত্রটি বিভ্রান্তিকর, তবে আপনি কি এটি সরিয়ে দিতে পারেন, দয়া করে?
জোশিয়ার যোদার

দয়া করে নোট করুন যে চেকআউট এবং রিসেটটি কেবল রিবেসের ২ য় অংশ অনুকরণ করে এবং think-like-a-git.netডেটা ক্ষতি রোধ করতে অতিরিক্ত পদক্ষেপ (লিঙ্কযুক্ত নিবন্ধে সরবরাহিত ) প্রয়োজন।
কাপলিনেটর

উত্তর:


198
  • git resetবিশেষত সূচকটি আপডেট করার , শিরোনামটি সরাতে।
  • git checkoutসম্পর্কে পরিশ্রমী গাছ আপডেট (INDEX অথবা নির্দিষ্ট গাছ থেকে)। এটি কেবলমাত্র হেড আপডেট করবে যদি আপনি কোনও শাখা চেকআউট করেন (যদি না হয়, তবে আপনি একটি বিচ্ছিন্ন হেড দিয়ে শেষ করেন )।
    (আসলে, গিট 2.23 কিউ 3 2019 সহ, এটি git restoreঅগত্যা হবে না git checkout)

তুলনা করে, যেহেতু এসএনএন-এর কোনও সূচক নেই, কেবলমাত্র একটি কার্যকারী গাছ, svn checkoutএকটি পৃথক ডিরেক্টরিতে প্রদত্ত সংশোধনটি অনুলিপি করবে।
এর নিকটতম সমতুল্য git checkout:

  • svn update (আপনি যদি একই শাখায় থাকেন তবে একই এসভিএন ইউআরএল অর্থ)
  • svn switch (যদি আপনি একই শাখার উদাহরণস্বরূপ চেকআউট করেন তবে অন্য এসভিএন রেপো URL থেকে)

সকল যারা তিন কাজ গাছ পরিবর্তন ( svn checkout, update, switch) Git একমাত্র কমান্ড আছে: git checkout
তবে যেহেতু গিটেরও সূচকের ধারণা রয়েছে (সেই রেপো এবং কার্যকারী গাছের মধ্যে "স্টেজিং এরিয়া") আপনারও আছে git reset


থিনকি মন্তব্যগুলিতে " রিসেট ডেমাইসিফাইড " নিবন্ধে উল্লেখ করেছেন ।

উদাহরণস্বরূপ, যদি আমাদের দুটি শাখা থাকে, ' master' এবং ' develop' বিভিন্ন কমিটের দিকে ইঙ্গিত করে এবং আমরা বর্তমানে ' develop' (যাতে হেড এটির দিকে ইঙ্গিত করে) চালিত হয় git reset master, ' develop' নিজেই এখন একই প্রতিশ্রুতিতে নির্দেশ করবে যে 'master 'করে।

অন্যদিকে, আমরা পরিবর্তে যদি চালাই git checkout master, ' develop' সরানো হবে না, HEADনিজেই চলে যাবে। HEADএখন ' master' নির্দেশ করবে ।

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

http://git-scm.com/images/reset/reset-checkout.png

এই বিষয়গুলিতে, যদিও:

LarsH যোগ মন্তব্য :

যদিও এই উত্তরের প্রথম অনুচ্ছেদটি বিভ্রান্তিকর: " git checkout... কেবলমাত্র আপনি একটি শাখা চেক আউট করলেই হেড আপডেট করা হবে (যদি তা না হয় তবে আপনি একটি বিচ্ছিন্ন হেড দিয়ে শেষ করবেন)"।
সত্য নয়: git checkoutআপনি যদি শাখা নয় এমন প্রতিশ্রুতি চেক আউট করেও হেডকে আপডেট করবেন (এবং হ্যাঁ, আপনি একটি বিচ্ছিন্ন হেড দিয়ে শেষ করেছেন, তবে এটি আপডেট হয়ে গেছে)।

git checkout a839e8f updates HEAD to point to commit a839e8f.

দে নোভো মন্তব্যগুলিতে একমত :

@ লার্শ সঠিক
দ্বিতীয় বুলেটে শিরোনাম কী আছে তা সম্পর্কে একটি ভুল ধারণা রয়েছে তবে আপনি কোনও শাখা চেকআউট করলেই এইচএইডিএড আপডেট হবে।
মাথা আপনি যেখানে ছায়ার মতো সেখানেই যান।
কিছু শাখাবিহীন রেফ (যেমন, কোনও ট্যাগ) বা সরাসরি প্রতিশ্রুতিবদ্ধভাবে পরীক্ষা করা শিরোনামে স্থানান্তরিত হবে। বিচ্ছিন্ন মাথাটির অর্থ এই নয় যে আপনি মাথা থেকে বিচ্ছিন্ন হয়ে গেছেন, এর অর্থ হ'ল মাথাটি একটি শাখা রেফ থেকে আলাদা করা হয়েছে, যা আপনি দেখতে পারেন, যেমন, থেকে git log --pretty=format:"%d" -1

  • সংযুক্ত প্রধান রাজ্যগুলি দিয়ে শুরু হবে (HEAD ->,
  • বিচ্ছিন্ন এখনও প্রদর্শিত হবে (HEAD, তবে একটি শাখা রেফের কাছে তীর থাকবে না।

7
আমি বলব যে git resetএটি শাখা "লেবেল" সংশোধন এবং বিকল্প হিসাবে সূচক বা কার্যকারী গাছকে পার্শ্ব-প্রতিক্রিয়া হিসাবে আপডেট করবে। git checkoutকার্যকারী ট্রি আপডেট করা এবং বর্তমানে "নির্বাচিত" শাখা (দ্য HEAD) পরিবর্তন করা।
মিক্কো রেন্টালাইনেন

2
নিবন্ধন করুন git resetসম্পর্কে 100% HEAD। এটি এমনকি পৃথক হেড মোডেও কাজ করে ( স্ট্যাকওভারফ্লো.com/ a/ 3965714 / 6309 ), যেখানে কোনও শাখা (!) নেই সেখানে । গিট চেকআউটটি একটি বিচ্ছিন্ন হেড মোডেও কাজ করে, বা কোনও এসএএএড 1 একটি পৃথক হেড মোডে চেকআউট করার জন্য ব্যবহার করা যেতে পারে: আবার কোনও ক্ষেত্রে এই ক্ষেত্রে জড়িত নয়।
ভোনসি

3
অনুসন্ধানের ইঞ্জিন দ্বারা এখানে পাঠানো সমস্ত হারিয়ে যাওয়া প্রাণীর জন্য আরও পড়ার জন্য, আমি মনে করি এটি এটির জন্য মূল্যবান: git-scm.com/blog/2011/07/11/reset.html
থিনকিয়ে

2
@ থিঙ্কে ভাল রেফারেন্স। আরও দৃশ্যমানতার জন্য উত্তরে আমি এটি প্রাসঙ্গিক এক্সট্র্যাক্ট সহ অন্তর্ভুক্ত করেছি।
ভোনসি

2
রিসেট ডেমাইসাইফাইড থেকে ব্যাখ্যাটি দুর্দান্ত। যদিও এই উত্তরের প্রথম অনুচ্ছেদটি বিভ্রান্তিকর: "গিট চেকআউট ... কেবলমাত্র আপনি একটি শাখা চেকআউট করলেই হেডকে আপডেট করা হবে (যদি তা না হয় তবে আপনি একটি বিচ্ছিন্ন হেড দিয়ে শেষ করবেন)"। সত্য নয় ... গিট চেকআউট শিরোনাম আপডেট করবে এমনকি যদি আপনি কোনও শাখা নয় এমন প্রতিশ্রুতি চেকআউট করেন (এবং হ্যাঁ, আপনি একটি বিচ্ছিন্ন হেড দিয়ে শেষ করেছেন তবে এটি আপডেট হয়ে গেছে)। আপনি "আপডেট" বলতে কী বোঝাতে চাইছেন তা আমি ভুল বুঝছি? git checkout a839e8fপ্রতিশ্রুতিবদ্ধ নির্দেশ করার জন্য হেড আপডেট a839e8f
LarsH

67

তাদের সহজতম ফর্মটিতে, resetকার্যক্ষম গাছটিকে স্পর্শ না করে সূচি পুনরায় সেট করে, যখন সূচককে স্পর্শ না করে কার্যক্ষম গাছকে checkoutপরিবর্তন করে।

মিলের জন্য সূচি পুনরায় সেট করে HEAD, একা কাজ করা গাছ:

git reset

ধারণামূলকভাবে, এটি কার্যকারী গাছের মধ্যে সূচকটি পরীক্ষা করে। এটি আসলে কিছু করতে আপনাকে -fকোনও স্থানীয় পরিবর্তনগুলি ওভাররাইট করতে বাধ্য করতে হবে। "কোনও যুক্তি" ফর্মটি ধ্বংসাত্মক নয় তা নিশ্চিত করার জন্য এটি একটি সুরক্ষা বৈশিষ্ট্য:

git checkout

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

checkoutসাধারণত একটি শাখা, ট্যাগ বা প্রতিশ্রুতি দিয়ে ব্যবহৃত হয়। এই ক্ষেত্রে এটি পুনরায় সেট হবেHEAD এবং প্রদত্ত প্রতিশ্রুতিতে সূচকটি পাশাপাশি কার্যকারী গাছের মধ্যে সূচকটির চেকআউট সম্পাদন করবে।

এছাড়াও, যদি আপনাকে সরবরাহ --hardকরতে resetঅনুরোধ করতে পারেনreset কাজ গাছ ওভাররাইট পাশাপাশি সূচক রিসেট।

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

সরবরাহের পাথের অন্যান্য রূপ resetএবং commitজড়িত।

আপনি যদি পাথ সরবরাহ করেন তবে সরবরাহ resetকরতে পারবেন না --hardএবং resetসরবরাহিত পাথের সূচক সংস্করণ কেবল সরবরাহিত প্রতিশ্রুতি (বা HEADআপনি কোনও অঙ্গীকার নির্দিষ্ট না করলে) সংস্করণে পরিবর্তন করবেন will

আপনাকে পাথ সরবরাহ যদি checkout, মত resetএটা সরবরাহকৃত কমিট (অথবা মেলে সরবরাহকৃত পাথ সূচী সংস্করণ আপডেট হবে HEAD) কিন্তু এটা সবসময় কাজ গাছে সরবরাহকৃত পাথ সূচী সংস্করণ চেকআউট হবে।


2
এটি বলা অসত্য যে "চেকআউট" সূচী পরিবর্তন করে না: এটি যখন একটি শাখা থেকে অন্য শাখায় যাওয়ার জন্য ব্যবহৃত হয় তখন এটি পরিবর্তন করে।
wiki1000

তাদের সহজতম ফর্মটিতে, কার্যক্ষম গাছটিকে স্পর্শ না করে পুনরায় সেট করা সূচি পুনরায় সেট করে, যখন চেকআউট সূচকে স্পর্শ না করে কার্যকারী গাছকে পরিবর্তন করে। : কত বিভ্রান্তিকর: |
আদিত্য গুপ্ত

41

পরিবর্তনটি ফিরিয়ে
আনার সময় একটি সাধারণ ব্যবহারের কেস: ১. আপনি যদি কোনও পরিবর্তিত ফাইলের স্টেজিং পূর্বাবস্থায় ফিরিয়ে নিতে চান তবে রিসেটটি ব্যবহার করুন।
২. আপনি যদি স্টেস্ট না করা ফাইল / গুলি থেকে পরিবর্তনগুলি বাতিল করতে চান তবে চেকআউটটি ব্যবহার করুন।


1
নিখুঁত উত্তর. ধন্যবাদ.
ব্যবহারকারী 358591

11

সংক্ষেপে মূল পার্থক্য হ'ল reset বর্তমান শাখার রেফারেন্সটি সরিয়ে দেয় , যখনcheckout না (এটি হেডকে সরায়)।

প্রো গিট বইটি রিসেট ডেমাইসফাইডের অধীনে ব্যাখ্যা হিসাবে ,

প্রথম কাজটি resetহ'ল হেড যা দেখায় তা সরিয়ে নেওয়া । এটি নিজেই হেড পরিবর্তন করার মতো নয় (যা এটি checkoutকরে); reset প্রধান শাখাটি যে শাখাটি নির্দেশ করছে সেটিকে সরায় । এর অর্থ হ'ল যদি হেডটি masterশাখায় সেট করা থাকে (যেমন আপনি বর্তমানে masterশাখায় রয়েছেন ), দৌড়াতে পয়েন্টটি git reset 9e5e6a4তৈরি করে শুরু হবেmaster9e5e6a4 । [সামনে জোর দাও]

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

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


2
আমার পুরানো উত্তর ছাড়াও ভাল প্রতিক্রিয়া। +1
ভনসি

2

দুটি আদেশ (রিসেট এবং চেকআউট) সম্পূর্ণ পৃথক।

checkout X এটি না reset --hard X

যদি এক্স একটি শাখার নাম হয় checkout Xতবে বর্তমান শাখাটি পরিবর্তন reset --hard Xকরবে যখন তা করবে না।


2
তবে এক্স যদি কোনও ফাইল বা ফোল্ডার হয় তবে সেগুলি একই।
টেড বিঘাম

1

সংক্ষিপ্ত স্মৃতিবিজ্ঞান:

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