গিতে একটি মুছে ফেলা ফাইলটি দেখছে


104

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

উত্তর:


144
git show HEAD^:path/to/file

আপনি একটি সুস্পষ্ট প্রতিশ্রুতি শনাক্তকারী বা HEAD~nপুরানো সংস্করণগুলি দেখতে বা যদি আপনি এটি মুছে ফেলার পরে একাধিক প্রতিশ্রুতিবদ্ধ হয়ে থাকেন তা ব্যবহার করতে পারেন।


6
নোট করুন যে path/to/fileপ্রকল্পের শীর্ষ থেকে সম্পূর্ণ পথ (সংগ্রহস্থলের শীর্ষ দিকের) d
জাকুব নারেবস্কি

1
আমি পেয়েছি fatal: Invalid object name 'HEAD^'.(আমার উল্লেখ করতে হবে, আমার কেবল "প্রাথমিক প্রতিশ্রুতি" আছে)
ভ্লাদক্রাস

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

1
আমি মনে করি এটিও উল্লেখযোগ্য যে এইটি শুধুমাত্র তখনই কাজ করে যদি খুব সাম্প্রতিক প্রতিশ্রুতিতে ফাইলটি মুছে ফেলা হয়। যদি ফাইলটি বেশ কয়েকটি কমিট আগে মুছে ফেলা হয়, তবে আপনাকে অন্য উত্তরগুলির মধ্যে একটি ব্যবহার করতে হবে।
jayhendren

50

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

git show $(git rev-list --max-count=1 --all -- foo)^:foo

অনুরোধ rev-listসমস্ত সংশোধনীর সন্ধান করে fooতবে কেবল একটির তালিকাবদ্ধ করে। যেহেতু rev-listবিপরীত কালানুক্রমিক তালিকায় তালিকাগুলি রয়েছে, তারপরে এটি কী তালিকাবদ্ধ করে তা হ'ল সর্বশেষ সংশোধন যা পরিবর্তিত হয়েছিল foo, এটি মুছে ফেলা প্রতিশ্রুতি হবে foo। (এই ভাবনাটি হলো এই যে Git একটি মুছে ফেলা ফাইল পরিবর্তন করা এবং এখনও অনুমতি দেয় না উপর ভিত্তি করে তৈরি থাকতে মোছা হয়েছে।) আপনি ঠিক যে সংস্করণ ব্যবহার করতে পারবেন না rev-listআয় হিসাবে- কারণ fooআর অস্তিত্ব আছে। আপনি যা ফাইলের শেষ সংস্করণ, অত রয়েছে শুধু এটা আগে এক জন্য জিজ্ঞাসা করতে হবে ^যে git show


2
আপনাকে শেষের foo ./foo এ পরিবর্তন করতে হবে। এবং তাদের জন্য ব্যাশ ব্যবহার না করার জন্য, "গিট রেভ-তালিকা - ম্যাক্স-কাউন্ট = 1 - সমস্ত - ফু" দিয়ে আইডি পান এবং তারপরে "গিট শো 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" আইডি সহ করুন (524 ..) ID)
Dror

1
চমৎকার উত্তর. আমাকে ~ এর পরিবর্তে use ব্যবহার করতে হয়েছিল ^ নিশ্চিত কেন। এবং ঠিক তাই লোকেরা এতে স্পষ্ট, এখানে 'ফু' অবশ্যই গিটের মূল থেকে পুরো পথ হতে হবে।
পেডোরো

আপনি **/fooযদি পথটি না জানেন তবে আপনি লিখতে পারেন (এটি রেভ-লিস্ট কমান্ডের জন্য কাজ করবে তবে শো কমান্ড নয় However তবে রেভ-লিস্ট কমান্ডের প্রতিশ্রুতি সহ আপনি পাথটি খুঁজে পেতে পারেন)।
নিকোলাই

10

যেহেতু আপনি সঠিক পাথটি মনে করতে পারেন না, আপনি গিট লগ থেকে sha1 পেতে পারেন তবে আপনি কেবল ইস্যু করতে পারেন

 git cat-file -p <sha1>

5
স্যামুয়েল স্লুন্ডের পক্ষে : উপরে ব্যবহার করার জন্য শ 1 যোগফলের একটি উপায় হ'ল: git whatchanged --no-abbrevযা গিট (বা এসএনএন) লগের অনুরূপ আউটপুট দেয়।
নির্মম আওয়াজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.