কিছুটা অতিরিক্ত ব্যাখ্যা হিসাবে, নোট যেটি git stashদুটি করে তোলে, বা তিনটি কমিট করে। ডিফল্ট দুটি; আপনি তিনটি পাবেন যদি আপনি কোনও বিকল্প --allবা --include-untrackedবিকল্পগুলির বানান ব্যবহার করেন ।
এই দুটি বা তিনটি কমিটগুলি একটি গুরুত্বপূর্ণ উপায়ে বিশেষ: এগুলি কোনও শাখায় নেই। গিট তাদের বিশেষ নামের মাধ্যমে চিহ্নিত করে stash। 1 সবচেয়ে গুরুত্বপূর্ণ বিষয়, যদিও, কি গীত আপনি-এবং দেয় তোলে এই দুই বা তিন করে সঙ্গে আপনি-না। এটি বুঝতে আমাদের এই কমিটিগুলির মধ্যে কী আছে তা খতিয়ে দেখতে হবে।
স্ট্যাশ এর ভিতরে কি আছে
প্রতিটি প্রতিশ্রুতিবদ্ধ এক বা একাধিক পিতামাতার কমিটের তালিকা করতে পারে । এগুলি একটি গ্রাফ তৈরি করে, যেখানে পরবর্তীতে পূর্বেরগুলিতে ফিরে আসে। স্ট্যাশ সাধারণত দুটি কমিট করে, যা আমি 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>, সম্ভবত।
git stash show -p | git apply --3