গিটের নির্দিষ্ট সংস্করণ থেকে কীভাবে একটি একক ফাইল পুনরুদ্ধার করবেন?


831

আমার একটি গিট সংগ্রহশালা রয়েছে এবং আমি কয়েক মাস আগে কিছু ফাইল দেখতে কেমন তা দেখতে চাই। আমি সেই তারিখে সংশোধনটি পেয়েছি; এটা 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8। একটি ফাইল দেখতে কেমন তা আমার দেখতে হবে এবং এটি একটি ("নতুন") ফাইল হিসাবে সংরক্ষণ করতে হবে।

আমি ফাইলটি ব্যবহার করে পরিচালনা করতে পেরেছি gitk, তবে এটি সংরক্ষণ করার বিকল্প নেই। আমি কমান্ড-লাইন সরঞ্জাম দিয়ে চেষ্টা করেছি, আমার কাছে সবচেয়ে কাছেরটি ছিল:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

যাইহোক, এই কমান্ডটি ফাইলের বিষয়বস্তুগুলি নয়, একটি ভিন্নতা দেখায়। আমি জানি যে আমি পরে PAGER=catকোনও ফাইল ব্যবহার করতে পারি এবং কোনও ফাইলে আউটপুট পুনর্নির্দেশ করতে পারি, তবে কীভাবে আসল ফাইল সামগ্রীতে যেতে হয় তা আমি জানি না।

মূলত, আমি এসএনএন বিড়ালের মতো কিছু খুঁজছি ।


73
এখানে কী: git show(অপ্রয়োজনীয়ভাবে) কোলনের সাথে বিভিন্ন সিনট্যাক্স ব্যবহার করা হয়। git show 2c7cf:my_file.txt
স্টিভ বেনেট

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

2
* নিক্সে আপনার প্যাগার দরকার নেই, কেবল শেল আউটপুট পুনর্নির্দেশের সাহায্যে>
কনস্ট্যান্টিন পেলেপেলিন


চেকাটের একটি গুরুত্বপূর্ণ মন্তব্য রয়েছে, যারা চান যে কোনও ফাইলটিতে সামগ্রী রপ্তানি করা। আপনার এর মতো কিছু দরকার: গিট শো {sha}: my_file.txt> old_my_file.txt
ormurin

উত্তর:


743

আপনার নিজের উত্তরটি সম্পূর্ণ করতে, বাক্য গঠনটি প্রকৃতপক্ষে

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

কমান্ডটি পুনরায় সংশোধন করার স্টাইলটি গ্রহণ করে যার অর্থ আপনি নীচের যে কোনওটি ব্যবহার করতে পারেন:

  1. শাখার নাম ( ছাই দ্বারা প্রস্তাবিত )
  2. HEAD+ ^অক্ষরের সংখ্যা
  3. প্রদত্ত সংশোধনের SHA1 হ্যাশ
  4. প্রদত্ত SHA1 হ্যাশের প্রথম কয়েকটি (সম্ভবত 5) অক্ষর

টিপ এটি মনে রাখা গুরুত্বপূর্ণ যে " git show" ব্যবহার করার সময় , সর্বদা আপনার বর্তমান ডিরেক্টরি অবস্থানটি নয়, আপনার সংগ্রহস্থলের মূল থেকে কোনও পাথ নির্দিষ্ট করুন

(যদিও মাইক মোরার্টি উল্লেখ করেছেন যে, কমপক্ষে গিট ১.7.৫.৪ সহ, আপনি পথের ./শুরুতে " " রেখে একটি আপেক্ষিক পথ নির্দিষ্ট করতে পারেন - উদাহরণস্বরূপ:

git show HEAD^^:./test.py

)


গিট ২.২৩++ (আগস্ট 2019) এর মাধ্যমে আপনি ব্যবহার করতে পারেন git restore যা বিভ্রান্তিকর আদেশটি প্রতিস্থাপন করেgit checkout

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

