গিটে একটি ফাইলের কাজের অনুলিপি পূর্বাবস্থায় ফিরে চান?


1632

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

যাইহোক, আমি কেবলমাত্র কেবলমাত্র একটি ফাইলের ওয়ার্কিং অনুলিপি পরিবর্তনগুলি পূর্বাবস্থায় রাখতে চাই, এটির সাথে আর কিছুই নয়।

আমি কেমন করে ঐটি করি?

উত্তর:


2211

তুমি ব্যবহার করতে পার

git checkout -- file

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

আপনি কোনও ফাইলের একটি বিশেষ সংস্করণও পরীক্ষা করে দেখতে পারেন:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

34
হেড এবং হেড between এর মধ্যে পার্থক্য কী?
হাসেন

62
প্রধান শাখা বর্তমান শাখায় সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি, এবং বর্তমান শাখায় এর আগে এইচআইডি HE প্রতিশ্রুতিবদ্ধ। আপনি যে পরিস্থিতিতে বর্ণনা করেছেন তার জন্য, আপনি গিট চেকআউট হেড - ফাইলের নাম ব্যবহার করতে পারেন।
পল

16
সংক্ষেপে "গিট চেকআউট শ-রেফারেন্স - ফাইলের নাম" যেখানে শ-রেফারেন্সটি কোনও রুপে (শাখা, ট্যাগ, পিতামাতা, ইত্যাদি) কোনও কমিটের শ-এর একটি রেফারেন্স
লক্ষ্মণ প্রসাদ

29
দ্রষ্টব্য: যদি ফাইলটি ইতিমধ্যে মঞ্চস্থ হয়, আপনাকে প্রথমে এটি পুনরায় সেট করতে হবে। git reset HEAD <filename> ; git checkout -- <filename>
অলি

14
@gWo হ্যাঁ, আপনি HEAD^^সাম্প্রতিকতম 2 টি কমিটের জন্য বা HEAD^^^3 টি প্রত্যাবর্তনের জন্য করতে পারেন। আপনি আরও কমিটগুলি ফিরে যেতে চাইলে আপনি এটি ব্যবহার করতে পারেন HEAD~2, বা HEAD~3, যা আরও সুবিধাজনক হয়ে HEAD^2ওঠে , এর অর্থ "এই প্রতিশ্রুতির দ্বিতীয় অভিভাবক"; মার্জ কমিটের কারণে, কমিটের একাধিক পূর্বের কমিট থাকতে পারে, সুতরাং এই HEAD^সংখ্যাটি দিয়ে কোনও পিতা-মাতার মধ্যে একটি সংখ্যা নির্বাচন করে, যখন HEAD~একটি সংখ্যার সাথে সর্বদা প্রথম পিতামাতাকে বেছে নেয় তবে সেই সংখ্যাটি ফিরে আসে। দেখুন git help rev-parseআরো বিস্তারিত জানার জন্য।
ব্রায়ান ক্যাম্পবেল

139

শুধু ব্যবহার

git checkout filename

এটি বর্তমান শাখার সর্বশেষ সংস্করণ সহ ফাইলের নাম প্রতিস্থাপন করবে।

সতর্কতা: আপনার পরিবর্তনগুলি বাতিল করা হবে - কোনও ব্যাকআপ রাখা হবে না।


22
@duckx এটি ফাইলের নাম থেকে শাখার নাম বিচ্ছিন্ন করা। যদি আপনি বলেন git checkout xএবং এক্সটি একটি শাখার নাম পাশাপাশি ফাইলের নামও হয়ে থাকে তবে আমি ডিফল্ট আচরণটি কি তা নিশ্চিত নই তবে আমি মনে করি গিটটি ধরে নেবে আপনি শাখা এক্সে যেতে চান to আপনি যখন ব্যবহার করবেন তখন আপনি --যা বলছেন তা ফাইলের নাম (গুলি)।
হেসেন

1
এই পরিষ্কার করার জন্য আইসি ধন্যবাদ। প্রত্যেকে কেবল আপনাকে ধরে রাখে বলে ধরে নেয় - এর অর্থ যখন তারা আপনাকে উদাহরণ দেখায়। এবং এটি এমন কিছু নয় যা আপনি খুব সহজে গুগল করতে পারেন।
পটোশি パ ト

1
দেখে মনে হচ্ছে উত্তরটি এটি --থেকে সরাতে সম্পাদিত হয়েছিল । এখনও সঠিক হিসাবে, @ হাসান উল্লেখ করেছেন যে, ফাইলের নাম এবং শাখার নামগুলির মধ্যে যদি কোনও অস্পষ্টতা থাকে তবে আপনি এখানে খুব অনাকাঙ্ক্ষিত আচরণের সাথে শেষ করতে পারেন!
BrainSlugs83

