मैं केवल किसी विशेष फ़ाइल द्वारा किए गए परिवर्तनों को वापस लेना चाहता हूं।
क्या मैं इसके लिए git रिवर्ट कमांड का उपयोग कर सकता हूं?
इसे करने का कोई और सरल तरीका?
मैं केवल किसी विशेष फ़ाइल द्वारा किए गए परिवर्तनों को वापस लेना चाहता हूं।
क्या मैं इसके लिए git रिवर्ट कमांड का उपयोग कर सकता हूं?
इसे करने का कोई और सरल तरीका?
जवाबों:
ऐसा करने का सबसे साफ तरीका मैंने यहां बताया है
git show some_commit_sha1 -- some_file.c | git apply -R
VonC की प्रतिक्रिया के समान लेकिन उपयोग करना git show
और git apply
।
fatal: unrecognized input
-3
झंडा फहराने के लिए तीन तरह के मर्ज के लिए आवेदन करना पड़ता है जब पैच फेल हो जाता है, क्योंकि मैं आमतौर पर समय में थोड़ा बदलाव बदल रहा हूं।
some_file.c
कि अगर कोई एक है तो फ़ाइल में पथ को शामिल करें अन्यथा आप चुपचाप कुछ भी नहीं करेंगे :)
यह मानते हुए कि कमिटेड हिस्ट्री बदलना ठीक है, यहाँ पहले वाले कमिट में सिंगल फाइल में बदलावों को वापस लाने के लिए वर्कफ़्लो है:
उदाहरण के लिए, आप 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
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 revert-file <hash> <file-loc>
और उस विशिष्ट फ़ाइल स्वरूप में बदल दी है। मैं इस जवाब से उठा (हालांकि मुझे सही ढंग से काम करने के लिए एक युगल संपादन करना था)। आप मेरी .gitconfig
और संपादित स्क्रिप्ट की एक प्रति यहाँ पा सकते हैं : gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
मैं बस --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
शेष फ़ाइल से छुटकारा दिलाता है जिसे हम नहीं रखना चाहते हैं।
बहुत सरल:
git reset HEAD^ path/to/file/to/revert
फिर
git commit --amend
और फिर
git push -f
फ़ाइल चला गया है और हैश, संदेश, आदि समान है।
git checkout -- path/to/file/to/revert
कदम की आवश्यकता है ? इसके अलावा, यह सच नहीं है कि हैश एक ही बाद में है, है ना? अंतिम वाक्य कुछ इस तरह से बेहतर हो सकता है: "परिणाम यह है कि अंतिम प्रतिबद्ध को एक नए द्वारा बदल दिया जाता है जो केवल इस बात में भिन्न होता है कि इसमें उल्टे फ़ाइल में परिवर्तन शामिल नहीं हैं।"
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
इसके साथ, फ़ाइल जो पहले से ही कमिट में है उसे हटा दिया जाता है और वापस कर दिया जाता है।
उपरोक्त चरण का पालन उस शाखा से किया जाना चाहिए जहाँ पर कमिट किया गया है।
आप इस प्रक्रिया का पालन कर सकते हैं:
git revert -n <*commit*>
( -n
सभी परिवर्तनों को वापस लाएं, लेकिन उन्हें कमिट नहीं करेंगे)git add <*filename*>
(उस फ़ाइल का नाम जिसे आप वापस करना चाहते हैं और प्रतिबद्ध हैं)git commit -m 'reverted message'
(श्रद्धा के लिए एक संदेश जोड़ें)यदि आप अपनी पिछली प्रतिबद्ध फ़ाइल से परिवर्तनों को रीसेट करना चाहते हैं, तो यही मैं आमतौर पर उपयोग कर रहा हूं। मुझे लगता है कि यह सबसे सरल उपाय है।
कृपया ध्यान दें कि फ़ाइल को स्टेजिंग क्षेत्र में जोड़ा जाएगा।
git checkout <prev_commit_hash> -- <path_to_your_file>
आशा करता हूँ की ये काम करेगा :)