এটি কেবলমাত্র "উত্স" ( -s) কমিট এসএইএ 1 বা শাখায় উপস্থিত ফাইল হিসাবে কাজ করা গাছের উপর পুনরুদ্ধার করবে somebranch
সূচকটি পুনরুদ্ধার করতে:

git restore -s <SHA1> -SW -- afile

( -SW: সংক্ষিপ্ত --staged --worktree)


Git1.5.x এর আগে এটি কিছু নদীর গভীরতানির্ণয় দ্বারা সম্পন্ন হয়েছিল:

git ls-tree <rev>
কমিটের মধ্যে এক বা একাধিক 'ব্লব' অবজেক্টের একটি তালিকা দেখান

git cat-file blob <file-SHA1>
কোনও ফাইলকে বিড়াল করা যেমন এটি একটি নির্দিষ্ট সংশোধনীর মধ্যে প্রতিশ্রুতিবদ্ধ হয়েছে (এসএনএন বিড়ালের অনুরূপ)। প্রদত্ত ফাইল-শ 1 এর মান পুনরুদ্ধার করতে গিট এলএস-ট্রি ব্যবহার করুন

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

গিট-এলএস-ট্রি rev ফাইলটির পুনর্বিবেচনার জন্য আইডি তালিকাভুক্ত করে $ আরআরভি stdout যে আপত্তি।


দ্রষ্টব্য: গিট 2.11 (Q4 2016) থেকে, আপনি git cat-fileআউটপুটে কোনও সামগ্রী ফিল্টার প্রয়োগ করতে পারেন !

প্রতিশ্রুতি দেখুন 3214594 , প্রতিশ্রুতিবদ্ধ 7bcf341 (09 সেপ্টেম্বর 2016), প্রতিশ্রুতিবদ্ধ 7bcf341 (09 সেপ্টেম্বর 2016), এবং b9e62f6 প্রতিশ্রুতিবদ্ধ , জোহানেস শিন্ডেলিন () দ্বারা 16dcc29 (24 আগস্ট 2016 ) প্রতিশ্রুতিবদ্ধ(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 7889ed2 , 21 সেপ্টেম্বর 2016)dscho
gitster

cat-file: সমর্থন --textconv/ --filtersব্যাচ মোডে

যদিও " git hash-objects", এটি একটি অন-ফাইল-সিস্টেম ডেটা স্ট্রিম নেওয়ার এবং এটি গিট অবজেক্ট স্টোরের মধ্যে রাখার একটি সরঞ্জাম, "বাইরের-বিশ্বের-গীত" রূপান্তরগুলি সম্পাদনের অনুমতি দেয় (যেমন-লাইন রূপান্তর এবং অ্যাপ্লিকেশন ক্লিন-ফিল্টারটি), এবং এটি খুব প্রথম দিন থেকেই ডিফল্টরূপে বৈশিষ্ট্যযুক্ত ছিল, এর বিপরীত অপারেশন " git cat-file", যা গিট অবজেক্ট স্টোর থেকে কোনও বস্তু নিয়ে যায় এবং বাইরের বিশ্বের দ্বারা সেবার জন্য বহিরাগত হয়, এতে সমতুল্য প্রক্রিয়াটির অভাব ছিল "গিট-টু-বাইরের ওয়ার্ল্ড" চালান

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

দ্রষ্টব্য: " git cat-file --textconv" সম্প্রতি (2017) সেগফোল্টিং শুরু হয়েছে, যা গিট 2.15 (Q4 2017) এ সংশোধন করা হয়েছে

দেখুন cc0ea7c কমিট (21 সেপ্টেম্বর 2017) দ্বারা জেফ কিং ( peff)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট bfbc2fc , 28 সেপ্টেম্বর 2017)


