बिना कमिट के संघर्ष को कैसे हल करें?


494

जैसा कि इस प्रश्न में कहा गया है , मैं यह भी जानना चाहता हूं कि git stash popसभी संशोधनों को एक कमेटी में शामिल किए बिना एक संघर्ष को कैसे हल किया जाए (ठीक उसी तरह जैसे "गिट स्टैश पॉप" बिना किसी संघर्ष के होता है)।

मेरा वर्तमान तरीका बहुत ही बेकार है क्योंकि मैं इसे इस तरह से करता हूँ:

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[अद्यतन] इसे पुन: पेश करने का एक तरीका:

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27: उदाहरण के लिए 'थर्ड' नामक एक नई फ़ाइल को जोड़ा गया है जो यह दिखाने के लिए है कि हल से काम जैसे घाव केवल खाली हेड्स के लिए काम करते हैं लेकिन प्रारंभिक समस्या को ठीक नहीं करते हैं कि हेड के समान सामग्री नहीं है एक के लिए git stash popएक संघर्ष के बिना।


तो आप git addअपनी सुलझी हुई संघर्ष फ़ाइलों को प्रभावी ढंग से इंडेक्स में रखते हुए, और आप उन्हें हमारे इंडेक्स में नहीं रखना चाहेंगे?
रोमेन

हाँ य़ह सही हैं। मैं केवल वह व्यवहार चाहता हूं जिसमें git stash popकोई संघर्ष न हो (लेकिन अधिसूचना के साथ जो फ़ाइलों को विलय करने की आवश्यकता है)।
स्वेन

2
इसके लिए उत्तर की तरह लगता है: stackoverflow.com/questions/3945826/git-stash-questions । 4 वें टिप्पणी पर चुने गए उत्तर में, एडम बताता है कि git ऐसा क्यों करता है।
पैट्रिक

@Patrick इस जानकारी के लिए धन्यवाद - तो ऐसा लगता है कि इसका कोई समाधान उपलब्ध नहीं होगा क्योंकि इसका "डिज़ाइन द्वारा"
स्वेन

जवाबों:


507

अन्य उत्तरों का पालन न करें

खैर, आप उनका अनुसरण कर सकते हैं :)। लेकिन मुझे नहीं लगता कि एक कमिट करना और फिर उस कमेटी को हटाने के लिए ब्रांच को रीसेट करना और अन्य उत्तरों में सुझाए गए समान वर्कअराउंड इस मुद्दे को हल करने का सबसे अच्छा तरीका है।

साफ समाधान

निम्नलिखित समाधान मुझे बहुत साफ लगता है और यह खुद गिट ने भी सुझाया है - git statusएक संघर्ष के भंडार में निष्पादित करने का प्रयास करें :

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

तो चलिए Git का सुझाव देते हैं (बिना किसी बेकार के काम करता है):

  1. मैन्युअल रूप से (या कुछ मर्ज टूल का उपयोग करके , नीचे देखें) संघर्ष को हल करें।
  2. git resetहल के रूप में संघर्ष (ओं) को चिह्नित करें और परिवर्तनों को अस्थिर करें। आप इसे बिना किसी पैरामीटर के निष्पादित कर सकते हैं और Git इंडेक्स से सब कुछ हटा देगा। आपको git addपहले निष्पादित नहीं करना है ।
  3. अंत में, के साथ git stash dropसंघर्ष को हटा दें , क्योंकि गिट संघर्ष पर ऐसा नहीं करता है।

कमांड-लाइन में अनुवादित:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

डिफ़ॉल्ट व्यवहार की व्याख्या

हल के रूप में संघर्षों को चिह्नित करने के दो तरीके हैं: git addऔर git reset। जबकि git resetसंघर्षों को हल के रूप में चिह्नित करता है और फाइलों को सूचकांक से हटाता है, git addसाथ ही हल किए गए संघर्षों को भी चिह्नित करता है, लेकिन फाइलों को सूचकांक में रखता है।

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

उपकरण मर्ज करें

मैं अत्यधिक के किसी भी उपयोग करने की अनुशंसा 3-जिस तरह से मर्ज उपकरण को हल करने संघर्ष, उदाहरण के लिए KDiff3 , मिलकर एक हो जाना , आदि, के बजाय इसे मैन्युअल रूप से कर रही है। यह आमतौर पर सभी या अधिकांश संघर्षों को स्वतः हल कर देता है। यह बहुत बड़ा समय है!


32
@ कमलपाल की जरूरत तब पड़ती है जब git stash popसंघर्षों में असफलता मिलती है ।
एमिल बर्जरॉन

