जीआईटी में एक फाइल की कॉपी में संशोधन करना?


1632

अंतिम प्रतिबद्ध के बाद, मैंने अपनी कार्यशील प्रतिलिपि में फ़ाइलों का एक गुच्छा संशोधित किया, लेकिन मैं उन फ़ाइलों में से एक में परिवर्तन को पूर्ववत् करना चाहता हूं, जैसा कि इसे हाल ही में किए गए कमिट के समान स्थिति में रीसेट करना है।

हालाँकि, मैं केवल उस एक फ़ाइल के काम के परिवर्तन को पूर्ववत करना चाहता हूं, इसके साथ और कुछ नहीं।

मैं उसको कैसे करू?

जवाबों:


2212

आप उपयोग कर सकते हैं

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
HEAD और HEAD ^ में क्या अंतर है?
hasen

62
HEAD वर्तमान शाखा पर सबसे हालिया प्रतिबद्ध है, और HEAD ^ वर्तमान शाखा पर इससे पहले की प्रतिबद्धता है। आपके द्वारा वर्णित स्थिति के लिए, आप git चेकआउट HEAD - फ़ाइल नाम का उपयोग कर सकते हैं।
पॉल

16
संक्षेप में "git चेकआउट sha-reference - फ़ाइल नाम" जहाँ sha-संदर्भ किसी भी रूप (शाखा, टैग, माता-पिता, आदि) की वचनबद्धता के संदर्भ का संदर्भ है
लक्ष्मण प्रसाद

29
नोट: यदि फ़ाइल पहले से ही मंचित है, तो आपको इसे पहले रीसेट करने की आवश्यकता है। git reset HEAD <filename> ; git checkout -- <filename>
ओली

14
@gwho हां, आप 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और x एक शाखा का नाम होने के साथ-साथ एक फ़ाइल नाम भी है, तो मुझे यकीन नहीं है कि डिफ़ॉल्ट व्यवहार क्या है, लेकिन मुझे लगता है कि git मान जाएगा कि आप शाखा x पर स्विच करना चाहते हैं। जब आप उपयोग --करते हैं तो आप कह रहे हैं कि फ़ाइल नाम (ओं) का अनुसरण क्या है।
hasen

1
आईसी कि समाशोधन के लिए धन्यवाद। हर कोई मानता है कि आप जानते हैं कि इसका क्या मतलब है - जब वे आपको उदाहरण दिखाते हैं। और इसका कुछ ऐसा नहीं है जिसे आप आसानी से भी कर सकते हैं।
पाटोशी at ト

1
लगता है कि इससे निकालने के लिए उत्तर को संपादित किया गया था --। हालांकि अभी भी सही है, जैसा कि @हासेन बताते हैं, अगर फ़ाइल नाम और शाखा नामों के बीच अस्पष्टता है, तो आप बहुत अवांछित व्यवहार के साथ समाप्त हो सकते हैं!
BrainSlugs83

2
मुझे यह पसंद है कि यह बिना --, अच्छा और आसान है। जब आप फ़ाइल नाम का उपयोग करते हुए शाखाओं का नाम देते हैं, तो कहीं न कहीं बुरी सोच होनी चाहिए ...
मार्को फॉस्टिनेली

133
git checkout <commit> <filename>

मैंने आज इसका इस्तेमाल किया क्योंकि मुझे एहसास हुआ कि मेरे फ़ेविकॉन को कुछ समय पहले कमिटेड कर दिया गया था, जब मैं 6.10 से ड्रुपल हो गया था, इसलिए मुझे इसे वापस लेना पड़ा। मैंने जो किया था यह रहा:

git checkout 088ecd favicon.ico

1
"Git log --stat" आउटपुट स्क्रॉल थ्रो के अलावा मुझे कमिट (पहले की डिलीट हुई फाइल) कैसे मिलती है?
एलेक्स

4
IMO यह कमांड लाइन के माध्यम से गेट्स लॉग के माध्यम से स्कैन करने और सही फ़ाइल खोजने के लिए कठिन है। यह GUI ऐप जैसे कि sourcetreeapp.com
neoneye

