গিট: শাখা স্যুইচ করুন এবং প্রতিশ্রুতি না দিয়ে কোনও পরিবর্তন উপেক্ষা করুন


318

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

ত্রুটি: আপনার "X" এ স্থানীয় পরিবর্তন রয়েছে; শাখা পরিবর্তন করতে পারে না।

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


1
আমি বিশ্বাস করি এটি কেবল তখনই ঘটে যখন তাদের পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হওয়ার জন্য মঞ্চস্থ করা হয় তবে কমিট হয় না? গিট চেকআউট শাখা পরিবর্তন করার জন্য ঠিক কাজ করে যদি আপনি গিট অ্যাড বা এ জাতীয় ব্যবহার করে ফাইলগুলি স্টেজ না করেন।
জেরেমি ওয়াল

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

@ বোয়ফেরেল আপনি অস্থায়ীভাবে প্রতিশ্রুতি না দিয়ে পরিবর্তনগুলি সংরক্ষণ করতে 'গিট স্ট্যাশ' ব্যবহার করতে পারেন।
হাওিক্যাম্প


1
আপনি যখন পুরানো শাখায় কোনও পরিবর্তন না করে কোনও শাখায় স্যুইচ করেন, গিট নতুন শাখায় ফাইলগুলিতে পরিবর্তনগুলি মার্জ করার চেষ্টা করে। যদি কোনও সংঘাত ছাড়াই মার্জ করা হয় তবে সুইথিং শাখা সফল হবে এবং আপনি নতুন শাখায় পরিবর্তনগুলি দেখতে পাবেন। তবে যদি কোনও বিরোধ দেখা দেয় তবে আপনি পাবেন error: You have local changes to '<filename>'; cannot switch branches.এবং শাখা পরিবর্তন হবে না। আপনি git checkout -m <branch-name>শাখায় বিরোধগুলি এবং চেকআউটকে মার্জ করতে এবং নিজেকে দ্বন্দ্বগুলি সমাধান git checkout -f <branch-name>করতে বা পরিবর্তনগুলি উপেক্ষা করতে পারেন।
সমাদ মন্টাজেরি

উত্তর:


400

শাখা পরিবর্তন করার জন্য আপনার একটি পরিষ্কার রাষ্ট্র দরকার। শাখা চেকআউট কেবল তখনই অনুমোদিত হবে যখন এটি 'নোংরা ফাইলগুলিকে' প্রভাবিত করে না ( মন্তব্যগুলিতে চার্লস বেইলি মন্তব্য হিসাবে )।

অন্যথায়, আপনি হয় করা উচিত:

  • আপনার বর্তমান পরিবর্তন বা স্ট্যাশ
  • reset --hard HEAD (যদি আপনি এই ছোটখাটো পরিবর্তনগুলি হারাতে আপত্তি করেন না) বা
  • checkout -f (শাখাগুলি স্যুইচ করার সময়, সূচী বা কার্যক্ষম গাছটি হেড থেকে পৃথক হয়ে গেলেও এগিয়ে যান This এটি স্থানীয় পরিবর্তনগুলি ছুঁড়ে দেওয়ার জন্য ব্যবহৃত হয়))

বা, আরও সাম্প্রতিক:

সূচী বা কার্যক্ষম গাছটি হ্যাড থেকে পৃথক হয়ে গেলেও এগিয়ে যান।
উভয় সূচক এবং কার্যনির্বাহী গাছগুলি স্যুইচিং টার্গেটের সাথে মিলে যায়।

এটির থেকে পৃথক git switch -m <branch-name>, যা বর্তমান শাখা, আপনার কার্যক্ষম গাছের সামগ্রী এবং নতুন শাখার মধ্যে একটি ত্রি-মুখী সংশ্লেষকে সূচিত করে: আপনি আপনার কাজটি সেভাবেই ছাড়বেন না।


34
"শাখা পরিবর্তন করার জন্য আপনার একটি পরিষ্কার রাষ্ট্রের প্রয়োজন" " শাখার পরিবর্তনটি 'নোংরা ফাইলগুলিকে' প্রভাবিত করে তবেই সত্য।
সিবি বেইলি

