গিট স্ট্যাশ: "নোংরা কাজের গাছের জন্য প্রয়োগ করা যাবে না, দয়া করে আপনার পরিবর্তনগুলি মঞ্চ করুন"


133

আমি পূর্বে স্তরে রাখা পরিবর্তনগুলি প্রয়োগ করার চেষ্টা git stash popকরছি এবং বার্তাটি পাই:

Cannot apply to a dirty working tree, please stage your changes

কীভাবে মোকাবেলা করতে হবে তার কোনও পরামর্শ?

উত্তর:


196

যখন আমাকে কোনও নোংরা ওয়ার্কিং কপিতে স্ট্যাশড পরিবর্তনগুলি প্রয়োগ করতে হবে, উদাহরণস্বরূপ স্ট্যাশ থেকে একাধিক চেঞ্জসেট পপ করুন, আমি নিম্নলিখিতটি ব্যবহার করি:

$ git stash show -p | git apply -3 && git stash drop

মূলত এটি

  1. একটি প্যাচ তৈরি করে
  2. পাইপ যে প্রয়োগ কমান্ড
  3. যদি কোনও দ্বন্দ্ব থাকে তবে তাদের ত্রি-মুখী মার্জ করে সমাধান করা দরকার
  4. প্রয়োগ (বা মার্জ) সফল হলে এটি কেবল প্রয়োগ হওয়া স্ট্যাশ আইটেমটি ফেলে দেয় ...

আমি ভাবছি কেন এমন কোনও -f(বল) বিকল্প নেই git stash popযার জন্য উপরের ওয়ান-লাইনের মতো ঠিক আচরণ করা উচিত।

ইতিমধ্যে আপনি এই ওয়ান-লাইনারকে গিট ওরফে হিসাবে যুক্ত করতে চাইতে পারেন:

$ git config --global --replace-all alias.unstash \
   '!git stash show -p | git apply -3 && git stash drop'
$ git unstash

@ সামহ্যাসলারকে -3প্যারামিটারটি নির্দেশ করার জন্য ধন্যবাদ যা 3-উপায় মার্জয়ের মাধ্যমে বিরোধগুলি সরাসরি সমাধান করতে দেয়।


এর git stash show -p | git applyচেয়ে আলাদা কি git stash apply?
ফ্যাক্টর মিস্টিক

1
জো ফ্যাক্টর, git stash applyআপনার যদি নোংরা কাজের অনুলিপি থাকে তবে স্ট্যাশড পরিবর্তনগুলি প্রয়োগ করবেন না। সুতরাং আপনি দেখতে পাচ্ছেন git stash show -p | git applyযে কোনও ধরণের জোর করে স্ট্যাশ প্রয়োগ করা হচ্ছে।
muhqu

1
সহায়তা করে না তবে সহায়তা: গিট রিসেট হেড এবং তারপরে পরিবর্তনগুলি আনস্ট্যাশ করুন।
রজার এলিয়েন

4
আমি "ত্রুটি পেয়েছি: প্যাচ ব্যর্থ হয়েছে ... প্যাচ প্রয়োগ হয় না" ফাইলগুলির মধ্যে একটির জন্য। আমি আশা করি এটি একীভূত সংঘাত দেয়।
আলেকসান্দ্র ডাবিনস্কি

1
এই সমাধানটি আমার পক্ষে কার্যকর হয়নি, এটি error: <file> does not match indexপ্রতিটি পরিবর্তিত ফাইলের জন্য ব্যর্থ হয়েছিল। তবে, আরও একটি সমাধান কাজ করেছে।
সিলভেনন

57

আমি এটি এইভাবে করি:

git add -A
git stash apply

এবং তারপরে (alyচ্ছিক):

git reset

2
+1 টি! এটি অন্যান্য সমাধানগুলির চেয়ে সহজ যা প্যাচগুলি উত্পন্ন করে বা কমিটগুলি সংশোধন করে এবং আপনার স্থানীয় পরিবর্তনগুলি প্রয়োগকৃত স্ট্যাশ পরিবর্তনগুলি থেকে নিরাপদে আলাদা করে রাখে যতক্ষণ না আপনি নিশ্চিত হন যে পরিবর্তনগুলি সঠিকভাবে মার্জ হয়েছে।
পিটারফ্লিন

আমি ত্রুটি পেয়েছি "... ইতিমধ্যে উপস্থিত রয়েছে, কোনও চেকআউট নেই ... স্ট্যাশ থেকে অনিরত ফাইলগুলি পুনরুদ্ধার করতে পারেনি"
আলেকসান্ডার ডাবিনস্কি

