গিট স্ট্যাশ পপ কেন বলছে যে এটি স্ট্যাশ এন্ট্রি থেকে অনিরীক্ষিত ফাইলগুলি পুনরুদ্ধার করতে পারেনি?


94

আমার বেশ কয়েকটি স্টেজেড এবং স্টেস্টেড পরিবর্তন নেই এবং আমি দ্রুত অন্য একটি শাখায় স্যুইচ করতে চাই এবং তারপরে ফিরে যেতে চাই।

সুতরাং আমি আমার পরিবর্তনগুলি ব্যবহার করে মঞ্চস্থ করেছি:

$ git stash push -a

(অন্ধকারে আমি সম্ভবত এর --include-untrackedপরিবর্তে ব্যবহার করতে পারতাম --all)

তারপরে আমি যখন স্ট্যাশ পপ করতে যাই তখন আমি এর লাইনগুলিতে পুরো অনেক ত্রুটি পাই get

$ git stash pop
foo.txt already exists, no checkout
bar.txt already exists, no checkout
...
Could not restore untracked files from stash entry

স্ট্যাশ থেকে কোনও পরিবর্তন পুনরুদ্ধার হবে বলে মনে হচ্ছে না।

আমি চেষ্টাও করেছি $ git stash branch tempকিন্তু এটি একই ত্রুটিগুলি দেখায়।

আমি এর আশেপাশে একটি উপায় বের করেছি যা ব্যবহার করা হয়েছিল:

$ git stash show -p | git apply

আপত্তি আপাতত এড়ানো হয়েছে তবে এটি কিছু প্রশ্ন উত্থাপন করে।

কেন এই ত্রুটিটি প্রথম স্থানে ঘটেছিল এবং আমি কীভাবে এটিকে পরবর্তী সময়ে এড়াতে পারি?


29
আমাকে ব্যবহার করতে হয়েছিল:git stash show -p | git apply --3
xmedeko

4
আমার পক্ষে একমাত্র কাজ হ'ল অ্যাবোভ কমেন্ট !!
মেহরাজ মালিক

4
ধন্যবাদ @ এক্সমেডেকো, যে কেউ গিট স্ট্যাশ শো -p এর মধ্যে পার্থক্য বলতে পারে গিট প্রয়োগ এবং গিট স্ট্যাশ শো -p | গিট প্রয়োগ --3?
দীপক মোহনদাস

4
আপনি আতঙ্কিত হবেন, তাহলে শুধু সঙ্গে আপনার stashed ফাইলের তালিকা git stash showও উদ্ধার ফাইল একের পর এক চেয়ে: $ git show stash@{0}:your/stashed/file.txt > your_rescued_file.txt। এটি স্ট্যাশ থেকে ফাইল পাবে এবং এটি অন্য নামে সংরক্ষণ করবে। এখন আপনি যথাযথ উদ্ধার পদ্ধতি পরীক্ষা করতে নিরাপদ (নীচের উত্তর দেখুন)। যদি জিনিসগুলি বিপথে চলে যায় তবে সর্বদা আপনার সর্বশেষ উত্স হিসাবে আপনার উদ্ধারকৃত ফাইলগুলি রয়েছে।
দানিজেল

বাহ, ধন্যবাদ @ xmedeko! আবার আপনার মন্তব্যটি একমাত্র কাজ করেছিল এবং এটি খুব সহজ ছিল। +1!
পিসিদেব

উত্তর:


99

কিছুটা অতিরিক্ত ব্যাখ্যা হিসাবে, নোট যেটি git stashদুটি করে তোলে, বা তিনটি কমিট করে। ডিফল্ট দুটি; আপনি তিনটি পাবেন যদি আপনি কোনও বিকল্প --allবা --include-untrackedবিকল্পগুলির বানান ব্যবহার করেন ।

