গিতে স্ট্যাশ পপটি বাতিল করা হচ্ছে


257

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

আমি চেষ্টা করেছি git merge --abort, কিন্তু গিট দাবি করেছে যে কোনও মার্জ চলছে না। ডিরেক্টরিটিতে আমি যে পরিবর্তনগুলি করেছি তা বিনষ্ট না করে পপ বন্ধ করার কী সহজ উপায় আছে?


আপনার অনির্দিষ্ট পরিবর্তনগুলির জন্য: এই পরিবর্তনগুলি কি ইতিমধ্যে সূচীতে ছিল?
jørgensen

আপনি যে গিট ব্যবহার করছেন তার সংস্করণটি কি পোস্ট করতে পারেন?
টিনম্যান


2
গৃহীত উত্তর জটিল দেখাচ্ছে। আমি মনে করি যে git stash popকোনও অশুচি কাজ করার চেষ্টা করার মতো চেষ্টা কখনও করার মতো সাধারণ অভ্যাস নয় । কোন ক্ষেত্রে আপনি সহজভাবে git reset --hardএবং আপনার স্ট্যাশ এখনও অক্ষত থাকতে পারে। (@ ব্র্যাডকোচের লিঙ্কযুক্ত বিষয়টি এটি কম-বেশি যা বোঝায়)
স্টিভেন লু

1
@ স্টিভেনলু, আমি সম্মত, তবে আপনি যদি পরিবর্তনগুলি আলাদা আলাদা শাখায় স্থানান্তরিত করার জন্য স্ট্যাশ করে থাকেন তবে বিষয়টি পরিষ্কার পরিশ্রমী দিরে দেখা দিতে পারে। পুরানো শাখায় বিদ্যমান নয় এমন নতুন শাখায় বিদ্যমান কমিটের সাথে স্ট্যাশ দ্বন্দ্ব রয়েছে।
জ্যাক স্টিভেনস-হাশ

উত্তর:


55

ঠিক আছে, আমি মনে করি আমি "গিট স্ট্যাশ আনপলি" ব্যবহার করে কাজ করেছি। এটা তোলে চেয়ে আরও বেশি জটিল git apply --reverseকারণ আপনার মার্জ কর্ম ক্ষেত্রে কোন দ্বারা সম্পন্ন মার্জ ছিল বিপরীত প্রয়োজন git stash apply

বিপরীত সংশ্লেষের জন্য সমস্ত বর্তমান পরিবর্তনগুলি সূচকে পুশ করা দরকার:

  • git add -u

তারপরে merge-recursiveযা করা হয়েছিল তা উল্টে দিন git stash apply:

  • git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1

এখন আপনাকে কেবল অ-স্ট্যাশ পরিবর্তন করা হবে। তারা সূচকে থাকবে। আপনি git resetচাইলে আপনার পরিবর্তনগুলি আনস্টেজ করতে ব্যবহার করতে পারেন।

আপনার আসল git stash applyব্যর্থ হয়ে গেছে বলে আমি ধরে নিয়েছি বিপরীতগুলিও ব্যর্থ হতে পারে যেহেতু এটি পূর্বাবস্থায় করতে চায় এমন কিছু কাজ শেষ হয়নি।

এখানে ওয়ার্কিং কপি (মাধ্যমে git status) কীভাবে আবার পরিষ্কার হয়ে যায় তা দেখানোর একটি উদাহরণ এখানে দেওয়া হয়েছে :

 $ git status
# On branch trunk
nothing to commit (working directory clean)
 $ git stash apply
Auto-merging foo.c
# On branch trunk
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
 $ git add -u
 $ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
 $ git status
# On branch trunk
nothing to commit (working directory clean)

2
এটি করার পরে, পূর্ববর্তী স্ট্যাশ করা সম্পাদনাগুলি কি চিরতরে হারিয়ে যাবে, বা সেগুলি আবার স্ট্যাশে ফিরে এসেছে?
ব্রায়ান এইচ।