21
@kamalpal हाँ, Git ने आपको यह भी सूचित किया है कि संघर्ष के एक मामले में टकराव नहीं छोड़ा गया है। और सवाल ऐसे मामले के बारे में था, इसलिए आपको वास्तव में निष्पादित करने की आवश्यकता हैgit stash drop जब तक आप उस रोक को रखना नहीं चाहते।
डेविड फेरेंस्की रोगोजान

@ DavidFerenczyRogožan Git ने मुझे बिल्कुल भी सूचित नहीं किया कि यह स्टैश एंट्री नहीं गिराएगी। संस्करण 2.17.1 यहाँ।
रॉबर्ट सीमर

298

मान लीजिए कि आपके पास यह परिदृश्य है जहां आप मूल से खींचने के लिए अपने परिवर्तनों को रोकते हैं। संभवतः इसलिए कि आपके स्थानीय परिवर्तन debug: trueकुछ सेटिंग्स फ़ाइल में हैं। अब आप खींचते हैं और किसी ने एक नई सेटिंग पेश की है, जिससे एक संघर्ष पैदा होता है।

git status कहते हैं:

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

ठीक है। मैंने तय किया कि Git ने जो सुझाव दिया था, मैंने उसके साथ संघर्ष का संकल्प लिया और प्रतिबद्ध:

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

अब मेरी वर्किंग कॉपी मेरे मनचाहे राज्य में है, लेकिन मैंने एक ऐसी प्रतिबद्धता बनाई है जो मैं नहीं चाहता। मैं अपनी कामकाजी प्रति को संशोधित किए बिना उस अपराध से कैसे छुटकारा पाऊं? रुको, उसके लिए एक लोकप्रिय आदेश है!

git reset HEAD^

मेरी कार्य प्रतिलिपि नहीं बदली गई है, लेकिन WIP प्रतिबद्ध है। यही तो मैं चाहता था! (ध्यान दें कि मैं --softयहाँ उपयोग नहीं कर रहा हूँ , क्योंकि अगर आपके स्‍टैश में ऑटो-मर्ज की गई फ़ाइलें हैं, तो वे स्‍वचालित हैं और इस प्रकार आप इन फ़ाइलों को फिर से स्‍टेज होने के साथ समाप्‍त कर देंगे reset।)

लेकिन एक और बात बाकी है: आदमी पेज git stash popहमें याद दिलाता है कि "राज्य को लागू करना संघर्षों के साथ विफल हो सकता है, इस मामले में, इसे स्टैश सूची से हटाया नहीं जाता है। आपको संघर्षों को हाथ से हल करने और git stash dropबाद में मैन्युअल रूप से कॉल करने की आवश्यकता है ।" तो ठीक यही अब हम करते हैं:

git stash drop

और हो गया।


34
जानबूझकर रीसेट किए जाने के लिए बहुत सी कुरूपताएं हैं, जिनमें कुछ भी काम करने वाले पेड़ को प्रभावित करना चाहिए।

6
क्यों न सिर्फ संघर्षों को सुलझाया जाए और फिर git add <resolved conflict files>उसका पालन किया जाए git reset HEAD?
बोल्टजमनब्रेन

सुझाव के लिए धन्यवाद, लेकिन यह प्रारंभिक समस्या को ठीक नहीं करता है कि यह git stash popबिना संघर्ष के समान व्यवहार नहीं है । बस विरोध करने से पहले HEAD में एक और फ़ाइल जोड़ें और git stash popआपकी तुलना git commit -a -m WIPमें कमिट में नई फ़ाइल भी जोड़ेगा। लेकिन एक संघर्ष के बिना, बस नई फ़ाइल HEAD में रहेगी, लेकिन git stash popफाइलें नहीं ।
स्वेन

7
मुझे नहीं लगता कि पहले कमिट करना ज़रूरी है। बस Dawid Ferenczy उत्तर से रीसेट वही करेगा
vladkras

3
विंडोज़ उपयोगकर्ताओं के लिए, ^इसका उपयोग एक विशेष लाइन निरंतरता के रूप में किया जाता है और आपको अधिक पर बैठे छोड़ देगा? कमांड निष्पादित करने के बजाय शीघ्र। इसके बजाय का उपयोग करें: git reset --soft HEAD~1। देखें कि कैसे-कैसे-मैं-हटा-अप्रकाशित- git-commits?
मृफेलिस

87

संघर्ष को हल करने के लिए आपके द्वारा किए गए परिवर्तनों को जोड़ने के बजाय, आप git reset HEAD fileअपने परिवर्तनों का मंचन किए बिना संघर्ष को हल करने के लिए उपयोग कर सकते हैं ।

हालाँकि, आपको इस आदेश को दो बार चलाना पड़ सकता है। एक बार संघर्ष के रूप में हल करने के लिए और एक बार संघर्ष संकल्प दिनचर्या द्वारा मंचित परिवर्तनों को अस्थिर करने के लिए।

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