এই দুটি বা তিনটি কমিটগুলি একটি গুরুত্বপূর্ণ উপায়ে বিশেষ: এগুলি কোনও শাখায় নেই। গিট তাদের বিশেষ নামের মাধ্যমে চিহ্নিত করে stash1 সবচেয়ে গুরুত্বপূর্ণ বিষয়, যদিও, কি গীত আপনি-এবং দেয় তোলে এই দুই বা তিন করে সঙ্গে আপনি-না। এটি বুঝতে আমাদের এই কমিটিগুলির মধ্যে কী আছে তা খতিয়ে দেখতে হবে।

স্ট্যাশ এর ভিতরে কি আছে

প্রতিটি প্রতিশ্রুতিবদ্ধ এক বা একাধিক পিতামাতার কমিটের তালিকা করতে পারে । এগুলি একটি গ্রাফ তৈরি করে, যেখানে পরবর্তীতে পূর্বেরগুলিতে ফিরে আসে। স্ট্যাশ সাধারণত দুটি কমিট করে, যা আমি iসূচক / স্টেজিং-এরিয়া বিষয়বস্তু এবং wওয়ার্ক-ট্রি সামগ্রীর জন্য কল করতে পছন্দ করি । প্রতিটি কমিট একটি স্ন্যাপশট ধারণ করে তাও মনে রাখবেন। একটি সাধারণ প্রতিশ্রুতিতে, এই স্ন্যাপশটটি সূচি / স্টেজিং-এরিয়া বিষয়বস্তু থেকে তৈরি করা হয়। সুতরাং iপ্রতিশ্রুতিবদ্ধতা একটি নিখুঁত স্বাভাবিক অঙ্গীকার! এটি কেবল কোনও শাখায় নয়:

...--o--o--o   <-- branch (HEAD)
           |
           i

আপনি যদি কোনও সাধারণ স্ট্যাশ তৈরি করেন তবে git stashকোডটি wএখন আপনার সমস্ত ট্র্যাকড ওয়ার্ক-ট্রি ফাইলগুলি (একটি অস্থায়ী সহায়ক সূচীতে) অনুলিপি করে। Git সেট করে এই প্রথম পিতা বা মাতা wবিন্দু সমর্পণ করতে HEADকমিট, এবং বিন্দু দ্বিতীয় পিতা বা মাতা সমর্পণ করতে i। সর্বশেষে, এটি stashএই wপ্রতিশ্রুতিতে নির্দেশ করে :

...--o--o--o   <-- branch (HEAD)
           |\
           i-w   <-- stash

আপনি যদি যোগ করেন --include-untrackedবা --all, গিট uতৈরি করার সময় iএবং এর মধ্যে একটি অতিরিক্ত কমিট করে w। এর জন্য স্ন্যাপশট বিষয়বস্তু uহ'ল সেই ফাইলগুলি যা তালাবিহীন কিন্তু উপেক্ষা করা হয় না ( --include-untracked), বা এমন ফাইলগুলি যা এড়ানো যায় না এমনকি যদি তা উপেক্ষা করা হয় ( --all)। এই অতিরিক্ত uকমিট হয়েছে কোন পিতা বা মাতা, এবং তারপর যখন git stashতোলে w, এটা সেট করে wএর তৃতীয় পিতা বা মাতা এই uকমিট, যাতে আপনি পাবেন:

...--o--o--o   <-- branch (HEAD)
           |\
           i-w   <-- stash
            /
           u

গিট এছাড়াও এই মুহুর্তে, প্রতিশ্রুতিতে ক্ষতিকারক যে কোনও ওয়ার্ক-ট্রি ফাইলগুলি সরিয়ে দেয়u (এটি ব্যবহার git cleanকরে)।

স্ট্যাশ পুনরুদ্ধার করা হচ্ছে

আপনি যখন কোনও স্ট্যাশ পুনরুদ্ধার করতে যান , আপনার কাছে এটি ব্যবহার করার --indexবা না ব্যবহার করার বিকল্প রয়েছে । এটি git stash apply(বা অভ্যন্তরীণভাবে ব্যবহৃত কোনও কমান্ডের মধ্যে applyযেমন কোনও pop) বলছে যে এটি আপনার বর্তমান সূচকটি সংশোধন করার চেষ্টা করার প্রতিশ্রুতি ব্যবহার করবে i। এই পরিবর্তনটি এর সাথে সম্পন্ন করা হয়:

