প্রতিশ্রুতিবদ্ধভাবে কোনও ফাইলে পরিবর্তনগুলি ফিরিয়ে দিন


126

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

আমি কি তার জন্য গিট রিভার্ট কমান্ড ব্যবহার করতে পারি?

এটি করার অন্য কোনও সহজ উপায়?



আজব ... এত বছর পরে কেন পরিবর্তন?
ভনসি

উত্তর:


222

এটি করার মধ্যে সবচেয়ে পরিষ্কার উপায় আমি এখানে বর্ণনা করেছি

git show some_commit_sha1 -- some_file.c | git apply -R

ভনির প্রতিক্রিয়া অনুরূপ তবে ব্যবহার git showএবং git apply


10
সুন্দরভাবে সম্পন্ন. স্ক্রিপ্ট সমাধান এর জন্য ওভারকিল। সেখানে কেবল গিট রিভার্ট শ -১ ফাইলের নাম থাকতে পারে না কেন?
মার্ক এডিংটন

16
এটি আমার fatal: unrecognized input
ম্যাকটিতে

1
@ মেরাহাফি ফিশেহে: আমি মনে করি গিট চেকআউট কেবল পরিবর্তনগুলি আবার ফিরিয়ে আনবে যা অঙ্গীকারবদ্ধ ছিল তা রাজ্যে ফিরে যেতে। আমি 'গিট অ্যাড ফাইলের নাম দিয়েছি; গিট কমিট --amend 'কমিট থেকে ফাইল সরাতে।
ViFI

3
কেবলমাত্র একটি টিপ, -3প্যাচ ব্যর্থ হলে আমি প্রায় সবসময় ত্রি-মুখী সংযোজনের জন্য গিটকে গিটের সাথে যুক্ত করতে হয়, যেহেতু আমি সাধারণত সময়ে কিছুটা পিছনে পরিবর্তন সংশোধন করি।
অ্যাঙ্গুলারসেন

2
সম্ভবত বেশিরভাগের some_file.c
কাছেই সুস্পষ্ট তবে এটির

35

দায়বদ্ধতার ইতিহাস পরিবর্তন করা ঠিক আছে বলে ধরে নেওয়া, পূর্বের প্রতিশ্রুতিতে একটি ফাইলে পরিবর্তনগুলি ফিরিয়ে আনার জন্য এখানে একটি কর্মপ্রবাহ রয়েছে:

উদাহরণস্বরূপ, আপনি প্রতিশ্রুতিবদ্ধভাবে 1 টি ফাইল ( badfile.txt) এর পরিবর্তনগুলি ফিরিয়ে আনতে চান aaa222:

aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit

বেস কমিটকে রিবেস করুন, সমস্যা প্রতিশ্রুতি সংশোধন করুন এবং চালিয়ে যান।

1) ইন্টারেক্টিভ রিবেস শুরু করুন:

git rebase -i aaa111

2) সমস্যা চিহ্নিত করুন পরিবর্তন করে সম্পাদকে সম্পাদনার জন্য কমিট pickকরতে e(সম্পাদনা জন্য):

e aaa222
pick aaa333

3) খারাপ ফাইলে পরিবর্তনগুলি ফিরিয়ে দিন:

git show -- badfile.txt | git apply -R

4) পরিবর্তনগুলি যুক্ত করুন এবং প্রতিশ্রুতি সংশোধন করুন:

git add badfile.txt
git commit --amend

5) রিবেস শেষ:

git rebase --continue

কেবল এটি উল্লেখ করতে চাই যে এটি ধরে নিয়েছে আপনি গিট ইতিহাস সম্পাদনা করতে পারেন। উপরের কিছু উত্তর একটি নতুন প্রতিশ্রুতি তৈরি করে যা ইতিহাস সম্পাদনা না করে নির্দিষ্ট পরিবর্তনকে উল্টে দেয়, যা সর্বদা সম্ভব / অনুমোদিত নয়।
অ্যাঙ্গুলারসেন

ফ্যান্টাস্টিক। এটি ঠিক আমি যা খুঁজছিলাম ছিল। আমার এই ধারণাটি ইতিমধ্যে ছিল, তবে ইন্টারেক্টিভ রিবেস করার সময় বিভ্রান্ত হয়ে পড়েছিলাম যে ফাইলগুলি করার সময় editপরিবর্তনগুলি প্রদর্শিত হচ্ছে না। তবে git show -- badfile.txt | git apply -Rউত্তরটি আমার প্রয়োজনীয় উত্তরটি দিয়েছে <3
মেরাকাস

যদি আমি এই গিট প্রয়োগটি বুঝতে পারি -আর সেই ফাইলটির প্রতিশ্রুতি সরিয়ে দেয় তবে এটির পরিবর্তিত অবস্থায় ফিরে আসবে?
ডাইমটো

19

git revert কমিটের মধ্যে থাকা সমস্ত ফাইল সামগ্রীর জন্য।

একটি একক ফাইলের জন্য, আপনি এটি স্ক্রিপ্ট করতে পারেন :

#!/bin/bash

function output_help {
    echo "usage: git-revert-single-file <sha1> <file>"
}

sha1=$1
file=$2

if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi

( স্মট্লেইজফায়ার থেকে গিট-শেল-স্ক্রিপ্ট ইউটিলিটিগুলি থেকে )


বিঃদ্রঃ:

যদি আপনার বর্তমান পরিবর্তনটি এখনও করা না হয় তবে এখানে অন্য একটি উপায় বর্ণনা করা হয়েছে

git checkout -- filename

git checkout একটি ফাইলের জন্য কিছু অপশন রয়েছে, HEAD থেকে ফাইলটি পরিবর্তন করে, আপনার পরিবর্তনটি ওভাররাইট করে।