2
আমি ব্যবহার করেছি git add -u, যা -Aএটির তালিকা ছাড়াই থাকা ফাইলগুলি যুক্ত না করে।
ব্র্যাড কাপিট

9

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

উদাহরণস্বরূপ, বলুন যে আপনি কোনও নোংরা গাছে স্ট্যাশ @ {0} প্রয়োগ করতে চান:

  1. প্যাচ হিসাবে স্ট্যাশ @ {0 port রফতানি করুন:

    গিট স্ট্যাশ শো -p স্ট্যাশ @ {0}> Stash0.patch

  2. পরিবর্তনগুলি ম্যানুয়ালি প্রয়োগ করুন:

    গিট আবেদন Stash0.patch

যদি দ্বিতীয় পদক্ষেপ ব্যর্থ হয় তবে কোনও ত্রুটি সমাধানের জন্য আপনাকে Stash0.patch ফাইলটি সম্পাদনা করতে হবে এবং তারপরে আবার গিট প্রয়োগের চেষ্টা করতে হবে।


এটি সেই ক্ষেত্রে ব্যবহারিক এবং কার্যক্ষম যে আমি একটি দিরের উপর রিফ্যাক্টরিং তৈরি করেছি (এটি সরিয়ে দিয়েছি এবং এর নামের সাথে একটি সিমলিংক তৈরি করেছি)। আমার কাজের কপির পরিবর্তনগুলি কী ছিল তা গিট বলতে পারেনি।
ইয়াক্লিয়ান

1
এটি দুর্দান্ত কাজ করেছে। আমি নিশ্চিত যে আমার কার্যকারী গাছটি পরিষ্কার আছে যদিও আমি স্ট্যাশ প্রয়োগ করতে পারিনি।
শিকি

হ্যাঁ, আমাকে বাইনারি ফাইল সম্পর্কে লাইনগুলি সরিয়ে ফেলতে হয়েছিল।
ডোরিয়ান

8

হয় গিট রিসেট দিয়ে আপনার ওয়ার্কিং ডিরেক্টরিটি পরিষ্কার করুন, পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন বা আপনি যদি বর্তমান পরিবর্তনগুলি স্ট্যাশ করতে চান তবে চেষ্টা করুন:

current গিট স্ট্যাশ "বর্তমান পরিবর্তনের বর্ণনা" সংরক্ষণ করে
it গিট স্ট্যাশ পপ স্ট্যাশ @ {1}

এটি বর্তমান পরিবর্তনগুলি স্ট্যাশ করবে এবং তারপরে স্ট্যাশ স্ট্যাক থেকে দ্বিতীয় স্ট্যাশকে পপ করবে।


5
তবে এই লোকটি দুটি স্ট্যাশ প্রয়োগ করতে চায়!
এলাজার লাইবোভিচ

@ ইলজার আপনি প্রশ্নটি পড়ছেন। ওপি কেবল পূর্ববর্তী স্ট্যাশ প্রয়োগ করতে চায়। যদি আপনি সঠিক হন যে বর্তমান পরিবর্তনগুলি রাখা উচিত, তবে সমাধানটি পুনরাবৃত্তি হতে পারে: পপ, প্রতিশ্রুতিবদ্ধ, পুনরাবৃত্তি।
উইলিয়াম পার্সেল

আমি মনে করি তিনি উভয়কেই বিনা চাপাতে চান want তবে তারপরে, তিনি তাদের দু'বার প্রতিশ্রুতিবদ্ধ করতে এবং তাদের একক প্রতিশ্রুতিতে স্কোয়াশ করতে পারেন।
এলাজার লাইবোভিচ

আমি ত্রুটি পেয়েছি "... ইতিমধ্যে উপস্থিত আছে, কোনও চেকআউট নেই ... স্ট্যাশ থেকে অনিরত ফাইলগুলি পুনরুদ্ধার করতে পারেনি"
আলেকসান্ডার ডাবিনস্কি

6

ম্যাথিয়াসের সমাধানটি অবশ্যই গিট স্ট্যাশ পপ - ফোর্সের সবচেয়ে নিকটতম (এবং সত্যই, সিমন গিট দেবস, আসুন ইতিমধ্যে এই বিকল্পটি পান!)

তবে, আপনি যদি কেবল গিট কমান্ড ব্যবহার করে একই জিনিস করতে চান তবে আপনি এটি করতে পারেন:

  1. গিট কমিট -a-মি "ফিক্সমে"
  2. গিট স্ট্যাশ পপ
  3. গিট কমিট - এ - এমেন্ড
  4. গিট রিসেট হেড ~

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

** সম্পাদনা করুন * *

আমি ঠিক বুঝতে পেরেছি যে এটি আসলে আরও সহজ; আপনি সম্পূর্ণ পদক্ষেপ 3 এড়িয়ে যেতে পারেন, তাই ...

  1. গিট কমিট -a-মি "ফিক্সমে"
  2. গিট স্ট্যাশ পপ
  3. গিট রিসেট হেড ~

(বর্তমান পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন, স্ট্যাশড পরিবর্তনগুলি পপ অফ করুন, পুনরায় সেট করুন যা প্রথমে পুনরায় সেট করুন উভয় সেট পরিবর্তিত অবস্থায় স্থিতিশীল করার জন্য প্রতিশ্রুতিবদ্ধ))