2
रीसेट मोड वह है जिसे मैं खोजता हूं - अन्य वर्कअराउंड मेरे द्वारा वर्णित एक जैसे हैं और 5 से अधिक फ़ाइलों के लिए व्यावहारिक नहीं हैं।
स्वेन

25
और "गिट स्टैश पॉप" को खत्म करने के लिए "गिट स्टैश ड्रॉप" का उपयोग करें।
डेविड लियू

2
यद्यपि यह प्रश्न स्पष्ट रूप से नहीं पूछता है, लेकिन "गिट स्टैश ड्रॉप" को शामिल करने के लिए उत्तर को अपडेट करने के लिए उपयोगी हो सकता है क्योंकि संघर्ष के मामले में स्‍टैश अपने आप नहीं गिराया जाता है।
अभिषेक पाठक

29
git checkout stash -- .

मेरे लिए काम किया।

नोट : यह खतरनाक हो सकता है क्योंकि यह स्टैश से बदलावों को अपनी कार्यशील प्रतिलिपि में मर्ज करने का प्रयास नहीं करता है, लेकिन इसके बजाय स्टैक्ड फ़ाइलों के साथ इसे ओवरराइट करता है। तो आप अपने अनपेक्षित परिवर्तन खो सकते हैं।


इससे मदद मिली जब "गिट पुल - डिपोस्टैश" अवांछित मर्ज कमिट्स और गिट चेकआउट स्टैश - का परिचय देता है। बिना शर्त संघर्ष को ओवरराइट करता है
एलेक इस्तोमिन

11
git add .
git reset

git add . सभी चरणों को बताएंगे कि आप किस संघर्ष को हल कर चुके हैं

git reset एक मंच बनाने के बिना सभी मंचन फ़ाइलों को अस्थिर करेगा


यह वास्तव में एक बुरा जवाब नहीं है, यह git add -uतब की तरह बहुत ज्यादा हैgit reset
ebob

4

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

git stash apply --index

यहाँ पूर्ण विवरण है:

http://git-scm.com/book/en/Git-Tools-Stashing


इस संकेत के लिए धन्यवाद, लेकिन यह तब मदद नहीं करेगा जब मैंने पहले ही किया था git stash pop- या क्या इसे वापस करने का एक तरीका है और git stash apply --indexजब मुझे पता चला कि git stash popएक संघर्ष में चलेगा?
स्वेन

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

3
यदि आप इस पोस्ट के नीचे देख रहे हैं तो यहां यह कहा गया है कि यदि आप दौड़ते हैं git stash popऔर यह टकराव के साथ समाप्त होता है, तो स्टैश हटाया नहीं जाता है ... इसलिए आप git reset --hardपॉप को पूर्ववत करने के लिए चला सकते हैं और फिर मेरे द्वारा सुझाए गए समाधान का प्रयास कर सकते हैं।
मार्को पोंटी

बस यह कोशिश की और आप संघर्ष राज्य में एक फ़ाइल है के बाद यह काम नहीं करता है। भले ही आप मैन्युअल रूप से संघर्ष को ठीक करें।
Sam3k

2

git stash branchकाम करेगा, जो आपके लिए एक नई शाखा बनाता है, आपके द्वारा किए गए काम को पूरा करने के समय आपके द्वारा किए गए कमिट को चेक करता है, वहां आपके काम को फिर से लागू करता है, और यदि यह सफलतापूर्वक लागू होता है, तो स्टैश को छोड़ देता है। जाँच इस


2

सबसे तेज़ तरीका जो मैंने पाया है वह संघर्ष को हल करना है, फिर करो git add -u, और फिर करो git reset HEAD, जिसमें एक प्रतिबद्धता भी शामिल नहीं है।


1

गिट स्टैश सवालों के अनुसार , संघर्ष को ठीक करने के बाद, git add <file>कार्रवाई का सही तरीका है।

यह इस टिप्पणी को पढ़ने के बाद था कि मैं समझ गया था कि परिवर्तन स्वचालित रूप से सूचकांक (डिजाइन द्वारा) में जोड़ दिए गए हैं। इसीलिए git add <file>संघर्ष समाधान प्रक्रिया को पूरा करता है।


-1

इसका सबसे अच्छा तरीका यह नहीं है, लेकिन यह काम करता है:

$ git stash apply
$ >> resolve your conflict <<
$ >> do what you want to do with your code <<
$ git checkout HEAD -- file/path/to/your/file

यह उत्तर मुझे स्पष्ट गलत लगता है, क्योंकि यह सभी परिवर्तनों को छोड़ देगा file/path/to/your/file, जो कि ओपी ने नहीं पूछा, AFAIU
oromoiluig
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.