ড্রপড.অন.প্রক্রিয়া মন্তব্যগুলিতে উল্লেখ করেছেন :

আপনি গিটে একটি উপনাম যুক্ত করতে পারেন যাতে আপনি এটি করতে পারেন git revert-file <hash> <file-loc>এবং সেই নির্দিষ্ট ফাইলটি আবার ফিরিয়ে দেওয়া যেতে পারে। এই টুকরোটি
দেখুন ।

[alias]
  revert-file = !sh /home/some-user/git-file-revert.sh

কেবল এখানে আলোচনায় যুক্ত করার জন্য, আপনি গিটে একটি উপন্যাস যুক্ত করতে পারেন যাতে আপনি এটি করতে পারেন git revert-file <hash> <file-loc>এবং সেই নির্দিষ্ট ফাইলটি উল্টানো যেতে পারে। আমি এই উত্তরটি থেকে উত্তোলন করেছি (যদিও সঠিকভাবে কাজ করার জন্য আমাকে কয়েকটি সম্পাদনা করতে হয়েছিল)। আপনি আমার .gitconfigএবং সম্পাদিত স্ক্রিপ্টের একটি অনুলিপিটি এখানে পেতে পারেন: gist.github.com/DPpedoncaprica/5b67ec0021371a0ad438
AlbertEngelB

@ Dropped.on.Caprica ভালো পয়েন্ট। আরও দৃশ্যমানতার জন্য আমি এটিকে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

12

আমি কেবল --no-commitবিকল্পটি ব্যবহার করব git-revertএবং তারপরে অবশেষে এটি সম্পাদন করার আগে সূচি থেকে উল্টানো ফাইলগুলি চাই না। দ্বিতীয় সাম্প্রতিক প্রতিশ্রুতিতে কীভাবে সহজেই foo.c এ পরিবর্তনগুলি সহজেই ফিরিয়ে আনা যায় তা এখানে একটি উদাহরণ রয়েছে:

$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD

প্রথম git-resetসমস্ত ফাইল "আনস্টেজ" করে, যাতে আমরা কেবল যে ফাইলটি ফিরে যেতে চাই তা কেবল আবার যুক্ত করতে পারি। ফাইনালটি আমাদের git-reset --hardকাছে রাখতে চাইছে না এমন ফাইলের উল্টাপাল্টা থেকে মুক্তি পেয়ে যায়।


9

অনেক সহজ:

git reset HEAD^ path/to/file/to/revert

তারপর

git commit --amend   

এবং তারপর

git push -f

ফাইলটি চলে গেছে এবং হ্যাশ, বার্তা ইত্যাদি কমিট করে দেয়।


সম্পূর্ণতার জন্য, আপনার কি একটি git checkout -- path/to/file/to/revertপদক্ষেপ দরকার ? এছাড়াও, এটি ঠিক নয় যে হ্যাশ একই পরে আছে, তাই না? সর্বশেষ বাক্যটি এর মতো আরও কিছু ভাল হতে পারে: "ফলাফলটি হ'ল শেষ প্রতিশ্রুতি এমন একটি নতুন দ্বারা প্রতিস্থাপন করা হয়েছিল যা কেবলমাত্র তার মধ্যে পৃথক হয় যা এতে ফেরানো ফাইলের পরিবর্তনগুলি অন্তর্ভুক্ত থাকে না।"
কেভিন

@ কেভিন আপনি সম্ভবত সঠিক আছেন আমাকে সেই শেষ লাইনের দ্বিগুণ পরীক্ষা করতে হবে, কিন্তু কয়েক বছর আগে এইটির দিকে ফিরে তাকালে আমি যদি কমিটের হ্যাশটি অপরিবর্তিত থাকে তবে আমি অবাক হয়ে যাব।
ফরেস্ট

6
git reset HEAD^ path/to/file/to/revert/in/commit

উপরের কমান্ডটি প্রতিশ্রুতিবদ্ধতার বাইরে ফাইল নেবে, তবে এটি প্রতিফলিত হবে git status

git checkout path/to/file/to/revert/in/commit

উপরের কমান্ডটি পরিবর্তনগুলি ফিরিয়ে দেবে (ফলস্বরূপ আপনি ফাইলটি হেডের সমান পাবেন)।

git commit

( --amendঅঙ্গীকার সংশোধন পাস ।)

git push

এটির সাহায্যে, যে ফাইলটি ইতিমধ্যে প্রতিশ্রুতিতে রয়েছে তা সরিয়ে ফেলা হবে।

উপরোক্ত পদক্ষেপগুলি সেই শাখা থেকে অনুসরণ করা উচিত যেখানে প্রতিশ্রুতিবদ্ধ হয়।


5

আপনি এই পদ্ধতিটি অনুসরণ করতে পারেন:

  1. git revert -n <*commit*>( -nসমস্ত পরিবর্তনগুলি ফিরিয়ে দিন তবে সেগুলি প্রতিশ্রুতি দেয় না)
  2. git add <*filename*> (আপনি যে ফাইল / গুলি পুনরায় ফিরিয়ে আনতে চান সেটির নাম)
  3. git commit -m 'reverted message' (ফিরে যাওয়ার জন্য একটি বার্তা যুক্ত করুন)
  4. প্রতিশ্রুতি দেওয়ার পরে অন্যান্য ফাইলগুলির পরিবর্তনগুলি বাতিল করার জন্য ফাইলগুলি পুনর্বারের আগে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলির সাথে আপডেট থাকে

1

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

দয়া করে লক্ষ্য করুন যে ফাইলটি মঞ্চে যুক্ত করা হবে।

git checkout <prev_commit_hash> -- <path_to_your_file>

আশা করি এটা সাহায্য করবে :)

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