git - tutorial - मैं गिट में अस्थिर परिवर्तनों को कैसे छोड़ूं?




github tutorial (20)

मैं अपनी कार्यशील प्रति में परिवर्तनों को कैसे हटा सकता हूं जो इंडेक्स में नहीं हैं?


आप गिट स्टैश का उपयोग कर सकते हैं - अगर कुछ गलत हो जाता है, तो भी आप स्टैश से वापस आ सकते हैं। यहां कुछ अन्य उत्तरों के समान, लेकिन यह सभी अस्थिर फ़ाइलों को भी हटा देता है और सभी अस्थिर डिलीट भी हटाता है:

git add .
git stash

यदि आप जांचते हैं कि सब कुछ ठीक है, तो छिड़काव फेंक दें:

git stash drop

git clean साथ बिलाल मकसूद का जवाब भी मेरे लिए काम करता था, लेकिन छेड़छाड़ के साथ मेरा अधिक नियंत्रण होता है - अगर मैं गलती से sth करता हूं, तो भी मैं अपने बदलाव वापस कर सकता हूं

अद्यतन करें

मुझे लगता है कि 1 और बदलाव है (पता नहीं क्यों यह मेरे लिए पहले काम किया):

git add . -A git add . -A git add . बजाय git add .

बिना हटाए गए फाइलों का मंचन नहीं किया जाएगा


ऊपर दिए गए सभी समाधानों का प्रयास किया लेकिन अभी भी नई, अस्थिर फ़ाइलों से छुटकारा नहीं मिल सका।

उन नई फ़ाइलों को हटाने के लिए git clean -f का उपयोग करें - हालांकि सावधानी के साथ! बल विकल्प नोट करें।


ऐसा करने का सबसे आसान तरीका इस आदेश का उपयोग करना है:

यह आदेश कार्य निर्देशिका में परिवर्तनों को त्यागने के लिए प्रयोग किया जाता है -

git checkout -- .

https://git-scm.com/docs/git-checkout

गिट कमांड में, अनचाहे फ़ाइलों को छेड़छाड़ का उपयोग करके हासिल किया जाता है:

git stash -u

http://git-scm.com/docs/git-stash


ऐसा लगता है कि पूरा समाधान है:

git clean -df
git checkout -- .

git-scm.com/docs/git-clean सभी अनचाहे फ़ाइलों को हटा देता है ( चेतावनी : जबकि यह सीधे .gitignore में उल्लिखित अनदेखी फ़ाइलों को हटा नहीं देगा, यह फ़ोल्डर में रहने वाली अनदेखी फ़ाइलों को हटा सकता है ) और git checkout सभी अस्थिर परिवर्तनों को साफ़ करता है।


चूंकि कोई जवाब सटीक विकल्प संयोजन का सुझाव देता है जिसका मैं उपयोग करता हूं, यहां यह है:

git clean -dfx
git checkout .

उपयोग किए गए git clean विकल्पों के लिए यह ऑनलाइन सहायता टेक्स्ट है:

-d

अनचाहे फ़ाइलों के अलावा अनचाहे निर्देशिका हटाएं। यदि एक अनचाहे निर्देशिका को एक अलग गिट भंडार द्वारा प्रबंधित किया जाता है, तो इसे डिफ़ॉल्ट रूप से हटाया नहीं जाता है। यदि आप वास्तव में ऐसी निर्देशिका को हटाना चाहते हैं तो -f विकल्प दो बार उपयोग करें।

-f

यदि गिट कॉन्फ़िगरेशन वेरिएबल clean.requireForce को false सेट नहीं किया गया false , तो गिट क्लीन फाइलों या निर्देशिकाओं को हटाने से इनकार कर देगा जब तक -f , -n , या -i । गिट .git उपनिर्देशिका या फ़ाइल के भीतर निर्देशिका को हटाने से इंकार कर देगा, जब तक कि कोई दूसरा- -f दिया जाता है।

-x

$GIT_DIR/info/exclude (प्रति निर्देशिका) और $GIT_DIR/info/exclude से अनदेखा नियमों का उपयोग न करें, लेकिन अभी भी विकल्पों के साथ दिए गए अनदेखा नियमों का उपयोग करें। यह बिल्ड उत्पादों सहित सभी अनचाहे फ़ाइलों को हटाने की अनुमति देता है। स्वच्छ निर्माण का परीक्षण करने के लिए एक प्राचीन कार्यशील निर्देशिका बनाने के लिए इसका उपयोग संभवतः git reset के साथ किया जा सकता है।

