मैं यह कहकर समाधान कैसे कर सकता हूं कि "अपने परिवर्तनों को कमिट करें या उन्हें मर्ज करने से पहले उन्हें रोकें"?


761

मैंने अपने स्थानीय मशीन पर कुछ अपडेट किए, उन्हें एक दूरस्थ रिपॉजिटरी में धकेल दिया, और अब मैं सर्वर में बदलावों को खींचने की कोशिश कर रहा हूं और मुझे संदेश मिल गया है;

त्रुटि: निम्न फ़ाइलों में आपके स्थानीय परिवर्तन मर्ज द्वारा अधिलेखित हो जाएंगे:

WP-सामग्री / w3tc-config / master.php

कृपया, अपने बदलाव करें या मर्ज करने से पहले उन्हें रोक दें।

तो मैं भागा,

git checkout -- wp-content/w3tc-config/master.php

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

कोई विचार?



11
यह अधिक विवरण और बेहतर उत्तर के साथ अधिक स्पष्ट प्रश्न है। मुझे लगता है कि यह एक के आसपास रखने के लिए मूल्यवान है। हां, दूसरे को तकनीकी रूप से पहले पूछा गया था, लेकिन इस एक को हटाने से लोगों को उन उत्तरों को ढूंढना अधिक कठिन हो जाएगा, जिनकी वे तलाश कर रहे हैं।
जो स्प्रैग

जवाबों:


1298

आप स्थानीय संशोधनों के साथ विलय नहीं कर सकते। Git आपको संभावित महत्वपूर्ण परिवर्तनों को खोने से बचाता है।

आपके पास तीन विकल्प हैं:

  • का उपयोग कर परिवर्तन करें

    git commit -m "My message"
    
  • इसे स्टेश करें।

    स्टैशिंग एक स्टैक के रूप में कार्य करता है, जहां आप परिवर्तनों को धक्का दे सकते हैं, और आप उन्हें रिवर्स ऑर्डर में पॉप कर सकते हैं।

    टाइप करने के लिए, टाइप करें

    git stash
    

    मर्ज करें, और फिर स्टैश खींचें:

    git stash pop
    
  • स्थानीय परिवर्तनों को त्यागें

    का उपयोग कर git reset --hard
    याgit checkout -t -f remote/branch

    या: किसी विशिष्ट फ़ाइल के लिए स्थानीय परिवर्तन छोड़ें

    का उपयोग करते हुए git checkout filename


104
आप किसी विशिष्ट फ़ाइल के लिए स्थानीय परिवर्तन भी कर सकते हैं: git चेकआउट फ़ाइल नाम
ckb

6
धन्यवाद। मैं इसे git reset --hardजोड़ूंगा , अगर आप करते हैं तो आप अन-फाइल को हटाना भी चाहते हैंgit clean -dfx
Jo Sprague

13
डिफ़ॉल्ट रूप से git stashउन फ़ाइलों को स्टैश नहीं करेंगे, जिनके लिए कोई इतिहास नहीं है। इसलिए यदि आपके पास ऐसी फाइलें हैं जिन्हें आपने अभी तक नहीं जोड़ा है, लेकिन जो मर्ज द्वारा अधिलेखित या "बनाया" जाएगा, तो मर्ज अभी भी ब्लॉक हो जाएगा। उस स्थिति में, आप उपयोग न की git stash -uगई फ़ाइलों को भी छिपाने के लिए उपयोग कर सकते हैं । या आप उन्हें हटा सकते हैं!
joeytwield

25
दौड़ना git clean -dfxएक भयानक विचार था। कुछ .gitignored फ़ाइलों को हटाया, जिनकी मुझे वास्तव में आवश्यकता थी।
एक्जुक

5
मुझे एक ऐसी स्थिति का सामना करना पड़ा है जहाँ एक उपयोगकर्ता, करने के बाद git reset --hardभी अभी भी परिवर्तन नहीं हुआ है!
एमी वैन गैंसे

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

पहला कमांड आपके परिवर्तनों को अस्थायी रूप से स्‍टैश में संग्रहीत करता है और उन्हें कार्यशील निर्देशिका से निकाल देता है।

दूसरी कमांड शाखाओं को स्विच करती है।