7
git stash applyকখনই কোনও স্ট্যাশ ফোঁটায় না, এবং যখন git stash pop
মার্জটি

আসল স্ট্যাশ পপ চলাকালীন খারাপ জিনিসগুলি ঘটবে
3ocene

285

আমার ব্যবহারের কেস: সবেমাত্র ভুল শাখায় পপিংয়ের চেষ্টা করেছে এবং বিরোধ পেয়েছে। আমার যা দরকার তা হল পপটিকে পূর্বাবস্থায় ফিরিয়ে আনা তবে এটি স্ট্যাশ তালিকায় রাখা যাতে আমি এটিকে সঠিক শাখায় পপআপ করতে পারি। আমি এটা করেছি:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

সহজ।


22
সুতরাং আপনি যে স্ট্যাশ চান তা কোনও সফল পপ না হওয়া পর্যন্ত স্ট্যাশ তালিকায় থাকে?
রায়ান ক্লার্ক 21

52
এটি মূল প্রশ্নের উত্তর নয় কারণ এটি স্থানীয় পরিবর্তনগুলি মুছে ফেলবে যা প্রতিশ্রুতিবদ্ধ ছিল না।
দিমিত্রি

13
রেয়ানক্লার্ক নীচে ডেভিডজির উত্তর দেখুন। মূলত, হ্যাঁ, এটি স্ট্যাশ তালিকায় থাকে।
fkorsa

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

2
খুশী হলাম। এটি পড়ার পরে আমি গিট স্ট্যাশ পপ ডক্সের দিকে তাকিয়েছিলাম এবং এটিতে বলা হয়েছে "রাষ্ট্র প্রয়োগের ফলে বিরোধের সাথে ব্যর্থ হতে পারে; এক্ষেত্রে, এটি স্ট্যাশ তালিকা থেকে সরানো হয়নি।" সুতরাং, এই কারণেই স্ট্যাশ পুনরায় সেট করা / চেকআউট করার পরে পুনরায় পপ করতে সক্ষম।
ব্র্যাডি হল্ট

48

সম্পাদনা করুন: git help stashপপ বিভাগের ডকুমেন্টেশন থেকে :

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

যদি --index বিকল্পটি ব্যবহার করা হয়, তবে কেবলমাত্র কার্যকরী গাছের পরিবর্তনগুলিই নয়, সূচীর পরিবর্তনগুলিও পুনরুদ্ধার করার চেষ্টা করে। যাইহোক, এটি ব্যর্থ হতে পারে, যখন আপনার দ্বন্দ্ব রয়েছে (যা সূচীতে সঞ্চিত রয়েছে, যেখানে আপনি আর পরিবর্তনগুলি মূলত যেমন প্রয়োগ করতে পারবেন না)।

আপনার সমস্ত রেপোকে একটি নতুন দিরের সাথে হার্ডকপি করার চেষ্টা করুন (যাতে আপনার এটির একটি অনুলিপি থাকে) এবং চালান:

git stash show এবং যদি আপনি এটির যত্ন নেন তবে কোথাও সেই আউটপুটটি সংরক্ষণ করুন।

তারপরে: git stash dropপরস্পরবিরোধী স্ট্যাশ ফেলে দেওয়া:git reset HEAD

এটি আপনার রেপোটি আগের অবস্থায় রেখে দেওয়া উচিত (আশা করি, আমি এখনও আপনার সমস্যার প্রতিস্থাপন করতে সক্ষম হইনি)

===

আমি আপনার সমস্যাটিকে তিরস্কার করার চেষ্টা করছি তবে ইউএসইন করার সময় আমি যা পাই তা সবই git stash pop:

error: Your local changes to the following files would be overwritten by merge:
...
Please, commit your changes or stash them before you can merge.
Aborting

একটি পরিষ্কার দির মধ্যে:

git init
echo hello world > a
git add a & git commit -m "a"
echo hallo welt >> a
echo hello world > b
git add b & git commit -m "b"
echo hallo welt >> b
git stash
echo hola mundo >> a
git stash pop

আমার পরিবর্তনগুলি একীভূত করার চেষ্টা করছে না, এটি কেবল ব্যর্থ। আপনাকে সহায়তা করতে আমরা অনুসরণ করতে পারি এমন কোনও নিন্দিত পদক্ষেপ রয়েছে?


একটি পৃথক ফাইলে পরিবর্তনগুলি স্ট্যাশ করার চেষ্টা করুন।
asmeurer

একটি পৃথক ফাইলে স্ট্যাশ করার চেষ্টা করা কার্যকর হয়নি (নতুন তিরস্কার পদক্ষেপ দেখুন)। আমি কেবল ইস্যুটি
ত্রুটিযুক্ত

1
ওয়ার্কিং ডিরেক্টরিতে অনির্দিষ্ট পরিবর্তন থাকলে এই সমাধানটি কাজ করে না।
এখানে

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

1
আসল পরিস্থিতিটি হ'ল: 1) ফাইল এ। 2) স্ট্যাশ পরিবর্তন 3) ফাইল এ এ দ্বন্দ্বপূর্ণ পরিবর্তন করুন এবং প্রতিশ্রুতিবদ্ধ করুন (উদাহরণস্বরূপ একই লাইনটি পরিবর্তন করুন) 4) ফাইল বি পরিবর্তন করুন 5) 'গিট স্ট্যাশ পপ' করুন Do এখন আপনার দ্বন্দ্ব এবং স্থানীয় পরিবর্তন রয়েছে। সাধারণত এগুলি বিভিন্ন ফাইলে থাকবে তবে আপনি কখনই জানতে পারবেন না স্ট্যাশ থেকে কোন অ-বিরোধী পরিবর্তিত ফাইলগুলি এবং কোনটি স্থানীয় অস্থির পরিবর্তন।
দিমিত্রি

16

আমি সবসময় ব্যবহার করেছি

git reset --merge

আমি কখনও এটি ব্যর্থ মনে করতে পারি না।


@ গৌরবপালিওয়াল, আমি পরের বার এই চেহারা দেব git reset। আপনি কি জানেন যে এটি কার্যত অভিন্ন কিনা git reset --merge?
কেন সেবেস্তা

5

আপনার করা অন্য যে কোনও পরিবর্তন সম্পর্কে যদি আপনার চিন্তা না করতে হয় এবং আপনি কেবল শেষ প্রতিশ্রুতিতে ফিরে যেতে চান তবে আপনি এটি করতে পারেন:

git reset .
git checkout .
git clean -f

4

ঠিক আছে, আমি মনে করি আমি এমন একটি কাজের প্রবাহ খুঁজে পেতে পরিচালিত করেছি যা আপনাকে যেখানে দরকার সেখানে ফিরে পাবে (যেন আপনি পপটি করেন নি)।

পূর্বে একটি ব্যাকআপ নিন !! এটি আপনার পক্ষে কাজ করবে কিনা তা আমি জানি না, সুতরাং আপনার পুরো রেপোটি যদি কাজ না করে তবেই এটি অনুলিপি করুন।

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

git mergetool

2) এই পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন (সেগুলি ইতিমধ্যে মার্জেটুল কমান্ডের মাধ্যমে যুক্ত করা হবে)। এটিকে "মার্জ" বা কোনও কিছু মনে আছে এর প্রতিশ্রুতিবদ্ধ বার্তা দিন।

git commit -m "merge"

3) এখন আপনার প্যাচ থেকে নতুন প্রতিশ্রুতি নিয়ে শুরুতে আপনার স্থানীয় অ-স্টেজেড পরিবর্তনগুলি হবে (আমরা পরে এটি থেকে মুক্তি পেতে পারি)। এখন আপনার স্টেস্টেড পরিবর্তনগুলি করুন