इसके अलावा, git checkout . रेपो की जड़ में किया जाना चाहिए।


जैसे ही आप गिट स्थिति टाइप करते हैं , (कार्यशील निर्देशिका में परिवर्तनों को त्यागने के लिए "गिट चेकआउट - ..." का उपयोग करें) दिखाया गया है।

उदाहरण के लिए git checkout -- .


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

इसलिए मैं यह सुनिश्चित करने के लिए ऐसा करता हूं कि जब मैं रीसेट करता हूं तो वे वहां नहीं बैठते हैं (बाद में - उत्पत्ति / ब्रंचनिक पर गिटिनोरेस को छोड़कर)

नोट: यदि आप फ़ाइलों को अभी तक ट्रैक नहीं करना चाहते हैं, लेकिन GITIGNORE में नहीं, तो आप इस चरण को छोड़ना चाहेंगे, क्योंकि यह आपके रिमोट रिपॉजिटरी (धन्यवाद @XtrmJosh) पर नहीं मिले इन अनचाहे फ़ाइलों को मिटा देगा।

git add --all

तब मैं

git fetch --all

फिर मैं मूल पर रीसेट कर दिया

git reset --hard origin/branchname

यह इसे वापस वर्ग में रखेगा। शाखा की आरई क्लोनिंग की तरह, जब भी मेरी सभी गिटिग्नर फाइलें स्थानीय रूप से और जगह पर रखती हैं।

नीचे प्रति उपयोगकर्ता टिप्पणी अपडेट की गई: उपयोगकर्ता द्वारा चालू की जाने वाली मौजूदा शाखा को रीसेट करने के लिए भिन्नता।

git reset --hard @{u}

बस कहो

git stash

यह आपके सभी स्थानीय परिवर्तनों को हटा देगा। आप बाद में भी कहकर उपयोग कर सकते हैं

git stash apply 

या गिट स्टैश पॉप


मुझे वास्तव में यह आलेख उपयोगी लगता है कि किस आदेश का उपयोग करना है: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

कुछ अलग-अलग मामले हैं:

  1. यदि आपने फ़ाइल का मंचन नहीं किया है, तो आप git checkout उपयोग करते हैं। चेकआउट "इंडेक्स में संस्करण से मेल खाने के लिए काम करने वाले पेड़ में फाइलें अपडेट करता है"। अगर फाइलों का मंचन नहीं किया गया है (उर्फ इंडेक्स में जोड़ा गया है) ... यह आदेश अनिवार्य रूप से फाइलों को वापस ले जाएगा जो आपकी आखिरी प्रतिबद्धता थी।

    git checkout -- foo.txt

  2. यदि आपने फ़ाइल का मंचन किया है, तो गिट रीसेट का उपयोग करें। एक प्रतिबद्धता से मेल खाने के लिए इंडेक्स को रीसेट करें रीसेट करें।

    git reset -- foo.txt

मुझे संदेह है कि git stash का उपयोग करना एक लोकप्रिय विकल्प है क्योंकि यह थोड़ा कम खतरनाक है। यदि आप गिट रीसेट का उपयोग करते समय गलती से बहुत दूर उड़ते हैं तो आप हमेशा उस पर वापस जा सकते हैं। रीसेट डिफ़ॉल्ट रूप से रिकर्सिव है।

आगे की सलाह के लिए ऊपर दिए गए लेख पर नज़र डालें।


मेरी पसंदीदा है

git checkout -p

यह आपको चुनिंदा रूप से हिस्सों को वापस करने देता है।

यह भी देखें:

git add -p

यदि आप अस्थिर परिवर्तनों को रखने में रुचि नहीं रखते हैं (विशेष रूप से यदि चरणबद्ध परिवर्तन नई फाइलें हैं), तो मुझे यह आसान लगता है:

git diff | git apply --reverse

यदि आप एक रिपोजिटरी के कांटे से काम कर रहे हैं तो वास्तव में केवल एक समाधान है जहां आप नियमित रूप से सिंक्रनाइज़ करते हैं (उदाहरण के लिए पुल अनुरोध) किसी अन्य रेपो के साथ। संक्षिप्त उत्तर: कांटा और रीफोर हटाएं, लेकिन जिथब पर चेतावनियां पढ़ें

मुझे एक जैसी समस्या थी, शायद समान नहीं, और मुझे यह कहना दुखद है कि मेरा समाधान आदर्श नहीं है, लेकिन यह अंततः प्रभावी है।

मुझे अक्सर इस तरह गिट स्टेटस संदेश होंगे (कम से कम 2/4 फाइलें शामिल हैं):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

