सभी फाइलों के लिए --ours / - का उपयोग करके संघर्ष को हल करें


111

क्या चेकआउट का उपयोग करके सभी फ़ाइलों के लिए संघर्ष को हल करने का एक तरीका है --oursऔर --theirs? मुझे पता है कि आप इसे अलग-अलग फ़ाइलों के लिए कर सकते हैं, लेकिन इसे सभी के लिए करने का कोई तरीका नहीं मिल सकता है।


7
git checkout --ours -- .काम करता है ? .वर्तमान निर्देशिका का मतलब है, जब काम करने वाली निर्देशिका रूट से लागू किया जाता है, तो इसका मूल रूप से संपूर्ण कामकाजी निर्देशिका का मतलब है। यकीन नहीं है कि अगर यह --oursध्वज के साथ काम करेगा , और मुझे यकीन नहीं है कि यह हटाए गए या पुनर्नामित फ़ाइल विरोध को कैसे संभालेंगे।

@Cupcake मैंने इसे सफलतापूर्वक उपयोग किया है। शायद इसका जवाब होना चाहिए?
पेड्रो जिमनो

जवाबों:


90

बस काम कर रहे निर्देशिका के माध्यम से grep और xargs कमांड के माध्यम से आउटपुट भेजें:

grep -lr '<<<<<<<' . | xargs git checkout --ours

या

grep -lr '<<<<<<<' . | xargs git checkout --theirs

यह कैसे काम करता है: grepवर्तमान निर्देशिका ( .) और उपनिर्देशिकाओं में हर फाइल के माध्यम से खोज करेगा ( -rझंडे) परस्पर विरोधी मार्कर (स्ट्रिंग '<<<<<<<<) की तलाश में

-lया --files-with-matchesझंडा उत्पादन के लिए केवल फ़ाइल नाम जहां स्ट्रिंग मिला था ग्रेप का कारण बनता है। पहले मैच के बाद स्कैनिंग बंद हो जाती है, इसलिए प्रत्येक मिलान की गई फ़ाइल केवल एक बार आउटपुट होती है।

मिलान किए गए फ़ाइल नाम फिर xargs पर पाइप किए जाते हैं , एक उपयोगिता जो पाइप इनपुट इनपुट को अलग-अलग तर्कों में या उसके लिए तोड़ती हैgit checkout --ours--theirs

अधिक इस लिंक पर

चूँकि कमांड लाइन पर इसे हर बार टाइप करना बहुत असुविधाजनक होगा, अगर आप इसे बहुत अधिक उपयोग करके खुद को पाते हैं, तो यह आपकी पसंद के शेल के लिए एक उपनाम बनाने के लिए एक बुरा विचार नहीं हो सकता है : बैश हमेशा की तरह है ।

इस विधि को कम से कम Git संस्करणों 2.4.x के माध्यम से काम करना चाहिए


14
ग्रीपिंग के बजाय, मुझे लगता है कि इसका उपयोग करना भी संभव है git diff --name-only --diff-filter=U
थाई

10
इसके अलावा git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]। अगर आपके पास कोई बड़ा प्रोजेक्ट है तो उसे टटोलने की तुलना में जल्दी।
joshbodily 17

1
@joshbodily अच्छा लगा। मेरे पास इतनी बड़ी परियोजनाएं नहीं हैं कि मैं एक अंतर देख पाऊं, लेकिन मैं देख सकता हूं कि यह बहुत तेजी से कैसे होगा खासकर अगर निर्देशिका में कुल संख्या की तुलना में कुछ फाइलें बदल गई हैं ---- जो सामान्य के लिए होना चाहिए करता है।
दिमित्री

1
ध्यान दें कि यह नाम बदलने / नाम बदलने के लिए काम नहीं करता है, उदाहरण के लिए,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
बोरक बर्नार्ड

1
फिर भी एक और विकल्प git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]:।
१५:४

52

आप कर सकते हैं -Xoursया -Xtheirsसाथ git mergeही। इसलिए:

  1. वर्तमान मर्ज को रोकें (उदाहरण के लिए git reset --hard HEAD)
  2. आपके द्वारा पसंद की जाने वाली रणनीति का उपयोग करके मर्ज करें ( git merge -Xoursया git merge -Xtheirs)