git add .
git add -u .
git commit -m "local changes"

4) প্যাচ বিপরীত। এটি নিম্নলিখিত কমান্ড দিয়ে করা যেতে পারে:

git stash show -p | git apply -R

5) এই পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:

git commit -a -m "reversed patch"

6) প্যাচ / আনপ্যাচ কমিটগুলি থেকে মুক্তি পান

git rebase -i HEAD^^^

এটি থেকে, এতে 'মার্জ' এবং 'বিপরীত প্যাচ' দিয়ে দুটি লাইন সরান।

)) আপনার অযাচিত পরিবর্তনগুলি ফিরে পান এবং 'স্থানীয় পরিবর্তনগুলি' প্রতিশ্রুতি পূর্বাবস্থায় ফিরিয়ে আনুন

git reset HEAD^

আমি এটি একটি সাধারণ উদাহরণ দিয়ে চালিয়েছি এবং এটি যেখানে আপনি থাকতে চান সেখানে ফিরে যায় - স্থানীয়ভাবে পরিবর্তিত হওয়া এবং স্ট্যাশ এখনও পপ করার জন্য উপলব্ধ থাকায় স্ট্যাশ পপ হওয়ার আগে সরাসরি।


যদি এটি বেশ কার্যকর না হয়, আশা করি এটি আপনাকে বেশিরভাগ পথেই পাবেন! :-)
এজেন্টগোঞ্জো

git stash show -p | git apply -Rএটি যদি git stash applyসত্যিকারের মার্জ করে তবে তা কাজ করে না । আমার উত্তর দেখুন ...
বেন জ্যাকসন

3

আমি কিছুটা ভিন্ন উপায়ে এটি সমাধান করেছি। এখানে কি ঘটেছে।

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

একটি সাধারণ git reset HEADবিরোধ বিরোধ নিষ্পত্তি বাতিল করে দিয়েছে এবং অনির্ধারিত (এবং অবাঞ্ছিত ) পরিবর্তনগুলি রেখে গেছে।

বেশ কয়েকটি git co <filename>সূচকে প্রাথমিক অবস্থায় ফিরিয়ে দেয়। অবশেষে, আমি git co <branch-name>একটি নতুন শাখা পরিবর্তন করেছি এবং কোনও নতুন চালাব git stash pop, যা বিরোধ ছাড়াই সমাধান হয়েছে।


2

কিছু ধারণা:

  • git mergetoolএকত্রীকরণ ফাইলগুলি মূল এবং নতুন অংশগুলিতে বিভক্ত করতে ব্যবহার করুন । আশা করি এর মধ্যে একটি হ'ল এটির মধ্যে আপনার অ-স্ট্যাশ পরিবর্তনগুলির সাথে ফাইল।

  • বিপরীতে স্ট্যাশগুলির ভিন্নতা প্রয়োগ করুন, কেবল সেই পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে। মার্জ সংঘাতের সাথে আপনাকে সম্ভবত ম্যানুয়ালি ফাইলগুলি বিভক্ত করতে হবে (যা আশা করি উপরের কৌশলটি কাজ করবে)।

আমি এগুলির একটিও পরীক্ষা করিনি, সুতরাং তারা কাজ করবে কিনা তা আমি নিশ্চিতভাবে জানি না।


1

আমি git stash popনির্লিপ্ত পরিবর্তন সহ "নোংরা" ডিরেক্টরিতে পরিষ্কার প্রজনন করতে পারতাম , তবে এখনও পপ করতে পারছি না যা মার্জ সংঘাত সৃষ্টি করে।