git diff <hash-of-i> <hash-of-i's-parent> | git apply --index

(কম-বেশি; এখানে মৌলিক ধারণাটি পেয়ে যায় এমন একগুচ্ছ বিশদ বিবরণ রয়েছে)।

আপনি বাদ তাহলে --index, git stash applyসম্পূর্ণরূপে উপেক্ষা করে iকমিট।

যদি স্ট্যাশের কেবল দুটি কমিট থাকে git stash applyতবে এখন wকমিট প্রয়োগ করতে পারেন। এটা তোলে কল করে এই আছে git merge2 (এটা কমিট বা স্বাভাবিক একত্রীকরণ হিসাবে ফলাফলের আচরণ করতে সক্ষম হবেন ছাড়া), মূল কমিট যার উপর লুকোবার জায়গা সেটা ব্যবহার ( i'র পিতা বা মাতা, এবং wএর প্রথম পিতা বা মাতা) একত্রীকরণ বেস হিসাবে, wযেমন --theirsপ্রতিশ্রুতিবদ্ধ এবং আপনার বর্তমান (HEAD) সংযুক্তির লক্ষ্য হিসাবে প্রতিশ্রুতিবদ্ধ। যদি মার্জটি সফল হয় তবে সবকিছু ভাল — ভাল, কমপক্ষে গিটও তাই মনে করে — এবং git stash applyনিজেই সফল হয়। আপনি ব্যবহার করে থাকেন git stash popলুকোবার জায়গা প্রয়োগ করতে, কোড এখন ড্রপ লুকোবার জায়গা। 3 যদি মার্জটি ব্যর্থ হয়, গিট অ্যাপ্লিকেশনটিকে ব্যর্থ হয়েছে বলে ঘোষণা করে। আপনি যদি ব্যবহারgit stash pop, কোডটি স্ট্যাশ ধরে রাখে এবং একই ব্যর্থতার স্থিতি প্রদান করে git stash apply

তবে আপনার যদি সেই তৃতীয় প্রতিশ্রুতি থাকে — যদি uআপনি যে স্ট্যাশ ব্যবহার করছেন তার মধ্যে যদি কোন কমিট থাকে — তবে বিষয়গুলি পরিবর্তন হয়! কমিটের uঅস্তিত্ব নেই এমন ভান করার কোনও বিকল্প নেই। 4 গিট সেই প্রতিশ্রুতি থেকে সমস্ত ফাইলকে uবর্তমান কার্য-বৃক্ষে সরানোর জন্য জোর দিয়েছিল । এর অর্থ এই যে ফাইলগুলি অবশ্যই অস্তিত্বহীন নয় বা প্রতিশ্রুতি অনুসারে একই বিষয়বস্তু থাকা উচিত u

এটি হওয়ার জন্য, আপনি git cleanনিজেই ব্যবহার করতে পারেন — তবে মনে রাখবেন যে গিট সংগ্রহস্থলের অভ্যন্তরে অচিহ্নযুক্ত ফাইলগুলির (উপেক্ষা করা বা না) কোনও অস্তিত্ব নেই, তাই নিশ্চিত হয়ে নিন যে এই ফাইলগুলি সমস্ত ধ্বংস হতে পারে! অথবা, আপনি অস্থায়ী ডাইরেক্টরি করতে, এবং সেখানে জিম্মা-বা এমনকি অন্য কি জন্য ফাইল স্থানান্তর করতে পারেন git stash save -uবা git stash save -aথেকে ঐ চালানো হবে git cleanআপনার জন্য। তবে এটি আপনাকে uপরবর্তী সময়ে মোকাবেলার জন্য অন্য স্টাইলের স্ট্যাশ সহ ছেড়ে দেয় ।


1 এটি আসলে refs/stash। আপনি যদি নামে একটি শাখা তৈরি করেন তবে এটি গুরুত্বপূর্ণ stash: শাখার পুরো নাম refs/heads/stash, সুতরাং এগুলি বিরোধে নয়। তবে এটি করবেন না: গিট কিছু মনে করবে না, তবে আপনি নিজেকে বিভ্রান্ত করবেন। :-)