নোট করুন যে কোনও অতীত সামগ্রী সহ কোনও ফাইলকে ওভাররাইড / প্রতিস্থাপন করতে আপনার আর বিভ্রান্তিকর git checkoutআদেশটি ব্যবহার করা উচিত নয় , তবে git restore(গিট 2.23+, আগস্ট 2019)

git restore -s <SHA1> -- afile

এটি কেবলমাত্র "উত্স" ( -s) কমিট এসএইএ 1 তে উপস্থিত ফাইল হিসাবে কাজ করা গাছের উপরে পুনরুদ্ধার করবে ।
সূচকটি পুনরুদ্ধার করতে:

git restore -s <SHA1> -SW -- afile

( -SW: সংক্ষিপ্ত --staged --worktree)


6
@ অস্কার যেহেতু git showমূলত কন্টেন্টটি stdout(স্ট্যান্ডার্ড আউটপুট) এ ফেলে দেয়, আপনি কেবলমাত্র সেই আউটপুটটিকে আপনার যে কোনও ফাইল ( tldp.org/LDP/abs/html/io-redirection.html ) এ ডাইরেক্ট করতে পারেন ।
ভনসি

8
git checkout [branch | revision] filepathসঠিক আদেশ
গাই

12
@ গৌই কিন্তু আপনার ফাইলটিকে অন্য সংস্করণে ওভাররাইডgit checkout করবে , এর বিপরীতে , যা আপনাকে এটি অন্য নামের সাথে সংরক্ষণ করতে দেয়, যাতে আপনি উভয়কেই (বর্তমান সংস্করণ এবং পুরানো সংস্করণ) পেতে ও দেখতে পারবেন । প্রশ্নটি থেকে অস্পষ্ট যে ওপি তার বর্তমান সংস্করণটিকে কোনও পুরানো দ্বারা প্রতিস্থাপন করতে চায় কিনা । git show
ভোনসি

9
আমি নোট করতে চাই যে ^^^আরও সাধারণত হিসাবে ~~~বা আরও ভাল লেখা যেতে পারে ~3। টিল্ডস ব্যবহার করে কিছু শেলের ফাইল নাম মিলিয়ে ট্রিগার না করার সুবিধাও রয়েছে (উদাহরণস্বরূপ, zsh)।
এরিক ও লেবিগোট

2
আমার চেক করার জন্য পর্যাপ্ত পরিমাণে পুরানো গিট নেই: প্রাক-1.5.x প্রাক সিনট্যাক্স git rev-parseহ্যান্ডেল rev:pathকরে? (আরও সাম্প্রতিক গিটটিতে আপনি এটি করতে পারেন git cat-file -p $REV:pathHowever তবে, git showডিরেক্টরি পাথগুলির জন্যও কাজ করে, সুতরাং এটি কেবল খাটো নয়, এটি সাধারণত যা চায় তার কাছাকাছি))
টোরেক

510

আপনি যদি পূর্ববর্তী প্রতিশ্রুতি বা অন্য কোনও শাখা থেকে ফাইলের বিষয়বস্তু সহ আপনার বর্তমান শাখায় কোনও ফাইলের বিষয়বস্তু প্রতিস্থাপন / ওভাররাইট করতে চান তবে আপনি এই আদেশগুলি দিয়ে এটি করতে পারেন:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

অথবা

git checkout mybranchname path/to/file.txt

তারপরে তাদের বর্তমান শাখায় কার্যকর হওয়ার জন্য আপনাকে এই পরিবর্তনগুলি করতে হবে।


4
সহজ সমাধান এবং এটিই গিট-চেকআউটটির জন্য ডিজাইন করা হয়েছে - পথের নাম নির্দিষ্টকরণের অর্থ কেবল মিলানো ফাইলই চেক আউট হয়। গিট-চেকআউট ম্যান পৃষ্ঠা থেকে: গিট চেকআউট মাস্টার ~ 2
মেকফিল

1
তারপরে, আপনি এই আদেশটি চালানোর আগে আপনি পূর্বের অবস্থানে ফিরে কীভাবে যাবেন?
চকচকে

