গিটে কীভাবে বাদ পড়া স্ট্যাশ পুনরুদ্ধার করবেন?


1733

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

আমি জানি যে আমি যদি git stashতখন .git / refs / stash ব্যবহার করি তবে স্ট্যাশ তৈরির জন্য ব্যবহৃত প্রতিশ্রুতির রেফারেন্স থাকে । এবং .git / লগস / রেফ / স্ট্যাশগুলিতে পুরো স্ট্যাশ থাকে। কিন্তু সেই রেফারেন্সগুলি পরে চলে গেছে git stash pop। আমি জানি যে প্রতিশ্রুতিটি এখনও কোথাও আমার ভান্ডারে রয়েছে তবে আমি জানি না এটি কী ছিল।

গতকালের স্ট্যাশ কমিট রেফারেন্সটি পুনরুদ্ধার করার কোনও সহজ উপায় আছে কি?

মনে রাখবেন যে এটি আজ আমার পক্ষে সমালোচিত নয় কারণ আমার দৈনিক ব্যাকআপ রয়েছে এবং আমার পরিবর্তনগুলি পেতে গতকালের কার্যকারী ট্রিতে ফিরে যেতে পারি। আমি জিজ্ঞাসা করছি কারণ একটি সহজ উপায় থাকতে হবে!


74
ভবিষ্যতের জন্য দ্রষ্টব্য: আপনি যদি প্রতিবার স্ট্যাশগুলি হারাতে না চান তবে আপনি পরিবর্তে এটি git stash popকরতে পারেন git stash apply। এটি একই জিনিসটি বাদ দেয়, এটি প্রয়োগকৃত স্ট্যাশের রেফারেন্সটি সরিয়ে না ফেলে।
কেভিন

3
এখানে সবকিছু চেষ্টা করে, ইতিমধ্যে পপ করা হয়েছে এমন কোনও স্ট্যাশ খুঁজে পেল না। ইন্টেলিজিজের জেটব্রিনস
হুয়ান মেন্ডেস


আমার এই সমস্যা ছিল আমার রেপো আপডেট করতে, আমি দৌড়ে git stash, git pull -r upstream, git push -f origin, git stash pop, এবং পপ বলেন, "মারাত্মক: refs জন্য লগ / লুকোবার জায়গা খালি হয়"। These আমি এই উত্তরগুলির একগুচ্ছ চেষ্টা করেছি, কিছুই কার্যকর হয়নি। আমি যখন .git / refs / stash এ দেখলাম তখন এসএইচএ সেখানে ছিল। অফলাইন সিঙ্কের জন্য উইন্ডোজ নেটওয়ার্ক ড্রাইভ চিহ্নিত করতে কোনও সমস্যা হতে পারে? ♂️‍♂️
ব্রায়ানারি

উত্তর:


2781

আপনি যখন স্ট্যাশ প্রতিশ্রুতিটি ফেলেছিলেন তার হ্যাশটি জানার পরে আপনি এটি স্ট্যাশ হিসাবে প্রয়োগ করতে পারেন:

git stash apply $stash_hash

অথবা, আপনি এটির জন্য এটির জন্য একটি পৃথক শাখা তৈরি করতে পারেন

git branch recovered $stash_hash

এর পরে, আপনি সমস্ত সাধারণ সরঞ্জাম দিয়ে যা খুশি করতে পারেন। আপনার কাজ শেষ হয়ে গেলে, কেবল শাখাটি উড়িয়ে দিন।

হ্যাশ সন্ধান করা

যদি আপনি কেবল এটি পপ করেন এবং টার্মিনালটি এখনও খোলা থাকে তবে আপনার git stash popপর্দায় হ্যাশ মানটি মুদ্রিত হবে (ধন্যবাদ, ডলডা)।

অন্যথায়, আপনি এটি লিনাক্স, ইউনিক্স বা উইন্ডোজের জন্য গিট ব্যাশের জন্য এটি ব্যবহার করে দেখতে পাবেন:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

... বা উইন্ডোজের জন্য পাওয়ারশেল ব্যবহার:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

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

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

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

... অথবা উইন্ডোজের জন্য পাওয়ারশেল ব্যবহার করা হলে এম্র্যাগিন থেকে উত্তরটি দেখুন ।