2
এটি আমার পছন্দ মতো --, সুন্দর এবং সহজ ছাড়া without আপনি যখন ফাইলের নাম ব্যবহার করে শাখাগুলি নাম রাখবেন তখন কোথাও খারাপ ধারণা থাকতে হবে ...
মার্কো ফাউস্টিনেল্লি

133
git checkout <commit> <filename>

আমি আজ এটি ব্যবহার করেছি কারণ আমি বুঝতে পেরেছিলাম যে আমার ফ্যাভিকনটি কিছু চুক্তি পূর্বে ওভাররাইট করা হয়েছিল যখন আমি rup.১০ ড্রুপালকে আপগ্রেড করেছি, তাই আমাকে এটি ফিরে পেতে হয়েছিল। আমি যা করেছি তা এখানে:

git checkout 088ecd favicon.ico

1
"গিট লগ - স্ট্যাট" আউটপুট স্ক্রলিং টান বাদে আমি কীভাবে (পূর্ববর্তী মুছে ফেলা ফাইলটির) প্রতিশ্রুতি পেতে পারি?
অ্যালেক্স

4
আইএমও কমান্ডলাইনের মাধ্যমে গিট লগের মাধ্যমে স্ক্যান করতে এবং সঠিক ফাইলটি খুঁজে পেতে এটি একধরনের সমস্যা। জিইউআই অ্যাপ্লিকেশন যেমন সোর্সট্রিঅ্যাপ ডটকম-
নিউনি

6
git log --oneline <filename>আপনাকে আরও কমপ্যাক্ট লগ দেবে এবং কেবলমাত্র নির্দিষ্ট ফাইলে পরিবর্তনগুলি অন্তর্ভুক্ত করবে
rjmunro

1
বিকল্প হিসাবে, আপনি ব্যবহার করতে পারেনgit reflog <filename>
ygesher

70

যদি আপনার ফাইলটি ইতিমধ্যে মঞ্চস্থ করা হয় (ফাইল সম্পাদনার পরে আপনি যখন গিট অ্যাড ইত্যাদি করেন তখন ঘটে থাকে) আপনার পরিবর্তনগুলি আনস্টেজ করার জন্য।

ব্যবহার

git reset HEAD <file>

তারপর

git checkout <file>

যদি ইতিমধ্যে মঞ্চস্থ না হয় তবে কেবল ব্যবহার করুন

git checkout <file>

2
এটি গৃহীত এক হা হা থেকে বেশি সহায়ক হয়েছে helpful কী পরিবর্তনগুলি মঞ্চস্থ হয়েছে এবং কী হয়নি তা ভুলে যাওয়া সহজ, তাই পুনরায় সেট করা সহায়তা করে। যদিও আমি এর আগে "গিট রিসেট --হार्ड" চেষ্টা করেছিলাম, এটি "গিট রিসেট হেড" কী করে নি। আমি ভাবছি কেন?
আরমান বিমাতভ

20

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

git checkout branchname^ filename

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


এটি কমিট থেকে পরিবর্তনগুলি সরিয়ে ফেলবে না, এটি কেবল হেডের সংস্করণে ভিন্নতা প্রয়োগ করবে।
ফার্নান্দো

2
সত্য হিসাবে সত্য হলেও, মূল পোস্টারটি কেবলমাত্র তার কার্যকরী অনুলিপি পরিবর্তনগুলি (আমার মনে হয়) ফিরিয়ে নিতে চেয়েছিল, শেষ প্রতিশ্রুতি থেকে পরিবর্তনগুলি ফিরিয়ে আনেনি। মূল পোস্টারের প্রশ্নটি কিছুটা অস্পষ্ট ছিল, তাই আমি বিভ্রান্তি বুঝতে পারি।

সম্ভবত ওপি-র ব্যবহার নয়, তবে আমি কীভাবে আমার শাখাকে মাস্টারের অনুলিপি দিয়ে মুছে ফেলার জন্য সন্ধান করছিলাম - প্রতিস্থাপন করার সময় এটি বেশ সুন্দরভাবে কাজ করেbranchname^
Alex

15