10
স্ট্যাশ পদ্ধতির জন্য আমি "গিট স্ট্যাশ সেভ", "গিট চেকআউট অন্যান্যব্র্যাঞ্চ" টাইপ করেছি, তারপরে অবশেষে "গিট স্ট্যাশ পপ" টাইপ করেছি।
ভেঙ্কট ডি

1
বর্তমানে আমি এই ত্রুটি বার্তাটি দেখতে পাচ্ছি না এবং আমি যখন "গিট স্ট্যাটাস" করি তখন আমি একটি শাখায় যে পরিবর্তনগুলি করেছি তা অন্যটিতে প্রদর্শিত হয়। কিছু পরিবর্তন হয়েছে?
সেন্থিল এ কুমার

2
ধন্যবাদ। চেকআউট -ফ আমার প্রয়োজন ছিল। আমি গিট রিসেট করেছি
গার্ড ক্লিট-

1
এখানে একটি দুর্দান্ত বিষয় যা একটি শাখার প্রাথমিক সংজ্ঞা লঙ্ঘন করে গিট পুরোপুরি ভুল হয়ে গেছে। গিট ব্রাঞ্চের বিপরীতে অর্থ সংগ্রহস্থল থেকে দুটি পৃথক পৃথক ওয়ার্কস্পেস রয়েছে।
নেহেম

125

আপনি যদি এই পরিবর্তনগুলি বাতিল করতে চান,

git checkout -- <file>
git checkout branch

আপনি যদি পরিবর্তনগুলি রাখতে চান,

git stash save
git checkout branch
git stash pop

10
প্রকৃতপক্ষে কি Romerun বলছেন (সম্পূর্ণ হবে): git stash save(যখন শাখাময় কাজ) তাহলে git checkout branchXকিছু করতে git add/commit -mইত্যাদি git checkout branchYএবং git stash popলুকোবার জায়গা ফিরে পেতে
Highmastdon

2
হয়তো তাই. আমার একটি পরিস্থিতি আছে যেখানে আমি উত্তরটি যা বলেছি তা করতে চাইলে, যদি আমি এটি সঠিকভাবে বুঝতে পারি: স্ট্যাশ পরিবর্তন হয়, Y থেকে X এ পরিবর্তন করুন, তারপরে পপ পরিবর্তন করুন এবং তাদের এক্সে প্রতিশ্রুতিবদ্ধ করুন
বেন ক্লেইন

1
দয়া করে মনে রাখবেন git stash saveএখন পক্ষে অবচিতgit stash push
Argento

এই উপনামটি শাখা পরিবর্তন করার সময় পরিবর্তনগুলি রাখার ক্ষেত্রে সহজতর করে।
টম হেল

62

ভাল, এটা করা উচিত

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
হ্যাঁ, স্ট্যাশ বিশ্বব্যাপী, শাখা নির্দিষ্ট নয়, যদি আমি শাখার স্যুইচিংয়ের পরে পপকে স্ট্যাশ করি তবে আমি অন্য শাখার মতোই স্ট্যাশ পাব (এস)
আদিত্য মিত্তাল

6
উল্লেখ্য হওয়া উচিতgit stashgit stash save
চার্লি-গ্রিনম্যান

আপনাকে ধন্যবাদ, এটি আমার জন্য খুব সহায়ক
গোবিন্দ কুমার


16

মনে রাখবেন যে আপনি যদি দূরবর্তী শাখাগুলি মার্জ করে ফেলেছেন বা স্থানীয় কমিট করেছেন এবং দূরবর্তী হেডে ফিরে যেতে চান তবে আপনাকে অবশ্যই এটি করতে হবে:

git reset --hard origin/HEAD

HEAD একা কেবলমাত্র স্থানীয় প্রতিশ্রুতি / সংহতিকেই উল্লেখ করবে - বেশ কয়েকবার আমি ভুলে গিয়েছি যে "আপনার ভাণ্ডারটি X এর আগে কমিট করে .." পুনরায় সেট করার পরে শেষ হয় যখন আমি সমস্ত পরিবর্তন / প্রতিশ্রুতি রদ করার এবং দূরবর্তী শাখায় ফিরে যাওয়ার সম্পূর্ণ ইচ্ছা করি ।


9

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

git reset --hard HEAD

তারপরে, আপনি শাখাগুলি স্যুইচ করতে সক্ষম হবেন।


9

