किसी कमिट में फ़ाइल में परिवर्तन वापस करें


126

मैं केवल किसी विशेष फ़ाइल द्वारा किए गए परिवर्तनों को वापस लेना चाहता हूं।

क्या मैं इसके लिए git रिवर्ट कमांड का उपयोग कर सकता हूं?

इसे करने का कोई और सरल तरीका?


की डुप्लीकेट stackoverflow.com/questions/215718/...
koppor

अजीब ... उन सभी वर्षों के बाद बदलाव क्यों?
VonC

जवाबों:


222

ऐसा करने का सबसे साफ तरीका मैंने यहां बताया है

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

VonC की प्रतिक्रिया के समान लेकिन उपयोग करना git showऔर git apply


10
अच्छी तरह से किया। इसके लिए स्क्रिप्ट सॉल्यूशन ओवरकिल है। वहाँ सिर्फ git re-sha-1 फ़ाइल नाम वापस क्यों नहीं किया जा सकता है?
मार्क एडिंगटन

16
यह मेरे मैक पर काम करता है, लेकिन विंडोज पर ( fatal: unrecognized input
सिग्विन के

1
@MerhawiFissehaye: मुझे लगता है कि git चेकआउट केवल उन परिवर्तनों को फिर से वापस लाएगा, जो राज्य में वापस आए थे। मैंने फ़ाइल नाम जोड़ा; फ़ाइल को कमिट करने के लिए 'कमिट - काम' करें।
वीआईएफआई

3
बस एक टिप, मुझे लगभग हमेशा -3झंडा फहराने के लिए तीन तरह के मर्ज के लिए आवेदन करना पड़ता है जब पैच फेल हो जाता है, क्योंकि मैं आमतौर पर समय में थोड़ा बदलाव बदल रहा हूं।
9

2
हो सकता है कि सबसे स्पष्ट हो, लेकिन यह सुनिश्चित करें some_file.cकि अगर कोई एक है तो फ़ाइल में पथ को शामिल करें अन्यथा आप चुपचाप कुछ भी नहीं करेंगे :)
Warping

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 <3
mraxus

अगर मुझे यह समझ में आता है कि यह git लागू होता है -R उस फ़ाइल पर प्रतिबद्ध को हटाकर मूल परिवर्तित स्थिति में वापस ला देता है?
DaImTo

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

( Smtlaissezfaire से गिट -शेल-स्क्रिप्ट उपयोगिताओं से )


ध्यान दें:

यदि आप अभी तक अपना वर्तमान संशोधन करना चाहते हैं, तो यहां एक और तरीका बताया गया है

git checkout -- filename

git checkout फ़ाइल के लिए कुछ विकल्प हैं, फ़ाइल को HEAD से संशोधित करके, आपके परिवर्तन को ओवरराइट कर रहा है।


Dropped.on.Caprica टिप्पणियों में उल्लेख किया गया है :

आप ऐसा करने के लिए एक उपनाम जोड़ सकते हैं ताकि आप कर सकें git revert-file <hash> <file-loc>और उस विशिष्ट फ़ाइल को वापस किया जा सके।
देखें इस सार

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

बस यहाँ चर्चा में जोड़ने के लिए है, तो आप क्या कर सकते हैं आप Git करने के लिए एक उपनाम जोड़ सकते हैं git revert-file <hash> <file-loc>और उस विशिष्ट फ़ाइल स्वरूप में बदल दी है। मैं इस जवाब से उठा (हालांकि मुझे सही ढंग से काम करने के लिए एक युगल संपादन करना था)। आप मेरी .gitconfigऔर संपादित स्क्रिप्ट की एक प्रति यहाँ पा सकते हैं : gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
AlbertEngelB

@ गिराया गया ।on.Cricrica अच्छा बिंदु। मैंने इसे अधिक दृश्यता के लिए उत्तर में शामिल किया है।
वॉनच

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सभी फ़ाइलों को पहले "unstages", ताकि हम फिर से केवल एक फ़ाइल को वापस जोड़ सकें, जिसे हम वापस चाहते हैं। फ़ाइनल 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

उपरोक्त आदेश परिवर्तनों को वापस करेगा (परिणामस्वरूप आपको HEAD के समान फ़ाइल मिलती है)।

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>

आशा करता हूँ की ये काम करेगा :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.