তাহলে একত্রীকরণ সংঘাত লুকোবার জায়গা আপনি আবেদন করতে অদৃশ্য হয়ে করা হয়নি চেষ্টা, আপনি পরীক্ষা করার চেষ্টা করতে পারেন git show stash@{0}(বৈকল্পিকভাবে এর সঙ্গে --oursবা --theirs) এবং সঙ্গে তুলনা git statisএবং git diff HEAD। কোনও স্ট্যাশ প্রয়োগ করে কোন পরিবর্তন এসেছে তা আপনি দেখতে সক্ষম হবেন।


1

যদি ডেভিডজি সঠিক হয় যে মার্জ সংঘাতের কারণে এটি স্ট্যাশটিকে পপ করেনি, তবে আপনাকে কেবল আপনার কার্যক্ষম ডিরেক্টরিটি পরিষ্কার করতে হবে। git commitআপনার যত্ন নেওয়া সমস্ত কিছু দ্রুত । (আপনি সম্পন্ন না হলে আপনি resetবা squashপরে প্রতিশ্রুতিবদ্ধ করতে পারেন)) তারপরে আপনি সুরক্ষার যত্ন নেওয়ার সাথে, আপনার কার্য ডিরেক্টরিতে ফেলে দেওয়া git resetসমস্ত কিছু everythinggit stash pop


1

যদি git stash popপ্রশ্নের মতো আগে কোনও পর্যায়ক্রমে পরিবর্তন না হয় তবে নিম্নলিখিত দুটি কমান্ডের কাজ করা উচিত।

git diff --name-only --cached | xargs git checkout --ours HEAD
git ls-tree stash@{0}^3 --name-only | xargs rm

প্রথমটি স্ট্যাশ থেকে কোনও মার্জকে বিপরীত করে, সফল কিনা or দ্বিতীয়টি স্ট্যাশ দ্বারা প্রবর্তিত যেকোন অন্রে্যাকড ফাইল মুছে দেয়।

থেকে man git stash: The working directory must match the index. কোনটি ডেভিডজি উল্লেখ করেছে, stash popবর্তমানে কোনও স্টেস্টেড না পরিবর্তিত ফাইলের বিরোধ থাকলে তা ব্যর্থ হবে। এই হিসাবে, আমাদের ফিরে পাওয়ার বাইরে মেশানো দ্বন্দ্বগুলি উদ্বিগ্ন সম্পর্কে চিন্তা করার দরকার নেই HEAD। অন্য কোনও পরিবর্তিত ফাইলগুলি তখন স্ট্যাশের সাথে সম্পর্কিত নয়, এবং এর আগে সংশোধিত হয়েছিলstash pop

যদি মঞ্চ পরিবর্তন হয়, আমরা একই কমান্ডগুলিতে নির্ভর করতে পারি এবং আপনি @ বেন জ্যাকসনের কৌশলটি চেষ্টা করতে চাইতে পারেন সে বিষয়ে আমি অস্পষ্ট। পরামর্শ প্রশংসা ..

এখানে https://gist.github.com/here/4f3af6dafdb4ca15e804 বিভিন্ন ক্ষেত্রে সকলের জন্য একটি পরীক্ষার সেটআপ দেওয়া হচ্ছে

# Result:
# Merge succeeded in m (theirs)
# Conflict in b
# Unstaged in a
# Untracked in c and d

# Goal:
# Reverse changes to successful merge m
# Keep our version in merge conflict b
# Keep our unstaged a
# Keep our untracked d
# Delete stashed untracked c

আমি মনে করি এটি এখন পর্যন্ত সবচেয়ে সঠিক উত্তর। খুব ভাল চিন্তা।
এজেন্ট শুক্রবার

0

git reflogআপনার গিট ইতিহাসে সমস্ত পরিবর্তন তালিকাভুক্ত করতে ব্যবহার করুন । কোনও অ্যাকশন আইডি অনুলিপি করুন এবং টাইপ করুনgit reset ACTION_ID


2
পপ করার আগে গিট একটি রিফ্লগ এন্ট্রি তৈরি করে না (আপনার কমিট করা দরকার)
কেসব্যাশ

-1

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

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