अस्वीकरण: बेशक आप -Xoursया तो एक ही विकल्प चुन सकते हैं, या -Xtheirs, अलग-अलग रणनीति का उपयोग करें जो आपको निश्चित रूप से फ़ाइल द्वारा जाना चाहिए।

मुझे नहीं पता कि इसके लिए कोई रास्ता है checkout, लेकिन मैं ईमानदारी से नहीं सोचता कि यह बहुत उपयोगी है: चेकआउट कमांड के साथ रणनीति का चयन करना उपयोगी है यदि आप विभिन्न फ़ाइलों के लिए अलग-अलग समाधान चाहते हैं, अन्यथा बस मर्ज रणनीति दृष्टिकोण के लिए जाएं।


धन्यवाद, नहीं पता था कि उनके पास मर्ज के लिए '--ours' और '-theirs' हैं। ऐसा लगता है कि विलय के लिए वे वास्तव में '-s' रणनीति का हिस्सा नहीं हैं, लेकिन '-X' पुनरावर्ती विकल्पों का हिस्सा हैं। हमारा-'का' संस्करण वास्तव में विलय के बिना सभी फाइलों को बदल देता है और उनका अस्तित्व नहीं है।
exe163

V1.9.4 को git करने के लिए कोई --theirsor --ours-Option नहीं है । एक दृष्टिकोण होगा git merge -s recursive -Xtheirs BRANCH
fbmd

--theirsऔर --oursन तो गिट के साथ उपलब्ध हैं 2.2.0। या तो मेरा उत्तर सटीक नहीं था या वे पुराने गिट संस्करण में उपलब्ध थे (यह उत्तर आईटी युग में बहुत पुराना है)। सही दृष्टिकोण के साथ है -X। मैं तदनुसार अपडेट करता हूं
थैंक्स फॉर ऑल.फिश

संस्करण के रूप में 2.4.0 --ours और
दिमित्री

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

37

git checkout --[ours/theirs] .जब तक आप सभी संघर्षों की जड़ में हैं, तब तक आप क्या चाहते हैं। हमारा / उनका केवल अनमैरिड फ़ाइलों को प्रभावित करता है, इसलिए आपको विशेष रूप से विरोध / खोज / आदि का विरोध नहीं करना चाहिए।


5
मेरे लिए यह उपनिर्देशिकाओं में पुनरावृत्ति नहीं लगता है।
डेनियल बेटमैन

5
मुझे मिलता है error: path 'foo/bar/blah' does not have our version
रोबिन ग्रीन

मैं git संस्करण 2.16.2.windows.1 का उपयोग कर रहा हूं और यह मेरे लिए पूरी तरह से काम करता है। धन्यवाद!
पंकवुड

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

काम करने लगता है। ध्यान दें कि आपको इसे प्राप्त करने के लिए git रेपो की रूट डायरेक्टरी में cd'ed होना चाहिए।


3
मुझे लगता है कि यह शीर्ष-मतदान वाले की तुलना में बेहतर उत्तर है क्योंकि (1) यह सभी फाइलों पर लागू होता है, न कि केवल कार्यशील निर्देशिका पर; और (2) यह संघर्ष मार्करों के लिए मनोरंजक के आसपास कोई भंगुरता नहीं होगी। यहां 'git diff' कमांड सभी अनमैरिड रास्तों को सूचीबद्ध करता है, जो कि वास्तव में हम चेकआउट करना चाहते हैं।
21

अच्छा! मैं हमेशा संघर्ष मार्करों grep की विश्वसनीयता के बारे में चिंतित था
00-बीबीबी

7

मामले में किसी और को बस एक शाखा से सब कुछ अधिलेखित करने के लिए देख रहे हैं (गुरु कहते हैं) दूसरे की सामग्री के साथ, वहाँ एक आसान तरीका है:

git merge origin/master --strategy=ours

आभार https://stackoverflow.com/a/1295232/560114

या आसपास के अन्य तरीकों के लिए, देखें कि क्या "git मर्ज -s हमारा" का "उनका" संस्करण है?


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

मैंने इस फ़ंक्शन को .zshrc फ़ाइल में जोड़ा है ।

उन्हें इस तरह से उपयोग करें: gitcheckoutall theirsयाgitcheckoutall ours

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