2git stash কোড আসলে ব্যবহার git merge-recursiveসরাসরি এখানে। এটি একাধিক কারণে প্রয়োজনীয়, এবং আপনি যখন বিরোধগুলি সমাধান করেন এবং প্রতিশ্রুতিবদ্ধ হন তখন গিট এটি একীভূত হিসাবে বিবেচনা করে না তা নিশ্চিত করার পার্শ্ব প্রতিক্রিয়াও রয়েছে।

3 এ কারণেই আমি এড়িয়ে চলার git stash popপক্ষে পরামর্শ দিচ্ছি git stash apply। কী প্রয়োগ হয়েছে তা পর্যালোচনা করার সুযোগ পান এবং এটি আসলে সঠিকভাবে প্রয়োগ হয়েছিল কিনা তা স্থির করুন । যদি তা না হয় তবে আপনার কাছে এখনও স্ট্যাশ রয়েছে যার অর্থ আপনি git stash branchসবকিছুকে পুরোপুরি পুনরুদ্ধার করতে ব্যবহার করতে পারেন । ঠিক আছে, অনুমান করে যে এই সমস্যাযুক্ত uপ্রতিশ্রুতিবদ্ধতার অভাব ।

4 সত্যই আছে: git stash apply --skip-untrackedবা কিছু হতে হবে । একটি বৈকল্পিকও হওয়া উচিত যার অর্থ এই সমস্ত uপ্রতিশ্রুতিবদ্ধ ফাইলগুলি একটি নতুন ডিরেক্টরিতে ফেলে দেওয়া , যেমন git stash apply --untracked-into <dir>, সম্ভবত।


8
আশ্চর্যজনকভাবে উত্তর। এটি লেখার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। অনেক কিছু শিখেছি!
স্টিনিবোট

এই ব্যাখ্যা একটি নায়ক ব্যাজ প্রাপ্য। এত বড় বিস্তারিত রাখার জন্য ধন্যবাদ!
লুকাস ফোলার

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

4
আমি সমস্যার সমাধান বুঝতে ব্যর্থ। এটা শুধু যোগ করা হয় --index: git stash apply --index?
দানিজেল

4
ধন্যবাদ @ টোরেক আমি প্রথমে করেছি git stash save --all, তারপরে আমি তাৎক্ষণিকভাবে করেছি git stash apply, তবে কিছু ফাইল অনুপস্থিত ছিল কারণ আমি সেগুলির নাম পরিবর্তন করেছি এবং তারপরে আবার তৈরি করেছি (স্ট্যাশ করার আগে)। যা সাহায্য করেছিল তা: git checkout stash@{0} -- .আমি এমনকি বিরক্ত করব না git checkout stash^3 -- .কারণ এখন সমস্ত ঠিক আছে বলে মনে হচ্ছে। এটি অত্যন্ত দুঃখজনক যে আমার কী ঘটছে তা বুঝতে সময় নেই। ধন্যবাদ
দানিজেল

100

আমি আপনার সমস্যা পুনরায় তৈরি করতে পরিচালিত। মনে হয় আপনি যদি ট্রেড করা না থাকা ফাইলগুলি স্ট্যাশ করেন এবং তারপরে আপনি সেই ফাইলগুলি তৈরি করেন (আপনার উদাহরণে foo.txtএবং bar.txt), তখন আপনার আবেদনবিহীন ফাইলগুলি ওভাররাইট হওয়া হবে এমন স্থানীয় পরিবর্তন রয়েছে git stash pop

এই সমস্যাটি সম্পর্কে জানতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন। এটি কোনও রক্ষিত স্থানীয় পরিবর্তনগুলিকে ওভাররাইড করবে তাই সাবধানতা অবলম্বন করুন।

git checkout stash -- .

পূর্ববর্তী কমান্ডে আমি আরও কিছু তথ্য পেয়েছি