4

আমি আজকের মতো করে নিজেকে এই পরিস্থিতিতে যদি নিজেকে খুঁজে পাই তবে এই উত্তরগুলির কোনওটিই বাস্তবে কাজ করে না। কত তথাপি git reset --hard's আমি, আমার কোথাও না পেয়েছিলাম। আমার উত্তর (কোনও উপায়ে অফিসিয়াল ছিল না):

  1. স্ট্যাশের হ্যাশ ব্যবহারটি চিত্রিত করুন git reflog --all
  2. আপনার আগ্রহী শাখার সাথে সেই হ্যাশটি মার্জ করুন

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

4

আমি ম্যাথিয়াস লেপ্পিশের দুর্দান্ত কাজ করার সমাধানও পেয়েছি সুতরাং আমি এটির জন্য আমার বিশ্বব্যাপী .gitconfig এর জন্য একটি উপনাম যুক্ত করেছি

[alias]
        apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop

এখন আমি টাইপ করতে পারি

git apply-stash-to-dirty-working-tree

যা আমার পক্ষে দুর্দান্ত কাজ করে।

(আপনার মাইলেজটি এই দীর্ঘ উপনামের নাম অনুসারে আলাদা হতে পারে But


3

আপনি যে git addকোনও পরিবর্তন করেছেন সেভাবে গাছ পরিষ্কার করে "নোংরা" গাছে একটি স্ট্যাশ প্রয়োগ করতে পারেন । তারপরে আপনি git stash popস্ট্যাশড পরিবর্তনগুলি প্রয়োগ করতে পারেন এবং কোনও সমস্যা নেই।


2

আপনার কাছে এমন ফাইল রয়েছে যা সংশোধিত হয়েছে তবে প্রতিশ্রুতিবদ্ধ নয়। উভয় ক্ষেত্রেই:

git reset --hard HEAD (to bring everything back to HEAD)

বা, আপনি যদি নিজের পরিবর্তনগুলি সংরক্ষণ করতে চান:

git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop

1
@ মাইককুপার - আমি মনে করি যে প্রতিশ্রুতিবদ্ধ হওয়ার আগে আপনি যা কিছু যোগ করতে চান তার যুক্তি কেবল তারই ছিল।
স্কিরিরাস

0

আমারও একই সমস্যা ছিল কিন্তু গিটের শূন্য পরিবর্তিত ফাইল ছিল। দেখা যাচ্ছে আমার কাছে একটি ইনডেক্স.লক ফাইল ছিল যা প্রায় পড়ে ছিল। এটি মুছে ফেলা সমস্যার সমাধান করে।


0

আমি এগুলির বেশিরভাগ কাজ করতে পারিনি; কোনও কারণে এটি সর্বদা মনে করে যে আমার কোনও ফাইলে স্থানীয় পরিবর্তন আছে। আমি কোনও স্ট্যাশ প্রয়োগ করতে পারি না, প্যাচগুলি প্রয়োগ হবে না checkoutএবং reset --hardব্যর্থ হবে। অবশেষে যা কাজ করেছিল তা হ'ল স্ট্যাশকে একটি শাখা হিসাবে সংরক্ষণ করা git stash branch tempbranchnameএবং তার পরে একটি সাধারণ শাখা মার্জ করা: git checkout masterএবং git merge tempbranchnameHttp://git-scm.com/book/en/Git- টুলস- স্ট্যাশিং থেকে :

যদি আপনি স্ট্যাশড পরিবর্তনগুলি আবার পরীক্ষা করার সহজ উপায় চান তবে আপনি গিট স্ট্যাশ শাখা পরিচালনা করতে পারেন যা আপনার জন্য একটি নতুন শাখা তৈরি করে, আপনি যখন আপনার কাজটি স্তব্ধ করেছিলেন তখন আপনি যে প্রতিশ্রুতিটি করেছিলেন তা পরীক্ষা করে, সেখানে আপনার কাজটি পুনরায় প্রয়োগ করে এবং তারপরে ড্রপগুলি ফেলে দেয় এটি সফলভাবে প্রযোজ্য হলে স্ট্যাশ

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