6
git log --oneline <filename>आपको एक अधिक कॉम्पैक्ट लॉग देगा, और केवल विशिष्ट फ़ाइल में परिवर्तन शामिल करता है
rjmunro

1
वैकल्पिक रूप से, आप उपयोग कर सकते हैंgit reflog <filename>
ygesher

70

यदि आपकी फ़ाइल पहले से ही मंचित है (तब होता है जब आप फ़ाइल संपादित होने के बाद एक git ऐड आदि करते हैं) अपने परिवर्तनों को अनस्टेज करने के लिए।

उपयोग

git reset HEAD <file>

फिर

git checkout <file>

यदि पहले से ही मंचन नहीं हुआ है, तो उपयोग करें

git checkout <file>

2
यह स्वीकृत हाहा की तुलना में अधिक मददगार रहा है। यह भूलना आसान है कि क्या परिवर्तनों का मंचन किया गया है और क्या नहीं है, इसलिए रीसेट करने में मदद मिली। हालाँकि मैंने पहले भी "git reset --hard" की कोशिश की थी, लेकिन इसने "git रीसेट HEAD" नहीं किया। मुझे आश्चर्य है क्योंकि?
बजे अरमान बिमातोव

20

यदि आप पिछले एक फ़ाइल में पिछले प्रतिबद्ध परिवर्तनों को पूर्ववत करना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

git checkout branchname^ filename

यह फ़ाइल को चेक करेगा क्योंकि यह अंतिम प्रतिबद्ध से पहले था। यदि आप कुछ और वापस जाना चाहते हैं, तो branchname~nनोटेशन का उपयोग करें ।


यह कमिट से बदलावों को दूर नहीं करेगा, यह सिर्फ HEAD पर संस्करण के लिए लागू होगा।
फर्नांडोएशर

2
सच है, मूल पोस्टर सिर्फ अपने काम की कॉपी संशोधनों (मुझे लगता है) को वापस करना चाहता था, न कि पिछले प्रतिबद्ध से बदलावों को वापस करना। मूल पोस्टर का सवाल थोड़ा अस्पष्ट था, इसलिए मैं भ्रम को समझ सकता हूं।

शायद ओपी का उपयोग नहीं है, लेकिन मैं इस बात की तलाश कर रहा था कि मास्टर की कॉपी के साथ अपनी शाखा को कैसे अधिलेखित करूं - यह जगह बदलने पर काफी अच्छी तरह से काम करता हैbranchname^
एलेक्स

15

मैं गश मार के माध्यम से किया है:

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

  1. गिट स्थिति। [तो हमने एक फाइल को संशोधित करके देखा है।]
  2. git checkout - index.html [मैं index.html फ़ाइल में बदल गया हूँ:
  3. git स्थिति [अब उन परिवर्तनों को हटा दिया गया]

यहां छवि विवरण दर्ज करें


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

name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext के बीच के स्थान को ध्यान में रखें

एक ही फ़ोल्डर में कई फ़ाइलों के लिए:

यदि आपको किसी निश्चित निर्देशिका में सभी फ़ाइलों के लिए परिवर्तनों को छोड़ने की आवश्यकता होती है, तो निम्नानुसार git चेकआउट का उपयोग करें:

git checkout -- name1/name2/*

उपरोक्त में तारांकन चिह्न name1 / name2 के तहत उस स्थान पर सभी फ़ाइलों को पूर्ववत करने की चाल है।

और, इसी तरह निम्नलिखित कई फ़ोल्डरों के लिए सभी फ़ाइलों में परिवर्तन पूर्ववत कर सकते हैं:

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

फिर से उपरोक्त नाम name1 / name2 / * nameA / subFolder / * के बीच की जगह को ध्यान में रखें।

नोट: name1, name2, nameA, सबफ़ोल्डर - इन सभी उदाहरण फ़ोल्डर नामों से उस फ़ोल्डर या पैकेज का संकेत मिलता है जहाँ प्रश्न में फ़ाइल (s) का निवास हो सकता है।


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

मुझे नहीं पता, लेकिन जब मैं अपना कोड दर्ज करने की कोशिश करता हूं, तो यह एक छवि के रूप में सामने आता है।

यहां छवि विवरण दर्ज करें

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