গিটে স্টেস্টেড পরিবর্তনগুলির অংশটি পূর্বাবস্থায় ফিরিয়ে আনুন


158

আমি কীভাবে আমার গতিবিহীন পরিবর্তনগুলির অংশগুলি পূর্বাবস্থায় ফিরিয়ে আনতে পারি তবে বাকিগুলিকে অচিহ্নিত হিসাবে রাখি? আমি যেভাবে আবিষ্কার করেছি তা হ'ল:

git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply

এটি কাজ করে, তবে এটি পরিবর্তন হবে যদি git commit --interactiveকেবল পরিবর্তনগুলি পরিবর্তনের জন্য এমন কিছু থাকে were এর চেয়ে ভাল কোন পদ্ধতি?

উত্তর:


264

আপনি ব্যবহার করতে পারেন git checkout -p, যা আপনাকে পুনরায় প্রত্যাহারের জন্য আপনার কার্যকরী অনুলিপি এবং সূচকের মধ্যে পার্থক্য থেকে পৃথক কুনি বেছে নিতে দেয়। তেমনি, git add -pআপনাকে সূচকগুলিতে যুক্ত করতে কুনি বাছাই করতে git reset -pদেয় এবং আপনাকে সূচী থেকে হেডের মধ্যে আলাদা থেকে পৃথক কুকুর বাছাই করতে দেয়।

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

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

$ git stash; git stash apply

আপনি যদি এটি প্রায়শই ব্যবহার করেন তবে আপনি এটির উপাধি দিতে চাইতে পারেন:

[alias]
    checkpoint = !git stash; git stash apply

আপনি যদি একটি ভাল সম্পাদক মোড বা প্লাগইন ব্যবহার করেন তবে স্বতন্ত্র হুনস বা লাইনগুলি ফিরিয়ে আনা আরও সহজ হতে পারে, যা -pকখনও কখনও কখনও ব্যবহার করতে কিছুটা আনাড়ি হতে পারে directly আমি ম্যাজিট ব্যবহার করি , একটি ইমাস মোড যা গিটের সাথে কাজ করার জন্য খুব সহায়ক। Magit এ আপনি দৌড়াতে পারবেন, আপনি magit-statusযে পরিবর্তনগুলি ফিরিয়ে আনতে চান তার জন্য আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা সন্ধান করুন, আপনি যে রেখাগুলি ফিরিয়ে নিতে চান তা নির্বাচন করুন (অথবা আপনি যদি একবারে কুঁচকে বদলে দিতে চান তবে আপনি ফিরে যেতে চান এমন কর্সারটি চাপুন ) একবারে একটি লাইন) চাপুন kএবং সেই নির্দিষ্ট লাইনগুলিকে ফিরিয়ে আনতে টিপুন । আপনি যদি ইমাস ব্যবহার করেন তবে আমি ম্যাগিটিকে সর্বোচ্চ পরামর্শ দিচ্ছি।


আমি মনে করি এটি প্রায় জটিল হিসাবে সমাধানটি আমি মূলত উত্থাপিত হিসাবে নিয়ে এসেছি, তবে আমি মনে করি যে আমার আসল সমাধানটি মুছে ফেলা লাইনগুলি 30 দিনের জন্য সংরক্ষণ করার সুবিধা রয়েছে কারণ তারা প্রতিশ্রুতিবদ্ধ। আমি ভাবছি যদিও এটির চারপাশে একটি শেল স্ক্রিপ্ট লেখা ভাল লাগবে।
asmeurer

1
দুঃখিত, আমি ঠিক বুঝতে পেরেছি যে git checkoutএর একটি -pপতাকাও রয়েছে, যা ঠিক তেমনি করে যা আপনি একক কমান্ডে চেয়েছিলেন। পূর্ববর্তী জটিল সেট পদক্ষেপের জন্য ক্ষমা প্রার্থনা; আপনি শুধু ব্যবহার করতে পারেন git checkout -p। স্টাফ সংরক্ষণের ক্ষেত্রে যতটা সম্ভব সম্ভাব্য ধ্বংসাত্মক কিছু করার আগে আমি প্রায়শই একটি git stash; git stash apply(বা এমন একটি উপাধি তৈরি করি যা সে হিসাবে git checkpointবা কিছু করে) বর্তমান গাছটিকে স্ট্যাশে রেকর্ড করতে যাতে আমি কিছু ভুল হয়ে যায় তবে আমি এটিতে ফিরে যেতে পারি।
ব্রায়ান ক্যাম্পবেল

আপনি সেখানে যান, এটি সমাধান! উপনামের যতদূর আমি ভাবছি এর থেকে git commit -a -m "Backup Commit" --edit; git reset HEAD^ ভাল কিছু হবে, কারণ তখন এটি আমার স্ট্যাশ অবস্থা নষ্ট করবে না, যা আমি অন্য কোনও কিছুর জন্য ব্যবহার করছি। তারপরে, আপনার যতক্ষণ SHA1 থাকবে আপনি পরবর্তী 30 দিনের মধ্যে চেরি-বাছাই করতে পারবেন। --Edit আপনাকে চাইলে SHA1 পরে খুঁজে পেতে আপনাকে সহায়তা করার জন্য প্রতিশ্রুতিবদ্ধ বার্তায় তথ্য যুক্ত করতে দেয়। অন্যদিকে, এটি গিট রিফ্লোগটিকে নষ্ট করবে, সুতরাং আমার ধারণা আপনি এটি করছেন তার উপর ভিত্তি করে এটি একটি ট্রেড অফ trade
asmeurer