एक गहरी आंख ध्यान देगी कि इन फाइलों में डोप्लेगेंजर्स हैं जो मामले में एक ही पत्र हैं। किसी भी तरह, और मुझे नहीं पता कि मुझे इस पथ को शुरू करने के लिए किस तरह से शुरू किया गया था (क्योंकि मैं इन फ़ाइलों के साथ अपस्ट्रीम रेपो से खुद काम नहीं कर रहा था), मैंने इन फ़ाइलों को स्विच किया था। इस पृष्ठ (और अन्य पृष्ठों) पर सूचीबद्ध कई समाधानों को आजमाएं।

मैं अपने फोर्कड रिपोजिटरी और सभी स्थानीय भंडारों को हटाने और रीफोरिंग करके समस्या को ठीक करने में सक्षम था। यह अकेला पर्याप्त नहीं था; अपस्ट्रीम को फाइलों को नए फाइलनामों में नाम बदलना पड़ा। जब तक आपके पास कोई असामान्य काम नहीं है, कोई विकी नहीं है, और अपस्ट्रीम रिपोजिटरी से अलग होने वाले कोई भी मुद्दे नहीं हैं, तो आपको ठीक होना चाहिए। कम से कम कहने के लिए अपस्ट्रीम आपके साथ बहुत खुश नहीं हो सकता है। मेरी समस्या के लिए, निस्संदेह यह एक उपयोगकर्ता त्रुटि है क्योंकि मैं गिट के साथ कुशल नहीं हूं, लेकिन तथ्य यह है कि यह गिट के साथ किसी भी मुद्दे पर अंक को ठीक करने के लिए आसान है।


यह निर्देशिकाओं में भी काम करता है; सामान्य गिट अनुमतियों के बाहर।

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

हाल ही में मुझे हुआ


यह वर्तमान निर्देशिका के लिए मौजूदा इंडेक्स को जांचता है, वर्तमान निर्देशिका से फ़ाइलों में सभी परिवर्तनों को नीचे फेंक देता है।

git checkout .

या यह इंडेक्स से सभी फाइलों को जांचता है, काम कर रहे पेड़ फ़ाइलों को ओवरराइट करता है।

git checkout-index -a -f

git checkout -f

man git-checkout :

-f, --force

शाखाओं को स्विच करते समय, सूचकांक या काम करने वाला पेड़ हेड से अलग होने पर भी आगे बढ़ें। इसका उपयोग स्थानीय परिवर्तनों को फेंकने के लिए किया जाता है।

इंडेक्स से पथों की जांच करते समय, अनमोल प्रविष्टियों पर असफल न हों; इसके बजाय, अनमोल प्रविष्टियों को नजरअंदाज कर दिया जाता है।


आप अपना खुद का उपनाम बना सकते हैं जो वर्णन करता है कि इसे वर्णनात्मक तरीके से कैसे किया जाए।

मैं परिवर्तनों को त्यागने के लिए अगले उपनाम का उपयोग करता हूं।

काम करने वाले पेड़ में एक (सूची) फ़ाइल में परिवर्तनों को छोड़ दें

discard = checkout --

फिर आप सभी परिवर्तनों को त्यागने के बगल में इसका उपयोग कर सकते हैं:

discard .

या सिर्फ एक फाइल:

discard filename

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

काम करने वाले पेड़ में बदलावों और अनचाहे फ़ाइलों को साफ और त्यागें

cleanout = !git clean -df && git checkout -- .

तो उपयोग अगले के रूप में सरल है:

cleanout

अब अगले गिथब रेपो में उपलब्ध है जिसमें बहुत सारे उपनाम हैं:


मेरे पास एक अजीब स्थिति थी जहां एक फ़ाइल हमेशा अस्थिर होती है, इससे मुझे हल करने में मदद मिलती है।

गिट आरएम। gitattributes
गिट एड-ए
गिट रीसेट - हार्ड


यदि आप सबमिशन के मामले में हैं और कोई अन्य समाधान कार्य करने का प्रयास नहीं करते हैं:

  • यह जांचने के लिए कि समस्या क्या है (शायद एक "गंदा" मामला) उपयोग करें:

    git diff

  • छिपाने के लिए

    git submodule update


समाधानों में से कोई भी काम नहीं करता है अगर आपने फ़ाइल की अनुमतियों को अभी बदल दिया है (यह डॉस / विंडोज़ पर है)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

इसे ठीक करने का एकमात्र तरीका बदली गई फ़ाइलों पर अनुमतियों को मैन्युअल रूप से रीसेट करना है:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory






git