तीसरा आदेश उन परिवर्तनों को पुनर्स्थापित करता है, जिन्हें आपने स्टाॅस में संग्रहीत किया है ( --indexविकल्प यह सुनिश्चित करने के लिए उपयोगी है कि चरणबद्ध फाइलें अभी भी मंचित हैं)।


1
stackoverflow.com/questions/15286075/… , साथ ही उपयोगी हो सकता है
विक्रमवी

2
vikramvi की बात समझाने के लिए: हम git stash popइसके बजाय का उपयोग कर सकते हैं git stash apply। पूर्व इसे स्टैश से हटा देता है जबकि उत्तरार्द्ध अभी भी इसे वहां रखता है
अनुपम

27

आप निम्न विधियों में से एक को आजमा सकते हैं:

रिबेस

साधारण परिवर्तनों के लिए, परिवर्तनों को खींचते समय इसके शीर्ष पर रिबासिंग का प्रयास करें, जैसे

git pull origin master -r

तो यह आपकी वर्तमान शाखा को अपस्ट्रीम शाखा के शीर्ष पर लाने के बाद लागू होगा।

इस के बराबर है: checkout master, fetchऔर rebase origin/masterGit आदेशों।

यह ऑपरेशन का एक संभावित खतरनाक तरीका है। यह इतिहास को फिर से लिखता है, जब आप उस इतिहास को पहले ही प्रकाशित कर चुके होते हैं तो वह अच्छी तरह से नहीं झुकता। जब तक आप git-rebase(1)ध्यान से नहीं पढ़े हैं तब तक इस विकल्प का उपयोग न करें ।


चेक आउट

यदि आप अपने स्थानीय परिवर्तनों की परवाह नहीं करते हैं, तो आप अन्य शाखा को अस्थायी (बल के साथ), और इसे वापस स्विच कर सकते हैं, जैसे

git checkout origin/master -f
git checkout master -f

रीसेट

यदि आप अपने स्थानीय परिवर्तनों की परवाह नहीं करते हैं, तो इसे HEAD (मूल स्थिति) में रीसेट करने का प्रयास करें, जैसे

git reset HEAD --hard

यदि ऊपर मदद नहीं करेगा, तो यह आपकी गिट सामान्यीकरण फ़ाइल ( .gitattributes) में नियम हो सकता है, इसलिए यह बेहतर है कि वह जो कहता है उसे करने के लिए। या आपका फ़ाइल सिस्टम अनुमतियों का समर्थन नहीं करता है, इसलिए आपको filemodeअपने git config में अक्षम करना होगा ।

संबंधित: मैं स्थानीय फ़ाइलों को अधिलेखित करने के लिए "गिट पुल" को कैसे मजबूर कर सकता हूं?


1
काम न करें: मुझे अभी भी वही संदेश मिलता है जैसे "पहले अपने परिवर्तनों को रोकें"। जब मैं "गिट स्टैश" टाइप करता हूं और फिर "गिट पुल" -> "त्रुटि: आपके पास सहेजे नहीं गए परिवर्तन .. पहले एक स्टैश करें"। मेरे कंप्यूटर को नष्ट करने से कुछ समय पहले
trinity420

@ trinity420 क्या यह आपकी फ़ाइल अनुमति हो सकती है, जाँचें git statusकि आपके पास स्टैशिंग के बाद क्या परिवर्तन हैं। यदि कोई भी उत्तर मदद नहीं करता है, तो एक नया प्रश्न जोड़ने पर विचार करें।
kenorb

धन्यवाद, लेकिन मेरी समस्या हल हो गई, यहाँ पर सब कुछ करने की कोशिश की, कुछ भी काम नहीं किया, फिर PHPStorm में "बदलाव करें" "मर्ज" पर क्लिक किया और फिर मैंने परिवर्तन को अनसुना कर दिया और यह काम किया ..
trinity420


13

तो मैं जिस स्थिति में भाग गया वह निम्नलिखित थी:

त्रुटि: निम्न फ़ाइलों के लिए आपके स्थानीय परिवर्तन मर्ज द्वारा अधिलेखित हो जाएंगे: wp-content / w3tc-config / master.php कृपया, अपने परिवर्तनों को कमिट करें या मर्ज करने से पहले उन्हें स्टैश करें।

सिवाय इसके कि, ठीक पहले, रिमोट था: इसलिए वास्तव में यह है:

दूरस्थ: त्रुटि: निम्न फ़ाइलों के लिए आपके स्थानीय परिवर्तन मर्ज द्वारा अधिलेखित हो जाएंगे: कुछ / file.ext कृपया, अपने परिवर्तन करें या उन्हें मर्ज करने से पहले उन्हें रोकें।

क्या हो रहा था (मुझे लगता है, 100% सकारात्मक नहीं) गिट पोस्ट प्राप्त हुक को चलाने के लिए शुरू हो रहा था और दूरस्थ सर्वर रिपॉजिटरी में आंदोलन परिवर्तन के कारण खराब हो गया था, जो कि सिद्धांत रूप में, स्पर्श नहीं किया जाना चाहिए था।

इसलिए मैंने पोस्ट-प्राप्त हुक के माध्यम से पता लगाने और इसे खोजने के बाद क्या किया, सर्वर पर दूरस्थ रिपॉजिटरी में जाने के लिए था, और इसमें परिवर्तन था (जो मेरे स्थानीय रिपॉजिटरी पर नहीं था, जो वास्तव में था,) यह कहा कि यह मेल खाता है, कोई बदलाव नहीं, कुछ भी नहीं, तारीख तक, आदि) इसलिए जब स्थानीय पर, सर्वर पर कोई बदलाव नहीं हुए, तो मैंने एक किया git checkout -- some/file.extऔर फिर स्थानीय और दूरस्थ रिपॉजिटरी वास्तव में मेल खाते थे और मैं कर सकता था काम करना जारी रखें, और तैनात करें। पूरी तरह से निश्चित नहीं है कि यह स्थिति कैसे हुई, हालांकि कुछ दर्जन डेवलपर्स प्लस आईटी परिवर्तनों के साथ कुछ करना पड़ सकता है।


2
यह एक सवाल है या एक जवाब है?
stdcall

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

7

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

मेरे मामले में, मैं फाइलें नहीं रखना चाहता था, इसलिए यह मेरे लिए काम कर रहा है:

Git 2.11 और नया:

git clean  -d  -fx .

पुराना Git:

git clean  -d  -fx ""

संदर्भ: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x का अर्थ है अनदेखा की गई फ़ाइलों को हटाने के साथ-साथ अनजान फ़ाइलों को भी हटाया जाना।

  • -d का मतलब है अनट्रैक फाइल्स के अलावा अनट्रेक्टेड डायरेक्ट्रीज को हटाना।

  • -यदि इसे चलाने के लिए मजबूर करना आवश्यक है।


4

इस समस्या को हल करते समय अपनी नई बनाई गई फ़ाइलों का रिकॉर्ड रखने के लिए:

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

  1. अपने स्थानीय परिवर्तनों को स्टेज करें। (कमिट न करें)। नई बनाई गई फ़ाइलों का पैच बनाने के लिए स्टेजिंग की आवश्यकता होती है (क्योंकि वे अभी भी अनियंत्रित हैं)

git add .

  1. रिकॉर्ड रखने के लिए एक पैच बनाएँ

git diff --cached > mypatch.patch

  1. स्थानीय परिवर्तनों को छोड़ें और नई स्थानीय फ़ाइलों को हटा दें

git reset --hard

  1. खींचो बदलाव

git pull

  1. अपना पैच अप्लाई करें

git apply mypatch.patch

Git परिवर्तनों को मर्ज करेगा और उन परिवर्तनों के लिए .rej फ़ाइलें बनाएगा जो मर्ज नहीं किए गए हैं।

अनु द्वारा सुझाए गए अनुसार, यदि आपके पास पैच लगाने के मुद्दे हैं, तो कोशिश करें:

git apply --reject --whitespace=fix mypatch.patch यह उत्तर git: पैच लागू नहीं होता है इस मुद्दे के बारे में विस्तार से बातचीत

अपनी सुविधा पर अपने निरंतर काम का आनंद लें, और जब किया जाता है तो अपने स्थानीय परिवर्तन करें।


मैं नए बदलावों के साथ कोड के एक हिस्से को पुश करना चाहता था इसलिए मैंने किया: 1. मेरी स्थानीय देव शाखा से एक पैच बनाया। 2 हार्ड रीसेट किया। 3. नए बदलावों को मास्टर से देव (किसी भी मर्ज से बचने के लिए) खींचें मेरे स्थानीय देव में एक छोटा सा परिवर्तन किया गया। 5. दूरस्थ देव को धक्का दिया। 6. पैच बैक अप लागू किया -> त्रुटि मिली: error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyमेरे पास अभी भी mypatch.patch है, लेकिन पता नहीं क्यों यह लागू नहीं हो रहा है और मैंने अपने परिवर्तन खो दिए हैं !
अनु 0