আমার কর্মক্ষম গাছটি অবশ্যই পরিষ্কার ছিল যদিও উপেক্ষা করা ফাইলগুলিতে পরিবর্তন হতে পারে।
স্টিইনিবট

4
দেখে মনে হচ্ছে অবহেলিত ফাইলগুলি ব্যবহার --all/ -a অন্তর্ভুক্ত থাকবে , যাতে এটি প্রাসঙ্গিক হতে পারে।
ড্যানিয়েল স্মিথ

4
আমি ধরে নিচ্ছি যে একই যুক্তিটি উপেক্ষা করা ফাইলগুলিতে প্রযোজ্য এবং এটিকে উত্তর হিসাবে চিহ্নিত করুন (যদিও আমি মনে করি git merge --squash --strategy-option=theirs stashএই ক্ষেত্রে পদ্ধতির আরও ভাল)।
স্টিইনিবট

রাজি, আমি দ্বিতীয় পদ্ধতির পছন্দ! আপনার কাজের জন্য শুভকামনা!
ড্যানিয়েল স্মিথ

এটি সহায়ক ছিল তবে এটি তালাবিহীন ফাইলগুলি পুনরুদ্ধার করতে পারেনি - যদি আপনার একই সমস্যা থাকে ( already exists, no checkout), নীচে আমার উত্তরটি দেখুন।
এরিক কোওপম্যানস

24

ড্যানিয়েল স্মিথের উত্তরে প্রসারিত করার জন্য : সেই কোডটি কেবল ট্র্যাক করা ফাইলগুলি পুনরুদ্ধার করে , এমনকি যদি আপনি স্ট্যাশ তৈরির সময় ব্যবহার করেন --include-untracked(বা -u)। প্রয়োজনীয় পূর্ণ কোডটি হ'ল:

git checkout stash -- .
git checkout stash^3 -- .
git stash drop

# Optional to unstage the changes (auto-staged by default).
git reset

এটি পুরোপুরি ট্র্যাক করা সামগ্রী (ইন stash) এবং আন- ট্র্যাক করা সামগ্রী (ইন ) পুনরুদ্ধার করে stash^3, তারপরে স্ট্যাশ মুছে দেয়। কয়েকটি নোট:

  • সাবধানতা অবলম্বন করুন - এটি আপনার স্ট্যাশ সামগ্রীতে সমস্ত কিছু ওভাররাইট করে দেবে!
  • ফাইলগুলি পুনরুদ্ধার করে git checkoutএগুলি সমস্ত স্বয়ংক্রিয়ভাবে মঞ্চস্থ হয়ে যায়, তাই আমি যুক্ত করেছিgit reset সমস্ত কিছু স্টেস্টেজে ।
  • কিছু সংস্থান ব্যবহার করে stash@{0}এবং stash@{0}^3, আমার পরীক্ষায় এটি একই সাথে বা বাইরে কাজ করে@{0}

সূত্র:


4
আপনি কেন স্ট্যাশটি মুছবেন, কেন সুরক্ষার কারণে কিছুক্ষণ সেখানে রেখে দেবেন না?
দানিজেল

@ দানিজেল নিশ্চিত আপনি স্ট্যাশ রাখতে পারতেন - আমার ধারণা আপনার ব্যবহারের ক্ষেত্রে এটি নির্ভর করে। আমার উদ্দেশ্যগুলির জন্য আমি স্ট্যাশটি এটি পুনরুদ্ধার করার পরে সম্পন্ন করেছি।
এরিক কোওপম্যানস

3

অন্যান্য উত্তরগুলি বাদ দিয়ে, আমি কিছু কৌশল করেছি

  • সমস্ত নতুন ফাইল মুছে ফেলা হয়েছে (ইতিমধ্যে বিদ্যমান ফাইলগুলি, উদাহরণস্বরূপ foo.txt এবং প্রশ্নে বার টেক্সট)
  • git stash apply (যে কোনও কমান্ড ব্যবহার করতে পারেন যেমন প্রয়োগ, পপ ইত্যাদি)

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