আমি গিট ব্যাশ পেরিয়েছি:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. গিট স্ট্যাটাস[সুতরাং আমরা একটি ফাইলের ওয়াড সংশোধিত দেখতে পেয়েছি]]
  2. গিট চেকআউট - index.html [আমি সূচিপত্রের HTML পরিবর্তন করেছি:
  3. গিট স্ট্যাটাস [এখন সেই পরিবর্তনগুলি সরানো হয়েছে]

এখানে চিত্র বর্ণনা লিখুন


8

আমি সর্বদা এটির সাথে বিভ্রান্ত হয়ে পড়ি, সুতরাং এখানে একটি অনুস্মারক পরীক্ষার মামলা রয়েছে; আসুন বলি আমাদের এই bashস্ক্রিপ্টটি পরীক্ষা করার আছে git:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

এই মুহুর্তে, পরিবর্তনটি ক্যাশে মঞ্চস্থ হয় না, তাই git statusহয়:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

যদি এই বিন্দু থেকে, আমরা করি git checkout, ফলাফল এটি:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

পরিবর্তে আমরা যদি করি git reset, ফলাফলটি হল:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

সুতরাং, এই ক্ষেত্রে - যদি পরিবর্তনগুলি মঞ্চস্থ না করা হয়, git resetকোনও তফাত্ করে না , যখন git checkoutপরিবর্তনগুলি ওভাররাইট করে।


এখন বলা যাক যে উপরের স্ক্রিপ্ট থেকে শেষ পরিবর্তনটি মঞ্চস্থ / ক্যাশেড, এটি বলতে আমরা git add b.txtশেষেও করেছি।

এই ক্ষেত্রে, git statusএই মুহূর্তে:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

যদি এই বিন্দু থেকে, আমরা করি git checkout, ফলাফল এটি:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

পরিবর্তে আমরা যদি করি git reset, ফলাফলটি হল:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

সুতরাং, এই ক্ষেত্রে - যদি পরিবর্তনগুলি মঞ্চস্থ হয় git resetতবে মূলত স্টেজেড পরিবর্তনগুলি অচিহ্নবদ্ধ পরিবর্তনগুলিতে পরিণত git checkoutকরবে - যখন পরিবর্তনগুলি সম্পূর্ণরূপে ওভাররাইট করে দেবে।


7

এই উত্তরগুলি স্থানীয় পরিবর্তনগুলি পূর্বাবস্থায়িত করার জন্য প্রয়োজনীয় কমান্ডের জন্য যা একই বা একাধিক ফোল্ডারে (বা ডিরেক্টরিগুলি) একাধিক নির্দিষ্ট ফাইলগুলিতে থাকে। এই জবাবগুলি বিশেষত এমন প্রশ্নের সমাধান করে যেখানে কোনও ব্যবহারকারীর একাধিক ফাইল রয়েছে তবে ব্যবহারকারী সমস্ত স্থানীয় পরিবর্তনগুলি পূর্বাবস্থায় রাখতে চান না:

আপনার যদি এক বা একাধিক ফাইল থাকে তবে git checkout -- fileসেই জায়গাগুলির দ্বারা পৃথক পৃথকভাবে পৃথক পৃথকভাবে তালিকাভুক্ত করে সেই ফাইলগুলির প্রতিটিতে একই কমান্ড ( ) প্রয়োগ করতে পারেন :

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

নাম 1 / নাম 2 / fileOne.ext নামএ / সাবফোল্ডার / fileTwo.ext এর মধ্যে উপরের স্থানটি মনে রাখবেন

একই ফোল্ডারে একাধিক ফাইলের জন্য:

আপনার যদি কোনও নির্দিষ্ট ডিরেক্টরিতে সমস্ত ফাইলের জন্য পরিবর্তনগুলি বাতিল করতে হয়, তবে গিট চেকআউটটি নীচে ব্যবহার করুন:

git checkout -- name1/name2/*

উপরের তারকাচিহ্নটি নাম / নাম 2 এর অধীনে সেই জায়গাতে সমস্ত ফাইল পূর্বাবস্থায় ফেলার কৌশল করে।

এবং, একইভাবে নিম্নলিখিতগুলি একাধিক ফোল্ডারের জন্য সমস্ত ফাইলে পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে পারে:

git checkout -- name1/name2/* nameA/subFolder/*

আবার উপরের নাম / নাম 2 / * নামএ / সাবফোল্ডার / * এর মধ্যে স্থানটি মনে রাখবেন।

দ্রষ্টব্য: নাম 1, নাম 2, নামএ, সাবফোল্ডার - এই সমস্ত উদাহরণ ফোল্ডারের নাম ফোল্ডার বা প্যাকেজ নির্দেশ করে যেখানে প্রশ্নে থাকা ফাইল (গুলি) থাকতে পারে।


5

আমি SHA আইডি ব্যবহার করে আমার ফাইলগুলি পুনরুদ্ধার করি, আমি কী করি git checkout <sha hash id> <file name>



2

যদি আপনি এখনও প্রতিশ্রুতি না দিয়ে থাকেন বা অন্যথায় আপনার প্রতিশ্রুতি ভাগ করে না থাকেন:

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend

0

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


1
ব্যবহারের জন্য নির্দিষ্ট কমান্ড যুক্ত করা মূল পোস্টার এবং ভবিষ্যতের দর্শকদের সহায়তা করবে।
অ্যাড্রিয়ান

0

আমি জানি না তবে আমি যখন আমার কোডটি প্রবেশ করার চেষ্টা করি তখন এটি চিত্র হিসাবে আসে।

এখানে চিত্র বর্ণনা লিখুন

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