मैं Git में मर्ज विरोधों को कैसे हल करूं?
git
स्थापना के साथ बॉक्स से बाहर भी काम नहीं करता है । आज, 2017 के मेरे लिए SE स्टार्ट पेज को हिट करने में सफल रहा, जिसमें 1.3m विचार और दोनों तरह से हजारों वोट थे। चित्त आकर्षण करनेवाला।
मैं Git में मर्ज विरोधों को कैसे हल करूं?
git
स्थापना के साथ बॉक्स से बाहर भी काम नहीं करता है । आज, 2017 के मेरे लिए SE स्टार्ट पेज को हिट करने में सफल रहा, जिसमें 1.3m विचार और दोनों तरह से हजारों वोट थे। चित्त आकर्षण करनेवाला।
जवाबों:
प्रयत्न: git mergetool
यह एक जीयूआई खोलता है जो आपको प्रत्येक संघर्ष के माध्यम से जोड़ता है, और आपको यह चुनना है कि विलय कैसे किया जाए। कभी-कभी इसके बाद हाथ से संपादन की आवश्यकता होती है, लेकिन आमतौर पर यह अपने आप ही काफी होता है। यह निश्चित रूप से हाथ से पूरी बात करने से बहुत बेहतर है।
@JoshGlover टिप्पणी के अनुसार:
आदेश
जब तक आप एक स्थापित नहीं करते हैं, तब तक जरूरी नहीं है कि एक जीयूआई खोलें।
git mergetool
मेरे लिए दौड़ने काvimdiff
उपयोग किया गया। आप उसका उपयोग करना चाहते निम्नलिखित उपकरणों में से एक स्थापित कर सकते हैं:meld
,opendiff
,kdiff3
,tkdiff
,xxdiff
,tortoisemerge
,gvimdiff
,diffuse
,ecmerge
,p4merge
,araxis
,vimdiff
,emerge
।
नीचे vimdiff
मर्ज संघर्ष के लिए उपयोग करने के लिए नमूना प्रक्रिया है । इस लिंक के आधार पर
चरण 1 : अपने टर्मिनल में निम्न आदेश चलाएँ
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
यह डिफ़ॉल्ट मर्ज टूल के रूप में vimdiff सेट करेगा।
चरण 2 : टर्मिनल में निम्नलिखित कमांड चलाएँ
git mergetool
चरण 3 : आपको निम्नलिखित प्रारूप में एक विमीडिफ डिस्प्ले दिखाई देगा
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
ये 4 विचार हैं
LOCAL - यह करंट ब्रांच से फाइल है
आधार - सामान्य पूर्वज, फ़ाइल दोनों परिवर्तनों से पहले कैसे दिखती थी
REMOTE - वह फ़ाइल जिसे आप अपनी शाखा में विलय कर रहे हैं
परिणाम - विलय परिणाम, यह वही है जो रेपो में सहेजा जाता है
आप इन दृश्यों का उपयोग करके ctrl+ के बीच नेविगेट कर सकते हैं w। आप सीधे ctrl+ के wबाद MERGED दृश्य तक पहुँच सकते हैं j।
यहाँ और यहाँ vimdiff नेविगेशन के बारे में अधिक जानकारी
चरण 4 । आप निम्न तरीके से MERGED दृश्य संपादित कर सकते हैं
यदि आप REMOTE से परिवर्तन प्राप्त करना चाहते हैं
:diffg RE
यदि आप BASE से परिवर्तन प्राप्त करना चाहते हैं
:diffg BA
यदि आप LOCAL से परिवर्तन प्राप्त करना चाहते हैं
:diffg LO
चरण 5 । सहेजें, बाहर निकलें, प्रतिबद्ध और साफ करें
:wqa
सहेजें और vi से बाहर निकलें
git commit -m "message"
git clean
अलग उपकरण द्वारा बनाई गई अतिरिक्त फ़ाइलें (जैसे * .orig) निकालें।
git mergetool -y
यदि आप एक बार में बहुत सारी फ़ाइलों को मर्ज कर रहे हैं, तो आप कुछ कीस्ट्रोक्स को बचाने के लिए उपयोग कर सकते हैं ।
git mergetool
मेरे लिए दौड़ने का vimdiff
उपयोग किया गया। आप उसका उपयोग करना चाहते निम्नलिखित उपकरणों में से एक स्थापित कर सकते हैं: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis vimdiff emerge
।
git mergetool -t bc3
) का उपयोग कर सकते हैं ।
यहां ऊपर से एक संभावित उपयोग-मामला है:
आप कुछ परिवर्तन करने जा रहे हैं, लेकिन उफ़, आप अद्यतित नहीं हैं:
git fetch origin
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.
इसलिए आप अप-टू-डेट हो जाएं और फिर से प्रयास करें, लेकिन एक संघर्ष है:
git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.
इसलिए आप बदलावों पर एक नज़र डालते हैं:
git mergetool
ओह माय, ओह माय, अपस्ट्रीम ने कुछ चीजों को बदल दिया, लेकिन सिर्फ मेरे बदलाव का उपयोग करने के लिए ... नहीं ... उनके परिवर्तन ...
git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"
और फिर हम अंतिम समय का प्रयास करते हैं
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Already up-to-date.
टा-दा!
git merge --help
this question
मुझे लगता है कि मर्ज उपकरण शायद ही कभी मुझे संघर्ष या संकल्प को समझने में मदद करते हैं। मैं आमतौर पर एक पाठ संपादक में संघर्ष मार्करों को देखने और पूरक के रूप में गिट लॉग का उपयोग कर रहा हूं।
यहां कुछ सलाह हैं:
सबसे अच्छी बात जो मुझे मिली है वह है "diff3" मर्ज संघर्ष शैली का उपयोग करना:
git config merge.conflictstyle diff3
यह इस तरह संघर्ष मार्करों का उत्पादन करता है:
<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a
feature/topic branch.
>>>>>>>
मध्य भाग वह है जो आम पूर्वज जैसा दिखता था। यह उपयोगी है क्योंकि आप प्रत्येक शाखा पर क्या बदला गया था, इसकी बेहतर समझ पाने के लिए आप इसकी तुलना ऊपर और नीचे के संस्करणों से कर सकते हैं, जो आपको प्रत्येक बदलाव के उद्देश्य के बारे में बेहतर जानकारी देता है।
यदि संघर्ष केवल कुछ लाइनें हैं, तो यह आम तौर पर संघर्ष को स्पष्ट करता है। (यह जानना कि संघर्ष को कैसे ठीक किया जाए, यह बहुत अलग है; आपको इस बात से अवगत रहने की आवश्यकता है कि अन्य लोग क्या काम कर रहे हैं। यदि आप भ्रमित हैं, तो संभवतः उस व्यक्ति को अपने कमरे में कॉल करना सबसे अच्छा है ताकि वे देख सकें कि आप क्या देख रहे हैं। पर।)
यदि संघर्ष लंबा है, तो मैं तीन खंडों में से प्रत्येक को "अलग", "सामान्य" और "उनके" जैसे तीन अलग-अलग फ़ाइलों में काटूंगा और चिपकाऊंगा।
फिर मैं निम्नलिखित आदेशों को दो अलग-अलग हिस्सों को देखने के लिए चला सकता हूं जो संघर्ष का कारण बने:
diff common mine
diff common theirs
यह मर्ज टूल का उपयोग करने के समान नहीं है, क्योंकि मर्ज टूल में सभी गैर-परस्पर विरोधी भिन्न हॉक भी शामिल होंगे। मुझे लगता है कि विचलित होना।
किसी ने पहले से ही इसका उल्लेख किया है, लेकिन प्रत्येक भिन्न हंक के पीछे के इरादे को समझना आमतौर पर यह समझने के लिए बहुत उपयोगी है कि संघर्ष कहाँ से आया और इसे कैसे संभालना है।
git log --merge -p <name of file>
यह उन सभी कमिटों को दिखाता है जो आम पूर्वज और आपके द्वारा विलय किए जा रहे दो शीर्षों के बीच उस फ़ाइल को छूते थे। (इसलिए इसमें शामिल नहीं है कि विलय से पहले ही दोनों शाखाओं में मौजूद हैं।) इससे आपको ऐसे मतभेदों को अनदेखा करने में मदद मिलती है जो स्पष्ट रूप से आपके वर्तमान संघर्ष का कारक नहीं हैं।
स्वचालित टूल के साथ अपने परिवर्तनों को सत्यापित करें।
यदि आपके पास स्वचालित परीक्षण हैं, तो उन्हें चलाएं। यदि आपके पास एक लिंट है , तो उसे चलाएं। यदि यह एक निर्माण करने योग्य परियोजना है, तो इसे बनाने से पहले इसे बनाएं, आदि सभी मामलों में, आपको यह सुनिश्चित करने के लिए थोड़ा परीक्षण करने की आवश्यकता है कि आपके परिवर्तन कुछ भी नहीं तोड़ते हैं। (हेक, संघर्षों के बिना भी एक मर्ज काम कोड को तोड़ सकता है।)
आगे की योजना; सहकर्मियों के साथ संवाद।
आगे की योजना बनाना और इस बारे में जागरूक होना कि अन्य लोग किस पर काम कर रहे हैं, मर्ज टकराव को रोकने और / या पहले उन्हें हल करने में मदद कर सकते हैं - जबकि विवरण अभी भी दिमाग में ताजा हैं।
उदाहरण के लिए, यदि आप जानते हैं कि आप और एक अन्य व्यक्ति दोनों अलग-अलग रीफैक्टरिंग पर काम कर रहे हैं, जो दोनों फाइलों के एक ही सेट को प्रभावित करेगा, तो आपको समय से पहले एक-दूसरे से बात करनी चाहिए और एक बेहतर समझ प्राप्त करनी चाहिए कि आप में से किस प्रकार के बदलाव हैं। बना रही है। यदि आप अपने नियोजित परिवर्तनों को क्रमबद्ध करने की बजाय समानांतर रूप से करते हैं, तो आप काफी समय और प्रयास बचा सकते हैं।
कोड की एक बड़ी संख्या में कटौती करने वाले प्रमुख रिफैक्टोरिंग्स के लिए, आपको दृढ़ता से काम करने पर विचार करना चाहिए: हर कोई कोड के उस क्षेत्र पर काम करना बंद कर देता है, जबकि एक व्यक्ति पूर्ण रीफैक्टरिंग करता है।
यदि आप क्रमिक रूप से काम नहीं कर सकते (समय के दबाव के कारण, हो सकता है), तो कम से कम मर्ज संघर्षों के बारे में संवाद करने से आपको समस्याओं को जल्द हल करने में मदद मिलती है जबकि विवरण अभी भी ताजा हैं। उदाहरण के लिए, यदि कोई सहकर्मी एक सप्ताह की अवधि के दौरान आवागमन की एक विघटनकारी श्रृंखला बना रहा है, तो आप उस सप्ताह के दौरान प्रति दिन एक या दो बार उस सहकर्मी शाखा में विलय / छूट देना चुन सकते हैं। इस तरह, यदि आप मर्ज / रीबेज टकराव पाते हैं, तो आप उन्हें और अधिक तेज़ी से हल कर सकते हैं यदि आप एक बड़ी गांठ में एक साथ सब कुछ मर्ज करने के लिए कुछ हफ्तों की प्रतीक्षा करते हैं।
यदि आप किसी मर्ज के अनिश्चित हैं, तो इसे लागू न करें।
विलय करना भारी लग सकता है, खासकर जब बहुत सारी परस्पर विरोधी फाइलें होती हैं और संघर्ष मार्कर सैकड़ों पंक्तियों को कवर करते हैं। अक्सर सॉफ्टवेयर परियोजनाओं का आकलन करते समय हम ओवरहेड आइटम के लिए पर्याप्त समय शामिल नहीं करते हैं जैसे कि एक मर्ज को संभालना, इसलिए यह महसूस होता है कि प्रत्येक संघर्ष को विराम देने में कई घंटे खर्च करने के लिए एक वास्तविक खींचें की तरह है।
लंबे समय में, आगे की योजना बनाना और दूसरों के साथ काम करने के बारे में जागरूक होना मर्ज संघर्षों की आशंका के लिए सबसे अच्छा उपकरण हैं और कम समय में उन्हें सही ढंग से हल करने के लिए खुद को तैयार करें।
p4merge
, जिसे पेरफोर्स के अन्य उपकरणों से अलग से स्थापित और उपयोग किया जा सकता है (जिसका मैंने उपयोग नहीं किया है, लेकिन शिकायतों के बारे में सुना है)।
git config merge.conflictstyle diff3
- धन्यवाद महोदय। यह आश्चर्यजनक है और मुझे एक अच्छे 3 तरीके से GUI मर्ज करने के लिए (और $ $) खोजने की कोशिश करने से मुक्त कर दिया है। IMO यह बेहतर है क्योंकि यह सामान्य पूर्वजों के साथ-साथ स्थानीय / रिमोट को दिखाता है , और अंतिम प्रतिबद्ध लॉग लाइनों को दिखाता है जो (AFAIK) कोई GUI नहीं करता है। यह निश्चित रूप से यह पहचानने में आपकी मदद करता है कि कोड किस शाखा से संबंधित है।
पहचानें कि कौन सी फाइलें संघर्ष में हैं (गिट आपको यह बताना चाहिए)।
प्रत्येक फ़ाइल खोलें और डिफरेंसेस की जांच करें; गिट उन्हें सीमांकित करता है। उम्मीद है कि यह स्पष्ट होगा कि प्रत्येक ब्लॉक को किस संस्करण को रखना है। आपको इसे उन साथी डेवलपर्स के साथ चर्चा करने की आवश्यकता हो सकती है जिन्होंने कोड को प्रतिबद्ध किया है।
एक बार जब आप एक फ़ाइल में संघर्ष को हल कर लेते हैं git add the_file
।
एक बार जब आप हल कर लेते हैं सभी संघर्षों को , तो आप git rebase --continue
जो कुछ भी करते हैं उसे पूरा करने के लिए Git या जो कुछ भी कहा जाता है।
git add
सूचकांक में @JustinGrant चरणों की फाइलें; यह भंडार में कुछ भी नहीं जोड़ता है। git commit
भंडार में चीजें जोड़ता है। यह उपयोग मर्ज के लिए समझ में आता है - मर्ज स्वचालित रूप से उन सभी परिवर्तनों को चरणबद्ध करता है जिन्हें स्वचालित रूप से मर्ज किया जा सकता है; यह आपकी ज़िम्मेदारी है कि आप बाकी बदलावों को मर्ज करें और जब आप कर लें तो उन्हें इंडेक्स में जोड़ें।
स्टैक ओवरफ्लो प्रश्न में उत्तरों की जांच करें , विशेष रूप से चार्ल्स बेली के उत्तर में मर्ज को समाप्त करना , जो दिखाता है कि फ़ाइल के विभिन्न संस्करणों को समस्याओं के साथ कैसे देखा जाए, उदाहरण के लिए,
# Common base version of the file.
git show :1:some_file.cpp
# 'Ours' version of the file.
git show :2:some_file.cpp
# 'Theirs' version of the file.
git show :3:some_file.cpp
एक ही समय में किसी फ़ाइल में परिवर्तन किए जाने पर मर्ज विरोध होता है। इसे हल करने का तरीका बताया गया है।
git
CLIजब आप विवादित स्थिति में होते हैं, तो यहां सरल कदम हैं:
git status
(नीचे)Unmerged paths
खंड के ) ।प्रत्येक फ़ाइल के लिए अलग-अलग संघर्षों को निम्नलिखित तरीकों से हल करें:
संघर्षों को हल करने के लिए GUI का उपयोग करें: git mergetool
(सबसे आसान तरीका)।
दूरस्थ / अन्य संस्करण स्वीकार करने के लिए, उपयोग करें: git checkout --theirs path/file
:। यह आपके द्वारा उस फ़ाइल के लिए किए गए किसी भी स्थानीय परिवर्तन को अस्वीकार कर देगा।
स्थानीय / हमारे संस्करण को स्वीकार करने के लिए, उपयोग करें: git checkout --ours path/file
हालाँकि, आपको सावधान रहना चाहिए, क्योंकि दूरस्थ परिवर्तन जो किसी कारण से टकराव का कारण बने थे।
विवादित फ़ाइलों को मैन्युअल रूप से संपादित करें और बीच में कोड ब्लॉक की तलाश करें <<<<<
/ >>>>>
फिर संस्करण को ऊपर या नीचे से चुनें =====
। देखें: कैसे टकराव प्रस्तुत किया जाता है ।
पथ और फ़ाइल नाम संघर्ष git add
/ द्वारा हल किया जा सकता है git rm
।
अंत में, उपयोग करने के लिए तैयार फाइलों की समीक्षा करें git status
:।
यदि आपके पास अभी भी कोई फ़ाइल है Unmerged paths
, और आपने संघर्ष को मैन्युअल रूप से हल किया है, तो Git को बताएं कि आपने इसे हल किया है git add path/file
:।
यदि सभी संघर्षों को सफलतापूर्वक हल किया गया था, तो इन परिवर्तनों को पूरा करें: git commit -a
और हमेशा की तरह रिमोट पर पुश करें।
यह भी देखें: GitHub में कमांड लाइन से एक मर्ज संघर्ष का समाधान
व्यावहारिक ट्यूटोरियल के लिए, देखें: परिदृश्य 5 - कैटाकोडा द्वारा फिक्सिंग मर्ज संघर्ष ।
मैंने सफलतापूर्वक डिफमार्गर का उपयोग किया है जो विंडोज़, मैकओएस और लिनक्स / यूनिक्स पर फाइलों की तुलना और विलय कर सकता है।
यह ग्राफिक रूप से 3 फ़ाइलों के बीच परिवर्तन दिखा सकता है और यह स्वचालित विलय (जब ऐसा करने के लिए सुरक्षित है) और परिणामस्वरूप फ़ाइल को संपादित करने पर पूर्ण नियंत्रण की अनुमति देता है।
छवि स्रोत: डिफमार्गर (लिनक्स स्क्रीनशॉट)
बस इसे डाउनलोड करें और रेपो में चलाएं:
git mergetool -t diffmerge .
MacOS पर आप के माध्यम से स्थापित कर सकते हैं:
brew install caskroom/cask/brew-cask
brew cask install diffmerge
और शायद (यदि प्रदान नहीं किया गया है) आपको अपने PATH (उदा /usr/bin
) में रखे गए अतिरिक्त सरल आवरण की आवश्यकता है :
#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"
फिर आप निम्नलिखित कीबोर्ड शॉर्टकट का उपयोग कर सकते हैं:
वैकल्पिक रूप से आप opendiff (Xcode Tools का हिस्सा) का उपयोग कर सकते हैं जो आपको तीसरी फ़ाइल या निर्देशिका बनाने के लिए दो फ़ाइलों या निर्देशिकाओं को एक साथ मर्ज करने देता है।
यदि आप बार-बार छोटे-छोटे काम कर रहे हैं, तो कमेंट कमेंट को देखकर शुरू करें git log --merge
। फिर git diff
आपको संघर्ष दिखाएगा।
कुछ लाइनों से अधिक शामिल होने वाले संघर्षों के लिए, यह देखना आसान है कि बाहरी GUI उपकरण में क्या हो रहा है। मुझे opendiff पसंद है - Git भी vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff का समर्थन करता है, बॉक्स से बाहर निकलता है और आप दूसरों को स्थापित कर सकते हैं: git config merge.tool "your.tool"
अपना चुना टूल सेट करेंगे और फिरgit mergetool
एक विफल मर्ज के बाद आपको संदर्भ में अंतर दिखाएगा।
हर बार जब आप किसी संघर्ष को हल करने के लिए फ़ाइल को संपादित करते हैं, git add filename
तो सूचकांक को अपडेट करेगा और आपका फ़र्क अब नहीं दिखाएगा। जब सभी संघर्षों को संभाला जाता है और उनकी फ़ाइलों को git add
-ed किया जाता है, तो git commit
आपका मर्ज पूरा हो जाएगा।
देखें कि कैसे टकराव पेश किए जाते हैं या Git में,git merge
समझने के लिए कि मर्ज संघर्ष मार्कर क्या हैं।
इसके अलावा, संघर्ष का समाधान कैसे करें अनुभाग बताता है कि संघर्षों को कैसे हल किया जाए:
संघर्ष देखने के बाद, आप दो काम कर सकते हैं:
विलय न करने का निर्णय करें। केवल क्लीन-अप्स की आपको आवश्यकता है कि सूचकांक फाइल
HEAD
को रिवर्स 2. के लिए प्रतिबद्ध करें और 2. और 3;git merge --abort
इसके लिए इस्तेमाल किया जा सकता है।संघर्षों को हल करें। Git काम के पेड़ में संघर्षों को चिह्नित करेगा। फ़ाइलों को आकृति में और
git add
उन्हें अनुक्रमणिका में संपादित करें ।git commit
सौदे को सील करने के लिए उपयोग करें ।आप कई उपकरणों के साथ संघर्ष के माध्यम से काम कर सकते हैं:
एक मेरिजेट का उपयोग करें।
git mergetool
एक ग्राफिकल मेरिजेट लॉन्च करना जो आपको मर्ज के माध्यम से काम करेगा।डिफरेंसेस को देखें।
git diff
दोनोंHEAD
औरMERGE_HEAD
संस्करणों से परिवर्तन को उजागर करते हुए, तीन-तरफा अंतर दिखाएगा ।प्रत्येक शाखा से भिन्न को देखें।
git log --merge -p <path>
शो पहलेHEAD
संस्करण और फिर संस्करण के लिए अलग होगाMERGE_HEAD
।मूल को देखो।
git show :1:filename
सामान्य पूर्वजgit show :2:filename
दिखाता है,HEAD
संस्करण दिखाता है , और संस्करणgit show :3:filename
दिखाता हैMERGE_HEAD
।
आप मर्ज संघर्ष मार्करों के बारे में भी पढ़ सकते हैं और प्रो गेट बुक सेक्शन बेसिक मर्ज संघर्ष में उन्हें कैसे हल करें ।
मैं या तो अपना या उनका संस्करण पूर्ण रूप से चाहता हूं, या व्यक्तिगत परिवर्तनों की समीक्षा करना चाहता हूं और उनमें से प्रत्येक के लिए निर्णय लेना चाहता हूं।
पूरी तरह से मेरे या उनके संस्करण को स्वीकार करते हैं :
मेरा संस्करण स्वीकार करें (स्थानीय, हमारा):
git checkout --ours -- <filename>
git add <filename> # Marks conflict as resolved
git commit -m "merged bla bla" # An "empty" commit
उनके संस्करण को स्वीकार करें (दूरस्थ, उनका):
git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"
यदि आप सभी संघर्ष फ़ाइलों को चलाना चाहते हैं:
git merge --strategy-option ours
या
git merge --strategy-option theirs
सभी परिवर्तनों की समीक्षा करें और उन्हें व्यक्तिगत रूप से स्वीकार करें
git mergetool
git add <filename>
git commit -m "merged bla bla"
डिफ़ॉल्ट कमांड लाइनmergetool
में काम करता है । कमांड लाइन मर्जटूल का उपयोग कैसे करें यह एक अलग प्रश्न होना चाहिए।
आप इसके लिए विजुअल टूल भी इंस्टॉल कर सकते हैं , जैसे meld
और रन
git mergetool -t meld
यह स्थानीय संस्करण (हमारा), "आधार" या "मर्ज" संस्करण (मर्ज का वर्तमान परिणाम) और दूरस्थ संस्करण (उनके) खोल देगा। समाप्त होने पर मर्ज किए गए संस्करण को सहेजें, git mergetool -t meld
तब तक फिर से चलाएं जब तक कि आपको "कोई फ़ाइलों को विलय की आवश्यकता न हो", फिर चरण 3 और 4 पर जाएं।
के लिए Emacs जो अर्द्ध मैन्युअल मर्ज संघर्ष को सुलझाने के लिए चाहते हैं उपयोगकर्ताओं:
git diff --name-status --diff-filter=U
उन सभी फ़ाइलों को दिखाता है जिनमें संघर्ष समाधान की आवश्यकता होती है।
उन फ़ाइलों में से प्रत्येक को एक-एक करके या एक बार में सभी खोलें:
emacs $(git diff --name-only --diff-filter=U)
Emacs में संपादन की आवश्यकता वाले बफर पर जाते समय, टाइप करें
ALT+x vc-resolve-conflicts
यह तीन बफ़र्स (मेरा, उनका और आउटपुट बफर) खोलेगा। 'N' (अगला क्षेत्र), 'p' (प्रीविज़न क्षेत्र) दबाकर नेविगेट करें। क्रमशः उत्पादन बफर में मेरा या उनका क्षेत्र कॉपी करने के लिए 'a' और 'b' दबाएँ। और / या आउटपुट बफर को सीधे संपादित करें।
जब समाप्त हो जाए: 'q' दबाएं। Emacs आपसे पूछता है कि क्या आप इस बफ़र को बचाना चाहते हैं: हाँ। बफर मार्क खत्म करने के बाद इसे टेरीनल से चलाकर हल किया जाता है:
git add FILENAME
जब सभी प्रकार के बफर के साथ समाप्त हो गया
git commit
मर्ज को समाप्त करने के लिए।
उपर्युक्त उत्तरों में पुल / भ्रूण / मर्ज की बात करते हुए, मैं एक दिलचस्प और उत्पादक चाल साझा करना चाहूंगा,
git pull --rebase
यह उपर्युक्त कमांड मेरे git जीवन में सबसे उपयोगी कमांड है जिसने बहुत समय बचाया।
अपने नए प्रतिबद्ध परिवर्तन को दूरस्थ सर्वर पर धकेलने से पहले, git pull --rebase
बल्कि git pull
और मैन्युअल प्रयास करें merge
और यह स्वचालित रूप से नवीनतम दूरस्थ सर्वर परिवर्तनों (एक भ्रूण + मर्ज के साथ) को सिंक करेगा और आपकी स्थानीय नवीनतम प्रतिबद्ध को गिट लॉग में शीर्ष पर रखेगा। मैनुअल पुल / मर्ज के बारे में चिंता करने की आवश्यकता नहीं है।
संघर्ष के मामले में, बस का उपयोग करें
git mergetool
git add conflict_file
git rebase --continue
यहाँ विवरण प्राप्त करें: http://gitolite.com/git-pull--rebase
बस, यदि आप अच्छी तरह से जानते हैं कि रिपॉजिटरी में से किसी एक में परिवर्तन महत्वपूर्ण नहीं है, और दूसरे के पक्ष में सभी परिवर्तनों को हल करना चाहते हैं, तो उपयोग करें:
git checkout . --ours
अपनी रिपॉजिटरी के पक्ष में परिवर्तनों को हल करने के लिए , या
git checkout . --theirs
दूसरे या मुख्य भंडार के पक्ष में परिवर्तन को हल करने के लिए ।
या फिर आपको एक-एक करके फ़ाइलों के माध्यम से कदम रखने के लिए GUI मर्ज टूल का उपयोग करना होगा, मान लें कि मर्ज टूल है p4merge
, या आपके द्वारा पहले से इंस्टॉल किए गए किसी भी नाम को लिखें
git mergetool -t p4merge
और एक फ़ाइल खत्म करने के बाद, आपको सहेजना और बंद करना होगा, इसलिए अगला एक खुल जाएगा।
Git में मर्ज संघर्ष को ठीक करने के लिए कृपया निम्नलिखित चरणों का पालन करें:
Git स्टेटस जांचें: git स्टेटस
पैचसेट प्राप्त करें: git fetch (अपने Git कमिट से सही पैच चेकआउट करें)
एक स्थानीय शाखा की जाँच करें (यहाँ मेरे उदाहरण में temp1): git checkout -b temp1
मास्टर से हाल की सामग्री खींचो: git खींच --rebase मूल मास्टर
मेरिजेट शुरू करें और संघर्षों की जांच करें और उन्हें ठीक करें ... और अपनी वर्तमान शाखा के साथ दूरस्थ शाखा में बदलावों की जांच करें: मेरिटोल
फिर से स्थिति की जाँच करें: गिट स्थिति
स्थानीय रूप से मेरिजेट द्वारा बनाई गई अवांछित फाइलों को हटा दें, आमतौर पर मेरिजेट * .orig एक्सटेंशन के साथ अतिरिक्त फाइल बनाता है। कृपया उस फ़ाइल को हटा दें क्योंकि यह केवल डुप्लिकेट है और स्थानीय रूप से परिवर्तनों को ठीक करें और अपनी फ़ाइलों का सही संस्करण जोड़ें। git #your_changed_correct_files जोड़ें
फिर से स्थिति की जाँच करें: गिट स्थिति
उसी कमिट आईडी में बदलाव करें (यह एक नया अलग पैच सेट टालता है ): git प्रतिबद्ध --amend
मास्टर शाखा को धक्का दें : गिट पुश (आपके गिट रिपॉजिटरी के लिए)
3 चरण हैं:
खोजें कि कौन सी फाइलें कमांड द्वारा टकराव का कारण बनती हैं
git status
उन फाइलों की जाँच करें, जिनमें आपको चिन्हित संघर्ष की तरह मिलेगा
<<<<<<<<head
blablabla
इसे अपने इच्छित तरीके से बदलें, फिर आज्ञाओं के साथ प्रतिबद्ध रहें
git add solved_conflicts_files
git commit -m 'merge msg'
आप कई तरीकों से मर्ज टकराव को ठीक कर सकते हैं जैसे अन्य विस्तृत हैं।
मुझे लगता है कि वास्तविक कुंजी यह जान रही है कि स्थानीय और दूरस्थ रिपॉजिटरी के साथ परिवर्तन कैसे होता है। इसकी कुंजी ट्रैकिंग शाखाओं को समझना है। मैंने पाया है कि मैं ट्रैकिंग शाखा को अपने स्थानीय, वास्तविक फाइलों की निर्देशिका और रिमोट के बीच 'लापता टुकड़ा' के रूप में समझता हूं।
मैं व्यक्तिगत रूप से इससे बचने में मदद करने के लिए 2 चीजों की आदत में शामिल हो गया हूं।
के बजाय:
git add .
git commit -m"some msg"
जिसमें दो कमियां हैं -
क) सभी नई / बदली गई फाइलें जुड़ जाती हैं और इसमें कुछ अवांछित परिवर्तन शामिल हो सकते हैं।
ख) आपको पहले फ़ाइल सूची की समीक्षा करने की आवश्यकता नहीं है।
इसलिए इसके बजाय मैं करता हूं:
git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.
इस तरह से आप अधिक विचार-विमर्श करते हैं कि कौन सी फाइलें जुड़ती हैं और आपको सूची की समीक्षा करने के लिए भी मिलता है और संदेश के लिए संपादक का उपयोग करते समय थोड़ा और सोचें। जब मैं -m
विकल्प के बजाय पूर्ण स्क्रीन संपादक का उपयोग करता हूं तो मुझे अपने प्रतिबद्ध संदेशों में सुधार होता है।
[अपडेट - जैसे-जैसे समय बीतता है मैंने और अधिक स्विच किया है:
git status # Make sure I know whats going on
git add .
git commit # Then use the editor
]
इसके अलावा (आपकी स्थिति के लिए अधिक प्रासंगिक), मैं बचने की कोशिश करता हूं:
git pull
या
git pull origin master.
क्योंकि पुल का एक मर्ज होता है और यदि आपके पास स्थानीय रूप से परिवर्तन हैं जो आप मर्ज नहीं करना चाहते हैं तो आप आसानी से मर्ज किए गए कोड के साथ समाप्त हो सकते हैं और / या कोड के लिए मर्ज विरोध हो सकता है जो विलय नहीं होना चाहिए था।
इसके बजाय मैं करने की कोशिश करता हूं
git checkout master
git fetch
git rebase --hard origin/master # or whatever branch I want.
आपको यह मददगार भी लग सकता है:
git checkout master
और आपके स्थानीय संशोधनों का क्या होता है git fetch
और git rebase --hard origin/master
git add .
, क्या यह हमारे स्थानीय संशोधनों को बचाएगा ताकि हम इसका पालन कर सकें git checkout master
? या वे दो अलग-अलग परिदृश्य हैं?
$ git rebase --hard origin/master b5a30cc159ba8dd error: unknown option
हार्ड 'यूज़: git rebase [-i] [विकल्प] [--exec <cmd>] [- टोरंटो <newbase>] [<upstream>] [<शाखा>] या: git rebase -i] [ विकल्प] [--exec <cmd>] [- Santiago <newbase>] --root [<शाखा>] या: git rebase --continue | --बोर्ट | --स्किप | --edit-कार्य करने की `
CoolAJ86 का जवाब बहुत ज्यादा सब कुछ देता है। यदि आपके पास दोनों शाखाओं में समान कोड में परिवर्तन हैं तो आपको एक मैनुअल मर्ज करना होगा। किसी भी पाठ संपादक में संघर्ष में फ़ाइल खोलें और आपको निम्नलिखित संरचना देखनी चाहिए।
(Code not in Conflict)
>>>>>>>>>>>
(first alternative for conflict starts here)
Multiple code lines here
===========
(second alternative for conflict starts here)
Multiple code lines here too
<<<<<<<<<<<
(Code not in conflict here)
समान संकेतों और कोण कोष्ठक को हटाते हुए एक विकल्प या दोनों के संयोजन को इस तरह से चुनें कि आप नया कोड चाहते हैं।
git commit -a -m "commit message"
git push origin master
git log --merge -p [[--] path]
हमेशा मेरे लिए काम करने के लिए नहीं लगता है और आमतौर पर हर शाखा, जो दो शाखाओं के बीच अलग थी, का उपयोग करते हुए प्रदर्शित होता है --
कमांड से पथ को अलग करने के लिए किया जाता है।
मैं इस मुद्दे के आसपास काम करने के लिए दो कमांड लाइन और एक रन में खोल रहा हूं
git log ..$MERGED_IN_BRANCH --pretty=full -p [path]
और दूसरे में
git log $MERGED_IN_BRANCH.. --pretty=full -p [path]
जगह $MERGED_IN_BRANCH
शाखा मैं में और विलय कर दिया साथ [path]
फ़ाइल है कि परस्पर विरोधी है। यह कमांड ..
दो कमिट के बीच, पैच फॉर्म में, सभी कमिट्स को लॉग करेगा । यदि आप एक तरफ को खाली छोड़ देते हैं जैसे कि ऊपर दिए गए कमांड में स्वचालित रूप से उपयोग किया जाएगा HEAD
(इस मामले में आप जिस शाखा में विलय कर रहे हैं)।
यह आपको यह देखने की अनुमति देगा कि दो शाखाओं में फ़ाइल के जाने के बाद क्या हुआ। यह आमतौर पर संघर्षों को हल करना बहुत आसान बनाता है।
patience
मुझे आश्चर्य है कि किसी और ने patience
मर्ज की पुनरावर्ती रणनीति के साथ संघर्ष का समाधान करने के बारे में नहीं कहा । patience
मेरे लिए अच्छे परिणाम प्रदान करते हुए, एक बड़े मर्ज संघर्ष के लिए। विचार यह है कि यह व्यक्तिगत रेखाओं के बजाय ब्लॉक से मेल खाने की कोशिश करेगा।
यदि आप उदाहरण के लिए अपने कार्यक्रम के इंडेंटेशन को बदलते हैं, तो डिफ़ॉल्ट गेट मर्ज की रणनीति कभी-कभी एकल ब्रेसिज़ से मेल खाती है {
जो विभिन्न कार्यों से संबंधित है। इससे बचा जाता है patience
:
git merge -s recursive -X patience other-branch
प्रलेखन से:
With this option, merge-recursive spends a little extra time to avoid
mismerges that sometimes occur due to unimportant matching lines
(e.g., braces from distinct functions). Use this when the branches to
be merged have diverged wildly.
यदि आपके पास एक मर्ज संघर्ष है और यह देखना चाहते हैं कि उनकी शाखा को संशोधित करते समय दूसरों के मन में क्या था, तो कभी-कभी अपनी शाखा की तुलना सीधे सामान्य पूर्वज (हमारी शाखा के बजाय) से करना आसान होता है। उसके लिए आप उपयोग कर सकते हैं merge-base
:
git diff $(git merge-base <our-branch> <their-branch>) <their-branch>
आमतौर पर, आप केवल किसी विशेष फ़ाइल के लिए परिवर्तन देखना चाहते हैं:
git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>
दिसंबर 12, 2016 तक, आप शाखाओं को मर्ज कर सकते हैं और github.com पर संघर्ष को हल कर सकते हैं
इस प्रकार, यदि आप कमांड-लाइन या किसी तीसरे पक्ष के टूल का उपयोग नहीं करना चाहते हैं जो पुराने उत्तरों से यहां दिए गए हैं , तो GitHub के मूल टूल के साथ जाएं।
यह ब्लॉग पोस्ट विस्तार से बताती है, लेकिन मूल बातें यह हैं कि UI के माध्यम से दो शाखाओं को 'मर्ज' करने पर, अब आपको एक 'सॉल्यूशन टकराव' विकल्प दिखाई देगा, जो आपको एक संपादक के पास ले जाएगा, जिससे आप इन मर्ज संघर्षों से निपटने की अनुमति देंगे।
यदि आप शाखा (परीक्षण) से मास्टर में विलय करना चाहते हैं, तो आप इन चरणों का पालन कर सकते हैं:
चरण 1 : शाखा में जाएं
git checkout test
चरण 2 :
git pull --rebase origin master
चरण 3 : यदि कुछ संघर्ष हैं, तो इसे संशोधित करने के लिए इन फ़ाइलों पर जाएं।
चरण 4 : इन परिवर्तनों को जोड़ें
git add #your_changes_files
चरण 5 :
git rebase --continue
चरण 6 : यदि अभी भी संघर्ष है, तो चरण 3 पर वापस जाएं। यदि कोई संघर्ष नहीं है, तो निम्नलिखित करें:
git push origin +test
चरण 7 : और फिर परीक्षण और मास्टर के बीच कोई संघर्ष नहीं है। आप सीधे मर्ज का उपयोग कर सकते हैं।
संघर्षों से बचने के लिए मैं हमेशा नीचे दिए गए चरणों का पालन करता हूं।
अब आप भी ऐसा ही कर सकते हैं और जितनी चाहें उतनी स्थानीय शाखाएँ रख सकते हैं और जब भी आवश्यक हो, बस अपनी गिट्ट चेकआउट कर रहे हैं।
विभिन्न स्थितियों में हो सकता है विलय संघर्ष:
आपको एक मर्ज टूल इंस्टॉल करने की आवश्यकता है जो संघर्षों को हल करने के लिए गिट के साथ संगत है। मैं व्यक्तिगत रूप से KDiff3 का उपयोग करता हूं, और मैंने इसे अच्छा और आसान पाया है। आप यहां इसका विंडोज संस्करण डाउनलोड कर सकते हैं:
https://sourceforge.net/projects/kdiff3/files/
BTW यदि आप Git एक्सटेंशन स्थापित करते हैं तो Kdiff3 को स्थापित करने के लिए इसके सेटअप विज़ार्ड में एक विकल्प है।
इसके बाद सेटअप git कॉन्फिड को मेरिजेट के रूप में उपयोग करने के लिए कॉन्फ़िगर करता है:
$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false
$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false
(Kdiff exe फ़ाइल के वास्तविक पथ के साथ पथ को बदलना याद रखें।)
हर बार जब आप एक मर्ज संघर्ष में आते हैं, तो आपको बस इस कमांड को चलाने की आवश्यकता होती है:
$git mergetool
फिर यह Kdiff3 को खोलता है, और सबसे पहले मर्ज संघर्षों को स्वचालित रूप से हल करने का प्रयास करता है। अधिकांश संघर्षों को अनायास हल किया जाएगा और आपको बाकी को मैन्युअल रूप से ठीक करने की आवश्यकता है।
यहाँ Kdiff3 कैसा दिखता है:
फिर एक बार जब आप काम कर लेते हैं, तो फ़ाइल को सहेजें और यह संघर्ष के साथ अगली फ़ाइल पर जाता है और आप फिर से वही काम करते हैं जब तक कि सभी संघर्ष हल नहीं हो जाते।
यह जांचने के लिए कि क्या सबकुछ सफलतापूर्वक विलय हो गया है, बस फिर से मर्जटूल कमांड चलाएं, आपको यह परिणाम प्राप्त करना चाहिए:
$git mergetool
No files need merging
यह उत्तर उन VIM उपयोगकर्ताओं के लिए एक विकल्प जोड़ना है जैसे I जो संपादक के भीतर सब कुछ करने के लिए पसंद करते हैं।
Tpope VIM के लिए इस महान प्लगइन के साथ आया जिसे भगोड़ा कहा जाता है । एक बार स्थापित होने पर आप उन :Gstatus
फ़ाइलों की जांच करने के लिए चला सकते हैं जिनमें संघर्ष है और:Gdiff
3 तरीकों से मर्ज करने के लिए गिट को खोलना होता है।
एक बार 3-तरीके से मर्ज करने के बाद, भगोड़ा आपको निम्नलिखित में से किसी एक शाखा में बदलाव करने देगा जो आप निम्नलिखित फैशन में विलय कर रहे हैं:
:diffget //2
मूल ( HEAD ) शाखा से परिवर्तन प्राप्त करें ::diffget //3
विलय शाखा से परिवर्तन प्राप्त करें: एक बार जब आप फ़ाइल को मर्ज कर रहे हैं, :Gwrite
तो मर्ज किए गए बफ़र में टाइप करें । Vimcasts ने इस कदम के बारे में विस्तार से बताते हुए एक शानदार वीडियो जारी किया ।
आप वीएस कोड के लिए गिट्लेंस की कोशिश कर सकते हैं , वे प्रमुख विशेषताएं हैं:
मुझे यह सुविधा पहले से ही पसंद है:
git fetch
git चेकआउट अपनी शाखा
git रिबेट मास्टर
इस चरण में आप अपनी पसंद के आईडीई का उपयोग करके संघर्ष को ठीक करने का प्रयास करेंगे
आप इस लिंक का अनुसरण कर सकते हैं ताकि फ़ाइल में संघर्ष को ठीक करने के लिए
https://help.github.com/articles/resolve-a-merge-conflict-use-the-command-line/
git add
git rebase --continue
git कमिट --amend
git पुश ओरिजनल HEAD: refs / draft / master (ड्राफ्ट की तरह पुश)
अब हर चीज ठीक है और आप अपनी प्रतिबद्धता को गंभीरता से पाएंगे
मुझे उम्मीद है कि यह इस मुद्दे से संबंधित हर एक की मदद करेगा।
यदि आप पहले से ही नहीं हैं, तो संपादन के लिए विज़ुअल स्टूडियो कोड आज़माएँ। आपके द्वारा मर्ज करने का प्रयास करने के बाद (और मर्ज विरोधों में उतरने) की कोशिश करता है। वीएस कोड स्वचालित रूप से मर्ज टकराव का पता लगाता है।
यह दिखावा करने में आपकी बहुत मदद कर सकता है कि मूल एक में क्या बदलाव किए गए हैं और आपको स्वीकार करना चाहिए incoming
या
current change
(विलय से पहले मूल अर्थ) '?'
इसने मेरे लिए मदद की और यह आपके लिए भी काम कर सकता है!
PS: यह तभी काम करेगा जब आपने अपने कोड और विजुअल स्टूडियो कोड के साथ git कॉन्फ़िगर किया हो।
संघर्षों को हल करने का एक सुरक्षित तरीका git-mediate का उपयोग करना है (यहाँ सुझाए गए सामान्य समाधान काफी त्रुटिपूर्ण हैं imho)।
इसका उपयोग कैसे करें, इस पर एक त्वरित परिचय के लिए इस पोस्ट को देखें ।
जो लोग विजुअल स्टूडियो (मेरे मामले में 2015) का उपयोग कर रहे हैं
VS में अपना प्रोजेक्ट बंद करें। विशेष रूप से बड़ी परियोजनाओं में वीएस यूआई का उपयोग करते समय विलय करने के लिए निकल जाता है।
कमांड प्रॉम्प्ट में मर्ज करें।
git चेकआउट target_branch
git मर्ज source_branch
फिर वीएस में परियोजना खोलें और टीम एक्सप्लोरर -> शाखा पर जाएं। अब एक संदेश है जो कहता है कि मर्ज लंबित है और परस्पर विरोधी फाइलें संदेश के ठीक नीचे सूचीबद्ध हैं।
परस्पर विरोधी फ़ाइल पर क्लिक करें और आपके पास मर्ज, तुलना, लो सोर्स, टेक टारगेट का विकल्प होगा। वीएस में मर्ज टूल का उपयोग करना बहुत आसान है।
यदि आप IDE के रूप में intelliJ का उपयोग कर रहे हैं, तो अपनी शाखा में माता-पिता को मर्ज करने का प्रयास करें
git checkout <localbranch>
git merge origin/<remotebranch>
यह इस तरह सभी संघर्षों को दिखाएगा
A_MBPro: test au $ git मर्ज का मूल / ऑटो-मर्जिंग src / test / java / com /.../ TestClass.java CONFLICT (सामग्री): src / test / jaवा / com /.../ TestClass.java में विलय संघर्ष
अब ध्यान दें कि फ़ाइल TestClass.java को intelliJ में लाल रंग में दिखाया गया है। git स्टेटस भी दिखाएगा
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/test/java/com/.../TestClass.java
इंटेलीज में फाइल खोलें, इसमें सेक्शन होंगे
<<<<<<< HEAD
public void testMethod() {
}
=======
public void testMethod() { ...
}
>>>>>>> origin/<remotebranch>
जहां HEAD आपकी स्थानीय शाखा और परिवर्तन पर है / दूरस्थ शाखा से परिवर्तन है। यहां वह सामान रखें जो आपको चाहिए और जो सामान आपको चाहिए, उसे हटा दें। इसके बाद सामान्य कदम उठाने चाहिए। अर्थात्
git add TestClass.java
git commit -m "commit message"
git push
मैं विरोधों को सुलझाने के लिए Microsoft के विज़ुअल कोड का उपयोग कर रहा हूं। इसका उपयोग करने के लिए बहुत सरल है। मैं अपने प्रोजेक्ट को कार्यक्षेत्र में खुला रखता हूं। यह संघर्षों का पता लगाता है और हाइलाइट करता है, इसके अलावा GUI को जो भी बदलाव मैं HEAD या इनकमिंग से रखना चाहता हूं उसका चयन करने के लिए देता हूं।