এটি রিপোজিটরি ব্রাউজার চালু করবে যেটি আপনার কাছে পৌঁছনীয় কিনা তা বিবেচনা না করেই সর্বদা সংগ্রহের প্রতিটি প্রতিশ্রুতি প্রদর্শন করে

আপনি কোনও আলাদা GUI অ্যাপ্লিকেশনটির মাধ্যমে কনসোলটিতে একটি দুর্দান্ত গ্রাফ পছন্দ gitkকরেন এমন কিছু দিয়ে আপনি সেখানে প্রতিস্থাপন করতে পারেন git log --graph --oneline --decorate

স্ট্যাশ কমিটস স্পট করতে, এই ফর্মটির প্রতিশ্রুতিবদ্ধ বার্তাগুলি সন্ধান করুন:

কিছুসংখ্যক         ডাব্লুআইপি : কম্যাশ কিছু পুরানো প্রতিশ্রুতি বার্তা

দ্রষ্টব্য : প্রতিশ্রুতি বার্তাটি কেবল এই ফর্মটিতে থাকবে ("ডাব্লুআইপি চালু" দিয়ে শুরু) আপনি যখন কোনও বার্তা সরবরাহ না করে থাকেন git stash


49
জয়দেল আমার মুখ থেকে শব্দটি বের করে নিল। এই পোস্টটি আমার কাজটি বাঁচিয়েছে :) আমি কেবল যুক্ত করতে চাই - আপনি যা হারিয়েছিলেন তার জন্য আপনি যে তারিখে কাজ করেছেন তার তারিখটি মনে করে আপনি যা খুঁজছেন তার জন্য গিটক ব্রাউজ করা সহজ করে দেয়।
শ্রীধর সারনোবাত

4
@ কোডে: কারণ পাওয়ারশেল। আমি জানি না যে MsysGit কোনও AWK বাইনারি পাঠায় কিনা। গুগলিং আমাকে বলেছে যে পাওয়ারশেলের সেই কমান্ডের %{ $_.Split(' ')[2]; }সমতুল্য কিছু করা উচিত , তবে এটি পরীক্ষা করার জন্য আমার কাছে উইন্ডোজ সিস্টেম নেই এবং অংশটির জন্য আপনার এখনও সমতুল্য প্রয়োজন । যাইহোক, কেবল চালান এবং আউটপুট দেখুন। আপনি হ্যাশগুলি "ঝুঁকিপূর্ণ প্রতিশ্রুতি <commitID>" লাইন থেকে চান। {print $3}awk/dangling commit/git fsck --no-reflog
অ্যারিস্টটল পাগাল্টজিস

7
এটি উল্লেখ করার মতো যে প্রতিশ্রুতিবদ্ধ বার্তাটিতে কেবল "ডাব্লুআইপি" স্ট্রিং থাকবে যদি আপনি স্ট্যাশিংয়ের সময় নিজের বার্তা সরবরাহ না করেন (অর্থাত্ করে git stash save "<message>")।
সমীর আগুইয়ার

12
আপনি যদি জানেন যে ড্রপটি কখন ঘটেছিল, সময় বাড়িয়ে আপনি ঝুঁকির কমিটগুলির তালিকা পেতে এই ওয়ান-লাইনারটি ব্যবহার করতে পারেন: git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sortশেষ এন্ট্রি সম্ভবত আপনি চান এটিই stash apply
ris8_allo_zen0

3
git stash apply {ref}একটি বাদ দেওয়া স্ট্যাশ পুনরুদ্ধার! gitএটি এত বড় যে এটি অবৈধ হওয়া উচিত!
টম রাসেল

707

আপনি যদি টার্মিনালটি বন্ধ না করে থাকেন তবে কেবল আউটপুটটি দেখুন git stash popএবং আপনার কাছে বাদ দেওয়া স্ট্যাশের আইডিটি থাকবে। এটি সাধারণত এটির মতো দেখাচ্ছে:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(দ্রষ্টব্য যা git stash dropএকই লাইনের উত্পাদন করে))

এই স্ট্যাশ ফিরে পেতে, কেবল চালান git branch tmp 2cae03e, এবং আপনি এটি একটি শাখা হিসাবে পাবেন। এটিকে স্ট্যাশে রূপান্তর করতে, চালান:

git stash apply tmp
git stash