मुझे मिल गया, सही आज्ञा थी git apply --reject --whitespace=fix mypatch.patch, मुझे मेरे बदलाव वापस मिल गए !!! [थैंक्स टू] ( stackoverflow.com/a/15375869/6484358 )
अनु

1
अनु, कमांड गिट लागू करें mypatch.patch पैच लगाने के लिए सही है, यह वही है जो मैं हर समय उपयोग करता हूं, निर्मित पैच के साथ कुछ समस्या हो सकती है, और यदि आपके हाथ में पैच है, तो आप कभी भी अपना बदलाव नहीं खोते हैं, यह इसमें सभी समेकित परिवर्तन शामिल हैं।
मनप्रीत

2

खींचने से पहले कमिट करने के लिए कहना

  • जीआईटी की मार
  • जीआईटी पुल ओरिजिन << ब्रांचनाम >>

अगर जरुरत हो :

  • गिट स्टैश लागू होते हैं

1
जब आप वर्किंग डायरेक्टरी और इंडेक्स की वर्तमान स्थिति को रिकॉर्ड करना चाहते हैं, लेकिन एक क्लीन वर्किंग डायरेक्टरी में वापस जाना चाहते हैं, तो git stash का उपयोग करें। कमांड आपके स्थानीय संशोधनों को दूर करता है और HEAD कमिट से मिलान करने के लिए वर्किंग डायरेक्टरी को वापस करता है।
पुष्पक शर्मा

2

सिर्फ मेरे लिए git reset --hard काम किया।

कमिट करना कोई विकल्प नहीं था, क्योंकि इसमें कुछ भी नहीं था।

स्टैशिंग एक विकल्प नहीं था क्योंकि वहाँ कुछ भी नहीं था।

ऐसा लगता है कि इसमें कुछ फ़ाइलों को शामिल नहीं किया गया था .git/info/excludeऔर git update-index --assume-unchanged <file>कुछ फ़ाइलों को संपादित किया गया था।


0

मेरे मामले में, मैंने बैकअप लिया और फिर उस फ़ाइल को हटा दिया, जिसके बारे में Git शिकायत कर रहा था, प्रतिबद्ध था, तब मैं अंततः दूसरी शाखा की जांच करने में सक्षम था।

मैंने फिर फ़ाइल को प्रतिस्थापित किया, सामग्री में वापस कॉपी किया और जारी रखा जैसे कि कुछ भी नहीं हुआ।



0

मैंने पहला उत्तर देने की कोशिश की: git stashउच्चतम स्कोर के साथ लेकिन त्रुटि संदेश अभी भी पॉप अप किया गया था, और फिर मैंने इस लेख को नष्ट करने के बजाय बदलाव के लिए पाया 'अनिच्छुक कमिट' के ।

और त्रुटि संदेश अंत में गायब हो गया:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

तब इसने काम किया। उम्मीद है कि यह उत्तर मदद करता है। :)


0

यदि आप Git एक्सटेंशन का उपयोग कर रहे हैं, तो आपको Working directoryनीचे दिखाए गए अनुसार अपने स्थानीय परिवर्तन खोजने में सक्षम होना चाहिए :

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

यदि आपको कोई परिवर्तन नहीं दिखता है, तो यह संभवतः इसलिए है क्योंकि आप गलत उप-मॉड्यूल पर हैं। तो नीचे दिखाए गए अनुसार सबमरीन आइकन वाली सभी वस्तुओं की जाँच करें:

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

जब आपको कुछ परिवर्तन नहीं मिले:

के साथ लाइन का चयन करें Working directory, डिफ टैब पर नेविगेट करें, एक पेंसिल (या +या -) आइकन के साथ पंक्तियों पर राइट क्लिक करें , रीसेट को पहले कमिट या कमिट या स्टैश या जो कुछ भी आप इसके साथ करना चाहते हैं उसे चुनें।


0

मेरे लिए यह काम किया:

git reset --hard

और फिर

git pull origin <*current branch>

उसके बाद

git checkout <*branch>


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