এই উত্তরগুলির কোনওটিই আমাকে সহায়তা করেনি কারণ আমার কাছে পুনরায় সেট করা এবং স্ট্যাশ করার পরেও তালিকার চিহ্নযুক্ত ফাইল ছিল। আমার করতেই হতো:

git reset --hard HEAD
git clean -d -f

4

পরিবর্তনগুলি হারাতে একটি নতুন শাখায় স্যুইচ করা:

git checkout -b YOUR_NEW_BRANCH_NAME --force

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

git checkout YOUR_BRANCH --force

4

সহজ উত্তর:

একটি শাখা চেকআউট জোর করা হয়

git checkout -f <branch_name>

একটি শাখা জোর করে পরীক্ষা করা গিটকে বলছে যে আপনি বর্তমান শাখায় যে সমস্ত পরিবর্তন করেছেন তা বাদ দিতে এবং কাঙ্ক্ষিতটিকে চেক আউট করতে হবে।

বা যদি আপনি কোন প্রতিশ্রুতি পরীক্ষা করছেন

git checkout -f <commit-hash>


"ভেবেছি প্রতিশ্রুতি না দিয়ে আমি শাখা বদলে ফেলতে পারি। যদি তাই হয় তবে কীভাবে আমি এটি স্থাপন করব? যদি তা না হয় তবে কীভাবে আমি এই সমস্যা থেকে মুক্তি পাব?"

এর উত্তরটি হ'ল না , এটি আক্ষরিক অর্থেই গিটের দর্শন যা আপনি সমস্ত পরিবর্তনের উপর নজর রাখেন এবং প্রতিটি নোড (অর্থাত্ প্রতিশ্রুতি) আপনার করা সর্বশেষ পরিবর্তনগুলির সাথে আপ-টু ডেট থাকতে হবে, যদি না আপনি না করেন অবশ্যই একটি নতুন প্রতিশ্রুতিবদ্ধ।


আপনি পরিবর্তন রাখা সিদ্ধান্ত নিয়েছে?

তারপরে তাদের ব্যবহার করে স্ট্যাশ করুন

git stash

এবং তারপরে কাঙ্ক্ষিত শাখায় আপনার পরিবর্তনগুলি আনস্ট্যাশ করতে, ব্যবহার করুন

git stash apply

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

git stash pop

এটি তার সমতুল্য applyএবং তারপরেdrop


2

টার্মিনালটি বন্ধ করুন, আপনার প্রকল্পটি যেখানে রয়েছে সেই ফোল্ডারটি মুছুন, তারপরে আপনার প্রকল্পটি আবার ক্লোন করুন এবং ভয়েইল করুন á


2
গিটটি আপনাকে প্রকল্পটি মুছতে এবং আবার ক্লোন করতে ধাক্কা দেওয়ার জন্য ডিজাইন করা হয়নি! আপনি যদি উত্স থেকে সর্বশেষতম সংস্করণ পেতে চান, আপনি ঠিক reset --hard!
আহমেদ নূর জামাল এল-দিন

2

আপনি যদি পরিবর্তনগুলি রাখতে চান এবং একটি একক লাইন কমান্ডে শাখা পরিবর্তন করতে চান

git stash && git checkout <branch_name> && git stash pop

1

একটি নতুন শাখায় নিঃশর্ত পরিবর্তনগুলি সরান

আমি এর .gitconfigজন্য একটি উপনাম তৈরি করেছি :

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

এতে পরিবর্তন করতে new-branch-name, ব্যবহার করুন:

git spcosp new-branch-name

এবং যে কোনও অপ্রচলিত ফাইল এবং সূচি পরিবর্তনগুলি রাখা হবে।


1

গিট চেকআউট-আপনার_ ব্র্যাঞ্চ_নাম

git checkout -f your_branch_name

আপনার যদি পরিবর্তনগুলি ফিরিয়ে আনতে সমস্যা হয়:

git checkout .

আপনি যদি ট্রেডবিহীন ডিরেক্টরি এবং ফাইলগুলি মুছতে চান:

git clean -fd

0

যখন গিট স্ট্যাশ কাজ করে না তখন পরিবর্তনগুলি না করে অন্য শাখায় স্যুইচ করতে। আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:

গিট চেকআউট -f শাখা-নাম

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