এটি একটি শাখা হিসাবে থাকা আপনাকে এটিকে অবাধে ম্যানিপুলেট করার অনুমতি দেয়; উদাহরণস্বরূপ, এটি চেরি-বাছাই করতে বা এটি মার্জ করতে।


54
এছাড়াও আপনি কি করতে পারেন git stash apply commitidতারপর git stashএকটি নতুন লুকোবার জায়গা জন্য।
ম্যাথু ফ্ল্যাশেন

32
মনে রাখবেন যে যদি গিট স্ট্যাশকে স্বয়ংক্রিয়ভাবে মার্জ করে এবং এতে দ্বন্দ্ব থাকে, তবে এটি আপনাকে হ্যাশটি দেখায় না।
জেমস

31
@ জেমস: তারপরে আবার, যদি এই দ্বন্দ্বগুলি চলমান ফলাফল হয় তবে তা কোনওভাবেই স্ট্যাশকে ছাড়বে git stash popনা, সুতরাং এটি সাধারণত কোনও সমস্যা নয়।
Dolda2000

2
আমার গিট স্ট্যাশ পপ আউটপুটে কোনও এসএইচএ ছিল না। :(
অ্যাকাউন্ট

2
@ মধু: এটাই মূল বিষয় git stash pop। আপনি যদি স্ট্যাশটি না ফেলেই প্রয়োগ করতে চান তবে git stash applyপরিবর্তে ব্যবহার করুন। অধিকন্তু, আপনি যদি কয়েকটি শাখায় পরিবর্তন প্রয়োগ করতে চান তবে আপনি পরিবর্তে কমিটিকে চেরি-বাছাই করতে পারেন।
দোলডা 2000

271

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

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

আমি যখন গিটে নতুন ছিলাম তখন এটি আমার কাছে পরিষ্কার ছিল না এবং আমি "গিট শো", "গিট প্রয়োগ", "প্যাচ" ইত্যাদির বিভিন্ন সংমিশ্রণের চেষ্টা করছিলাম


3
মনে রাখবেন যে এটি চলমান কার্যকারী গাছের জন্য স্ট্যাশ (দুহ!) প্রযোজ্য। যদি গাছটি নোংরা হয় তবে আপনি প্রথমে কোনও অস্থায়ী শাখা ব্যবহার করতে পারেন বা স্ট্যাশ করতে পারেন, এসএএএএ -1 থেকে স্ট্যাশ প্রয়োগ করুন, আবার স্ট্যাশ করুন এবং তারপরে দ্বিতীয়টিকে শেষ স্ট্যাশ-এ পপ করুন (স্ট্যাশ @ {1 called বলা হয়)।
musiKk

110

আপনার স্টোরেজগুলিতে থাকা স্ট্যাশগুলির তালিকা পাওয়ার জন্য, তবে আর অ্যাক্সেসযোগ্য নয়:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

আপনি যদি নিজের স্ট্যাশকে কোনও শিরোনাম দিয়ে থাকেন তবে -grep=WIPআপনার বার্তার একটি অংশের সাহায্যে কমান্ডের শেষে "ডাব্লুআইপি" প্রতিস্থাপন করুন -grep=Tesselation

কমান্ডটি "ডাব্লুআইপি"-র জন্য গ্রেপিং করছে কারণ স্ট্যাশগুলির জন্য ডিফল্ট প্রতিশ্রুতি বার্তা ফর্মটিতে রয়েছে WIP on mybranch: [previous-commit-hash] Message of the previous commit.


1
প্রতিধ্বনি 'git fsck - unreachable | গ্রেপ কমিট | কাট-ডি "" -ফ 3 | xargs গিট লগ - ডুবে - না-হাঁটা --grep = ডব্লিউআইপি '> / ইউএসআর / স্থানীয় / বিন / গিট-স্ট্যাশলগ; চিএমড এ + আরএক্স / ইউএসআর / স্থানীয় / বিন / গিট-স্ট্যাশলগ # গিট স্ট্যাশলগ
এরিক মার্টিনো

অথবা আপনি এটি আপনার .gitconfig এ একটি উপন্যাস হিসাবে যুক্ত করতে পারেন (ক এর সাথে কমান্ডের আগে !)।
asmeurer

আমার বেকন সংরক্ষণ করেছেন - সত্যই নয় তবে দিনের কাজগুলি আমাকে পুনরায় কোডিংয়ে বাঁচিয়েছে - প্রশংসা করেছে - যে আমি সম্প্রতি ফেলেছি আমি কেবল আপনার আদেশের আউটপুট থেকে শীর্ষ এসএইচএ বেছে নিয়েছি - তারপরে .... গিট স্ট্যাশ এসএইচএ প্রয়োগ করুন ... অন্যান্য
উত্তরে

75

আমি সবেমাত্র একটি কমান্ড তৈরি করেছি যা আমাকে আমার হারানো স্ট্যাশ প্রতিশ্রুতি খুঁজে পেতে সহায়তা করেছিল:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

এটি .git / অবজেক্ট গাছের সমস্ত বস্তু তালিকাভুক্ত করে, প্রতিশ্রুতিবদ্ধ টাইপের মতো লোকগুলি সনাক্ত করে, তারপরে প্রতিটিটির সংক্ষিপ্তসার দেখায়। এই জায়গা থেকে এটি একটি উপযুক্ত "কাজের উপর ডাব্লুআইপি: 6a9bb2" ("কাজ" আমার শাখা, 619bb2 একটি সাম্প্রতিক প্রতিশ্রুতি) সন্ধানের জন্য কমিটগুলি অনুসন্ধান করার বিষয় ছিল।

আমি নোট করেছি যে আমি যদি "গিট স্ট্যাশ পপ" এর পরিবর্তে "গিট স্ট্যাশ অ্যাপ্লিকেশন" ব্যবহার করি তবে আমার এই সমস্যাটি হবে না এবং যদি আমি "গিট স্ট্যাশ সেভ বার্তা " ব্যবহার করি তবে কমিটটি সন্ধান করা আরও সহজ হত।

আপডেট: নাথনের ধারণার সাথে, এটি আরও খাটো হয়ে উঠবে:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less

41

git fsck --unreachable | grep commitsha1 প্রদর্শন করা উচিত, যদিও তালিকাটি এটি ফিরে আসে এটি বেশ বড়। git show <sha1>এটি যদি আপনি চান প্রতিশ্রুতিবদ্ধ তা প্রদর্শন করবে।

git cherry-pick -m 1 <sha1> কমিটকে বর্তমান শাখায় মার্জ করে দেবে।


37

উইন্ডোজ পাওয়ারশেলের সমতুল্য গিটক ব্যবহার করে:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

একটি পাইপে এটি করার সম্ভবত আরও কার্যকর উপায় আছে তবে এটি কাজ করে।


1
আমি আপনার উত্তরের জন্য খুব কৃতজ্ঞ
Шебаниц

32

আপনি যদি কোনও হারিয়ে যাওয়া স্ট্যাশ পুনঃস্থাপন করতে চান তবে আপনাকে প্রথমে আপনার হারানো স্ট্যাশের হ্যাশটি খুঁজে পাওয়া দরকার।

যেমন অ্যারিস্টটল প্যাগাল্টজিস পরামর্শ দিয়েছে একটি git fsckআপনাকে সহায়তা করা উচিত।

ব্যক্তিগতভাবে আমি আমার log-allউপনামটি ব্যবহার করি যা পরিস্থিতি সম্পর্কে আরও ভাল দৃষ্টিভঙ্গি দেখতে আমাকে প্রতিটি প্রতিশ্রুতি (পুনরুদ্ধারযোগ্য কমিট) দেখায়:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

আপনি যদি কেবল "ডাব্লুআইপি অন" বার্তাগুলি সন্ধান করেন তবে আপনি আরও দ্রুত অনুসন্ধান করতে পারেন।

আপনি একবার আপনার sha1 জানাজানি হয়ে গেলে, পুরাতন স্ট্যাশ যুক্ত করতে আপনি কেবল নিজের স্ট্যাশ রিফ্লোগ পরিবর্তন করে:

git update-ref refs/stash ed6721d

আপনার সম্ভবত কোনও যুক্ত বার্তা থাকতে পছন্দ হবে তাই এ -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

এবং আপনি এটি একটি উপাধিকার হিসাবে ব্যবহার করতে চাইবেন:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1

2
তবে হওয়া -d\\ উচিত -d\ (বা আরও পরিষ্কার -d' ')
joeytwizz

একটি ত্রুটি পেয়েছে: "মারাত্মক: দ্বিধাহীন যুক্তি 'ঝোলা': অজানা সংশোধন বা পথ কার্যকারী গাছের মধ্যে নেই" "
ড্যানিয়েল রায়ান

আপনার উদ্ধৃতি সহ উপ-কমান্ডও আবৃত করতে হবে git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721
আন্দ্রে শোস্টিক

18

আমি অ্যারিস্টটলের এপ্রোচ পছন্দ করেছি, তবে জিআইটিকে ব্যবহার করা পছন্দ করিনি ... কারণ আমি কমান্ড লাইন থেকে জিআইটি ব্যবহার করতে অভ্যস্ত।

পরিবর্তে, আমি আমার কোড সম্পাদকে পর্যালোচনার জন্য ঝুঁকির কমিটগুলি নিয়ে কোডটি একটি ডিআইএফএফ ফাইলে আউটপুট করি।

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

এখন আপনি ফলস্বরূপ ডিফ / টিএসটি ফাইলটি (এটি আপনার হোম ফোল্ডারের মধ্যে) আপনার টিএসটি এডিটরে লোড করতে পারেন এবং আসল কোড এবং ফলাফল এসএএএ দেখতে পারেন।

তারপরে শুধু ব্যবহার করুন

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

17

টার্মিনালে এই কমান্ডটি লিখে আপনি সমস্ত অপ্রজেয় কমিটের তালিকা করতে পারেন -

git fsck --unreachable

অ্যাক্সেসযোগ্য কমিট হ্যাশ পরীক্ষা করুন -

git show hash

স্ট্যাশড আইটেমটি খুঁজে পেলে শেষ পর্যন্ত আবেদন করুন -

git stash apply hash

15

লোকেরা কেন এই প্রশ্ন জিজ্ঞাসা করে? কারণ তারা এখনও রিফলগ সম্পর্কে জানে না বা বুঝতে পারে না।

এই প্রশ্নের বেশিরভাগ উত্তর প্রায়শই মনে রাখবে না বিকল্পগুলির সাথে দীর্ঘ কমান্ড দেয়। সুতরাং লোকেরা এই প্রশ্নে আসবে এবং তাদের যা প্রয়োজন মনে করে তা অনুলিপি করুন এবং প্রায় সাথে সাথে তা ভুলে যান।

আমি এই প্রশ্নের সাথে প্রত্যেককে কেবল রিফ্লগ (গিট রিফ্লগ) চেক করার পরামর্শ দেব, এর চেয়ে বেশি কিছু নয়। একবার আপনি যদি সমস্ত প্রতিশ্রুতিবদ্ধতার তালিকাটি দেখতে পান তবে আপনি কী প্রতিশ্রুতিবদ্ধ তা সন্ধান করার এবং এটির চেরি-বাছাই বা এখান থেকে একটি শাখা তৈরি করার একশো উপায় রয়েছে। প্রক্রিয়াটিতে আপনি বিভিন্ন বেসিক গিট কমান্ডের রিফ্লগ এবং দরকারী বিকল্পগুলি সম্পর্কে জানতে পারবেন।


1
হাই রবি এটি প্রাসঙ্গিক যদি আপনি কাজ করছিলেন, পাশের ট্র্যাক পেয়েছেন এবং কয়েক সপ্তাহ আগে আপনি যেখানে রেখেছিলেন সেখানে ফিরে যাওয়া দরকার কেবলমাত্র আপনি নিজের স্ট্যাশড কাজটি খুঁজে পেতে পারেন না তা শিখতে - এটি সম্ভবত অন্য জিনিসগুলির মধ্যে কোথাও হারিয়ে গেছে না হবে. এটি সাম্প্রতিক ইতিহাস হলে রিফ্লগ দুর্দান্ত তবে দীর্ঘ সময়ের ব্যবধানের জন্য নয়।
এমরগিনস

1
আরে এমরগিনস, আমি সম্মত, তবে এটি ছিল ঠিক ওপির ব্যবহারের ক্ষেত্রে। এখানে পোস্ট করা অন্যান্য কমান্ডগুলি কীভাবে আচরণ করবে তা আমি নিশ্চিতভাবে জানি না, তবে আমার গিয়াসটি হ'ল যে তার স্ট্যাশড কমিটের রেফারেন্স সাফ হয়ে গেলে তারা কাজ করাও বন্ধ করে দিত।
রবিবিডি 20'17

1
হুম ... উপরের দৃশ্যপটটিই আমাকে এই প্রশ্নে নিয়ে এসেছিল এবং আমি জানি যে আমি (অজান্তেই) আমার স্ট্যাশ হারিয়েছি এবং যখন আমি এটি পুনরুদ্ধার করতে পেরেছিলাম তার মধ্যে এক মাসের বেশি না হলেও এটি অন্তত কয়েক সপ্তাহ ছিল was
এমরগিনস

15

ওএসএক্স-এ গিট ভি ২..6.৪ সহ, আমি ঘটনাক্রমে গিট স্ট্যাশ ড্রপ চালাই, তারপরে আমি এটি নীচে পদক্ষেপের নীচে গিয়ে খুঁজে পেয়েছি

যদি আপনি স্ট্যাশটির নাম জানেন তবে ব্যবহার করুন:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

অন্যথায় আপনি নিজে থেকে ফলাফলটি থেকে আইডি পাবেন:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

তারপরে আপনি যখন কমিট-আইডিটি পেয়েছেন কেবল গিট স্ট্যাশকে হিট করবেন apply কমিট-আইডি}

আশা করি এটি দ্রুত কাউকে সহায়তা করবে


12

আমি সমস্ত পরিবর্তন পরিবর্তন করার জন্য গ্রহণযোগ্য সমাধানটিতে আরও একটি ভাল উপায় যুক্ত করতে চাই, যখন আপনার কাছে গিটক নেই বা আউটপুট জন্য কোনও এক্স নেই।

git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits

for h in `cat tmp_commits`; do git show $h | less; done

তারপরে আপনি সেই হ্যাশগুলির জন্য একের পর এক প্রদর্শিত সমস্ত ডিফগুলি পাবেন। পরের পার্থক্যের জন্য 'q' টিপুন।


12

আমি একটি সাধারণ কমান্ড উইন্ডোতে উইন্ডোজে কাজ করার কোনও উত্তর পেতে পারি না (আমার ক্ষেত্রে উইন্ডোজ।) awk, grepএবং Select-stringকমান্ড হিসাবে স্বীকৃত ছিল না। সুতরাং আমি একটি ভিন্ন পদ্ধতির চেষ্টা করেছি:

  • প্রথম রান: git fsck --unreachable | findstr "commit"
  • আউটপুটটি নোটপ্যাডে অনুলিপি করুন
  • এর সাথে "অ্যাক্সেসযোগ্য কমিট" প্রতিস্থাপন করুন start cmd /k git show

এরকম কিছু দেখাবে:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • .bat ফাইল হিসাবে সংরক্ষণ করুন এবং এটি চালান
  • স্ক্রিপ্ট প্রতিটি প্রতিশ্রুতি দেখিয়ে কমান্ড উইন্ডোগুলির একটি গুচ্ছ খুলবে
  • আপনি যা সন্ধান করছেন তা যদি খুঁজে পান তবে চালান: git stash apply (your hash)

সেরা সমাধান নাও হতে পারে, তবে আমার জন্য কাজ করেছে


আপনি উইন্ডোজ এমনকি গিট ব্যাশ ব্যবহার করতে পারেন। গিট ব্যাশে আপনার প্রয়োজনীয় সমস্ত (ইউনিক্সয়েড) কমান্ড লাইন সরঞ্জাম রয়েছে।
অ্যাড্রিয়ান ডাব্লু

10

অ্যারিস্টটলের গৃহীত উত্তরটি স্ট্যাশ-নন-মতো কমিট সহ সমস্ত পৌঁছনীয় কমিটগুলি দেখায়। শব্দটি ফিল্টার করতে:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

এর মধ্যে কেবলমাত্র কমিটস অন্তর্ভুক্ত থাকবে যার ঠিক 3 জন পিতামাতার কমিট রয়েছে (যা কোনও স্ট্যাশ থাকবে) এবং যার বার্তায় "ডাব্লুআইপি অন" অন্তর্ভুক্ত রয়েছে।

মনে রাখবেন, আপনি যদি কোনও বার্তা (উদাহরণস্বরূপ git stash save "My newly created stash") দিয়ে আপনার স্ট্যাশ সংরক্ষণ করেন তবে এটি ডিফল্ট "ডাব্লুআইপি অন ..." বার্তাটিকে ওভাররাইড করবে।

আপনি প্রতিটি প্রতিশ্রুতি সম্পর্কে আরও তথ্য প্রদর্শন করতে পারেন, উদাহরণস্বরূপ প্রতিশ্রুতি বার্তা প্রদর্শন করুন, বা এটিকে পাস করুন git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

6

আমার প্রিয় এই ওয়ান-লাইনার:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

এটি মূলত এই উত্তর হিসাবে একই ধারণা তবে অনেক খাটো। অবশ্যই, আপনি --graphগাছের মতো ডিসপ্লে পেতে যোগ করতে পারেন।

আপনি যখন তালিকাতে প্রতিশ্রুতিটি পেয়েছেন, তখন আবেদন করুন

git stash apply THE_COMMIT_HASH_FOUND

আমার জন্য, --no-reflogsব্যবহারটি হারানো স্ট্যাশ এন্ট্রি প্রকাশ করেছে, কিন্তু --unreachable(অন্যান্য অনেক উত্তরে যেমন পাওয়া যায়) তা দেয় নি।

আপনি যখন উইন্ডোজ এর অধীনে থাকেন তখন এটিকে গিট ব্যাশে চালান।

ক্রেডিট: উপরের আদেশগুলি বিশদ https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf থেকে নেওয়া হয়েছে


5

নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করে এটি পুনরুদ্ধার করেছেন:

  1. মুছে ফেলা স্ট্যাশ হ্যাশ কোডটি সনাক্ত করুন:

    gitk - all $ (git fsck --no-reflog | awk '/ dangling কমিট / {মুদ্রণ $ 3}')

  2. চেরি স্ট্যাশ পিক করুন:

    গিট চেরি-পিক-মি 1 $ স্ট্যাশ_হ্যাশ_কোড

  3. যদি কোনও ব্যবহার হয় তবে বিরোধগুলি সমাধান করুন:

    গিট মার্জারুল

অতিরিক্ত হিসাবে আপনি জঞ্জাল ব্যবহার করছেন যদি আপনার প্রতিশ্রুতিবদ্ধ বার্তা সমস্যা হতে পারে। পরবর্তী বিকল্পগুলি অনুসরণ করার আগে দয়া করে আপনার পরিবর্তনগুলি স্ট্যাশ করুন:

  1. পূর্ববর্তী প্রতিশ্রুতিগুলিতে হার্ড রিসেট ব্যবহার করুন এবং তারপরে এই পরিবর্তনটি পুনরায় স্বীকার করুন।
  2. আপনি পরিবর্তনকে পুনরায় স্ট্যাটাস, পুনর্নির্মাণ এবং পুনঃসংশোধনও করতে পারেন।

@ miva2 আপনার সম্পাদনা এই প্রশ্নের সবচেয়ে সঠিক উত্তরের লিঙ্কটি সরিয়ে দিয়েছে। মন্তব্যে লিঙ্কটি যুক্ত করে ফিরে যুক্ত করুন stackoverflow.com/questions/89332/…
অভিজিৎ

4

আমি এখানে যা খুঁজছিলাম তা হ'ল আমি যা যা পরীক্ষা করে দেখেছি তা নির্বিশেষে কীভাবে প্রকৃতপক্ষে ফিরে আসা যায়। বিশেষত, আমি কিছু স্থির করেছিলাম, তারপরে একটি পুরানো সংস্করণ পরীক্ষা করেছিলাম, তারপরে এটি পপ করেছি, তবে স্ট্যাশ সেই আগের সময়ের বিন্দু ছিল না, সুতরাং স্ট্যাশটি অদৃশ্য হয়ে গেল; আমি কেবল git stashস্ট্যাকের পিছনে এটি ঠেলাতে পারি না । এটি আমার পক্ষে কাজ করেছে:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

পূর্ববর্তী ক্ষেত্রে, আমি git stash applyনা ব্যবহার করা উচিত ছিল git stash pop। আমি একটি করছিলাম bisectএবং একটি সামান্য প্যাচ ছিল যা আমি প্রতিটি bisectপদক্ষেপে প্রয়োগ করতে চেয়েছিলাম । এখন আমি এটি করছি:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.

এটি কি উত্তর, নাকি প্রশ্নের ধারাবাহিকতা?
অ্যালেক্স ব্রাউন

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