@ ফ্লিন্ট আপনি যদি প্রধান রাষ্ট্র থেকে আগত হন তবে এটি গিট চেকআউট হেড - [সম্পূর্ণ পথ] এর মতোই সহজ।
টিয়াগো এসপিনহা

72
নোট করুন যে এটি সেই পথে বিদ্যমান ফাইলটিকে ওভাররাইট করে, যেখানে git show SHA1:PATHসমাধানটি কেবল স্টডআউটে প্রিন্ট করে।
15-24

নিস! আমি এটা দেখে বুঝতে সক্ষম হত না git help checkout। আমাকে একটি নির্দিষ্ট তারিখ হিসাবে একটি উপ-ডিরেক্টরি চেকআউট করতে হয়েছিল, এবং এই পদ্ধতির ব্যবহার করে আমি এই বাক্য git checkout @{YYYY-MM-DD} sub-dir
গঠনটি

150

আপনাকে ফাইলটির পুরো পথ সরবরাহ করতে হবে:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt

7
পুরো পথ হতে হবে না। গিট রুট ডিরেক্টরি থেকে পথ (যারা এসেছিল git show --name-onlyতারাও যথেষ্ট
মোহসেন

7
সংগ্রহস্থল, সংগ্রহস্থল থেকে সম্পূর্ণ পথ। আমি যে উদাহরণ দিয়েছি তা আরও ভাল করে দেখুন। "পূর্ণ" এর আগে কোনও শীর্ষস্থানীয় স্ল্যাশ নেই।
মিলান বাবুস্কভ

7
এফওয়াইআই, আপনি যদি কোনও সাবডিরের মধ্যে থাকেন তবে আপনি ./filename.ext সাফল্যের সাথেও ব্যবহার করতে পারেন।
ভ্রমণকারী

আমার মতে , আপনি যদি প্রবেশ করেন full/repo/path/toএবং আপনি চেষ্টা করেন: তবে git show 27cf8e84:my_file.txtআপনাকে মারাত্মক: পথ 'পূর্ণ / রেপো / পাথ / টু / মাই_ফাইল.txt' উপস্থিত রয়েছে তবে 'my_file.txt' নয় । আপনার অর্থ কি '27cf8e84: ফুল / রেপো / পাথ / টু / আমার_ফাইল.txt' ওরফে '27cf8e84: ./ my_file.txt'? এটি এর মতো, গিট সরাসরি সহায়তা করতে পারত তবে এখানে পেডেন্টিক হতে বেছে নিয়েছে।
এড র‌্যান্ডাল

101

সবচেয়ে সহজ উপায়টি হ'ল:

git show HASH:file/path/name.ext > some_new_name.ext

কোথায়:

  • HASH হ'ল গিট রিভিশন SHA-1 হ্যাশ নম্বর
  • file / path / name.ext হল আপনি যে ফাইলটি সন্ধান করছেন তার নাম
  • some_new_name.ext হল সেই পথ এবং নাম যেখানে পুরানো ফাইলটি সংরক্ষণ করা উচিত

উদাহরণ

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

এই সংরক্ষণ করতে হবে my_file.txt সংস্করণ থেকে 27cf8e নাম দিয়ে একটি নতুন ফাইল হিসাবে my_file.txt.OLD

এটি গিট 2.4.5 দিয়ে পরীক্ষা করা হয়েছিল।

আপনি যদি মুছে ফেলা ফাইলটি পুনরুদ্ধার করতে চান তবে আপনি HASH~1(নির্দিষ্ট HASH এর আগে একটি প্রতিশ্রুতি) ব্যবহার করতে পারেন ।

উদাহরণ:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt

1
অতিরিক্ত তথ্য: আপনি হ্যাশ পেতে পারেন যেমন গিট লগ সহ
xotix

@ এক্সটিক্স ধন্যবাদ আমি ব্যবহার একটি নির্দিষ্ট ফাইলের জন্য সব হ্যাশ ইতিহাস পেয়েছিলামgit log file/path/name.ext
শ্রীরাম Kannan

11

উইন্ডোজে, গিট বাশ সহ:

  • আপনার কর্মক্ষেত্রে, আপনার ফাইলটি যে ফোল্ডারে থাকে সেদিকে dir পরিবর্তন করুন
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext

8

এবং এটিকে কোনও ফাইলের মধ্যে অন্তত উইন্ডোতে ছড়িয়ে দিতে - গিট ব্যাশ:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java

"কোট প্রয়োজন হয় তাই এটি নতুন লাইন অপরিবর্তিত।


সুন্দর. +1 টি। git showআমি উপরে উল্লিখিত সিনট্যাক্সটিতে ভাল সংযোজন ।
ভোনসি

23
আপনি কেন উদ্ধৃতি সহ বা ছাড়াই ইকো ব্যবহার করবেন তা আমি সত্যিই বুঝতে পারি না। আপনি কেন আউটপুট পুনঃনির্দেশের সংযোজন ফর্মটি চান তা আমি বুঝতে পারি না। সহজভাবে লিখলে কি ভাল হয় না: গিট শো 60d8bdfc: src / পরিষেবাদি / অবস্থানমনিটর.জভা> LM_60d8bdfc.java যদি কোনও কারণে আপনি ডস-স্টাইলের লাইন শেষ করতে বাধ্য করতে চান তবে আপনি এটি ইউনিক্স 2 ডিজের মাধ্যমে পাইপ করতে পারেন। তবে আমি উইন্ডোজটিতে ডস লাইন-এন্ডিংগুলি ধরে রাখতে সবচেয়ে কম দরকারী বলে খুঁজে পাইনি, নোটপ্যাড ব্যতীত অন্য কোনও পাঠ্য সরঞ্জাম যা আমি উইন্ডোজটিতে ইউনিক্স-স্টাইলের লাইনগুলিতে ব্যবহার করেছি।
sootsnoot

4
গিট শো 60d8bdfc: src / পরিষেবাদি / লোকেশনমনিটর.জভা >> LM_60d8bdfc.java আমার পক্ষে কাজ করেছে।
মাইক 6679

@ মাইক: আপনি উইন্ডোতে আছেন?
মিস্টার_আর_আমস_ডি

2
ডাবল উদ্ধৃতি ব্যবহার করবেন না কারণ যদি আপনার ফাইলের অক্ষরগুলি শেল ভেরিয়েবলের মতো দেখতে লাগে, যেমন $ LANG, এটি প্রতিস্থাপন করা হবে। @ LưuVĩnhPhúc সেভার হয়। এছাড়াও ব্যবহার করবেন না >> এটি উপস্থিত থাকলে ফাইলটি সংযোজন হবে এবং ত্রুটি হতে পারে
থিওজি

3

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

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1

1
git checkout {SHA1} -- filename

এই কমান্ডটি নির্দিষ্ট প্রতিশ্রুতি থেকে অনুলিপি করা ফাইলটি পান।


-2

আগের কমিট পরীক্ষা করে ফাইলটি অনুলিপি করার মাধ্যমে কোনও পূর্বের প্রতিশ্রুতি থেকে ফাইলটি পান।

  • আপনি কোন শাখায় রয়েছেন তা নোট করুন: গিট শাখা
  • আপনি চান আগের প্রতিশ্রুতি চেকআউট করুন: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • আপনি যে ফাইলটি চান তা অনুলিপি করুন temporary
  • আপনি যে শাখাটি থেকে শুরু করেছেন তার চেকআউট করুন: git checkout theBranchYouNoted
  • আপনার অস্থায়ী স্থানে রাখা ফাইলটিতে অনুলিপি করুন
  • গিট আপনার পরিবর্তন প্রতিশ্রুতিবদ্ধ: git commit -m "added file ?? from previous commit"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.