চেকপয়েন্টের ওরফে আমার পক্ষে কাজ করে না: কেবল প্রথম কমান্ড কার্যকর করা হয়, দ্বিতীয়টি নয়। এটি দুঃখজনক, কারণ আমি এটি পছন্দ করতাম। আমি গিট সংস্করণ ব্যবহার করছি 1.7.10.4।
ফ্যাবিয়েন

git checkout -pসূচকগুলিতে প্যাচগুলি প্রয়োগ না করে কেবল সেগুলি মঞ্চ করার কোনও উপায় আছে কি ?
জেরেমিয়া

28
git diff > patchfile

তারপরে প্যাচফাইলে সম্পাদনা করুন এবং যে অংশগুলি আপনি পূর্বাবস্থায় রাখতে চান না তা সরিয়ে ফেলুন, তারপরে:

patch -R < patchfile

6
তবে, এই উত্তরটি এর সরলতা এবং সহজেই ব্যবহারের পক্ষে প্রশংসনীয়। +1
থলি

উত্পাদিত patchfileভিমে দুর্দান্ত দেখায় এবং এটি সত্যই সহায়তা করে!
বিলি

পারফেক্ট। এটি সিগউইন এবং উইন্ডোজের জন্য উবুন্টু বাশের সাথে উইন্ডোজের অধীনেও কাজ করে তা নিশ্চিত করতে পারে।
চেকো আর

1
দ্রষ্টব্য আপনি এর git apply -Rপরিবর্তেও ব্যবহার করতে পারেন patch(কেবল patch
গিটের

patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
শুভফ্রিজ

5

আপনি করতে পারেন

git checkout master -- path/to/file

প্রতিটি ফাইলের জন্য আপনি পুনরায় সেট করতে চান।


অথবা শাখায় কাজ করা হলে মাস্টারের জায়গায় হেড ব্যবহার করুন। যেমনটি 'গিট স্ট্যাটাস' প্রতিবেদনে বলা হয়েছে (কমপক্ষে সাম্প্রতিক সংস্করণগুলিতে)।
জোনাথন লেফলার

1

কেমন

  1. সূচক থেকে পরিবর্তনগুলি সহ প্রভাবিত ফাইলগুলি ব্যাকআপ করুন
  2. git add -pআপনি সূচকগুলিতে যে পরিবর্তনগুলি চান তা কেবল ফিরে যুক্ত করতে ব্যবহার করুন।

1

যখন আমি 'গিট স্ট্যাটাস' চালাই, তখন এটি বলে:

$ git status
# On branch fr/fr.002
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   makefile
#
no changes added to commit (use "git add" and/or "git commit -a")
$

সুতরাং, অচিহ্নবদ্ধ সম্পাদনাগুলি বাতিল করতে, এটি আমাকে চালনা করতে বলে:

git checkout -- makefile

3
আমি মনে করি যে তিনি একবারে একটি সম্পূর্ণ ফাইল নয়, কীভাবে পৃথক কুকুরটিকে ফিরিয়ে আনবেন তা নিয়ে ভাবছিলেন। এটি অবশ্যই সমাধান, যদি আপনার কেবল কোনও ফাইলের সমস্ত পরিবর্তন পূর্বাভাস করা প্রয়োজন।
ব্রায়ান ক্যাম্পবেল

হ্যাঁ - আমার সন্দেহ হয় আপনি সঠিক আছেন। 'গিট চেকআউট-পি' এবং 'গিট অ্যাড-পি' বিকল্পগুলি যা চাইছিল তা হতে পারে - আপনি যেমন বলেছিলেন।
জোনাথন লেফলার

1

ব্রায়ান ক্যাম্পবেলের উত্তরটি আমার অজানা, 1.9.2.msysgit.0 সংস্করণটি অজানা কারণে ক্র্যাশ করেছে, সুতরাং আমার দৃষ্টিভঙ্গি হংসকে পর্যায়ক্রমে রাখতে চাই যা আমি রাখতে চাই, কাজের অনুলিপিতে পরিবর্তনগুলি বাতিল করে, তারপরে স্টেস্টেজ না করে।

$ git add -p
   ... select the hunks to keep
$ git checkout -- .
$ git reset HEAD .

1
এছাড়াও আছে git stash -p। আপনি করতে পারেন git stash -p; git reset --hard; git stash pop। এটি কার্যকরভাবে আপনি যা করছেন ঠিক তেমনই হ'ল ব্যতীত আপনাকে কোনও প্রতিশ্রুতি বার্তা লিখতে হবে না।
asmeurer

@ এসম্যুরার চিয়ার্স খনিতে প্রতিশ্রুতিবদ্ধ বার্তার প্রয়োজন নেই, তবে এটি সূচকের চেয়ে স্ট্যাশ স্ট্যাশ ব্যবহার করা আরও তাত্পর্যপূর্ণ।
জি-উইজ

0

আপনি git checkoutযে অংশগুলিকে পূর্বাবস্থায় ফেরাতে চান তার নাম দিতে এবং করতে পারেন।

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