2014-08-29 7 views
135

यह एक प्रश्न के बहुत बुनियादी की तरह लग सकता है, लेकिन मैंने जवाबों की खोज की है और मैं पहले से ज्यादा उलझन में हूं।गिट में "हमारा" और "उनका" का सटीक अर्थ क्या है?

क्या करता है "हमारा" और "उनकी" Git में मतलब जब मेरी दूसरी शाखा में अपनी शाखा विलय? दोनों शाखाएं "हमारा" हैं।

विलय विवाद में "हमारा" हमेशा प्रदर्शित दो संस्करणों का ऊपरी है?

क्या "हमारा" हमेशा उस शाखा को संदर्भित करता है जिसे हेड शुरू होने पर इंगित कर रहा था? यदि ऐसा है तो फिर "हमारे शाखा" जैसे स्वामित्व वाले सर्वनाम का उपयोग करने के बजाय "मौजूदा शाखा" जैसे स्पष्ट स्वामित्व वाले संदर्भ का उपयोग क्यों न करें (क्योंकि दोनों शाखा तकनीकी रूप से हमारे हैं)?

या बस शाखा का नाम (बजाय कह रही है "हमारा" बस "स्थानीय मास्टर की" या इस तरह कहते हैं की) का उपयोग करें?

मेरे लिए सबसे भ्रामक हिस्सा अगर मैं एक विशिष्ट शाखा के .gitattributes फ़ाइल में निर्दिष्ट है। परीक्षण शाखा में कहते हैं कि चलो मैं निम्नलिखित .gitattributes दायर किया है:

config.xml merge=ours 

अब मैं चेकआउट और बिंदु HEAD मास्टर तो परीक्षण में मर्ज करें। चूंकि मास्टर हमारा है, और परीक्षण के .gitattributes चेक आउट नहीं किया है, तो यह और भी असर पड़ेगा? यदि इसका प्रभाव पड़ता है, क्योंकि मास्टर अब "हमारा" है, तो क्या होगा?

उत्तर

175

मुझे संदेह है कि आप यहां उलझन में हैं क्योंकि यह मौलिक रूप से भ्रमित है। चीजों को और भी खराब बनाने के लिए, जब आप एक रिबेज कर रहे हों तो पूरे हमारे/उनकी चीजें भूमिकाएं बदलती हैं (पिछली हो जाती हैं)।

अंत में, एक git merge के दौरान, "हमारा" शाखा शाखा आप विलय कर रहे हैं करने के लिए में संदर्भित करता है:

git checkout merge-into-ours 

और "उनकी" शाखा आप कर रहे हैं (एकल) शाखा को संदर्भित करता है विलय:

git merge from-theirs 

और यहाँ "हमारा" और "उनकी" कुछ समझ में आता है, भले ही "उनकी" के रूप में शायद तुम्हारा वैसे भी है, "उनकी" नहीं जिसका आप पर थे जब तुम 01,237,430 भाग गया है।

वास्तविक शाखा नाम का उपयोग करते समय बहुत अच्छा हो सकता है, यह अधिक जटिल मामलों में अलग हो जाता है। उदाहरण के लिए, ऊपर के बजाय, आप कर सकते हैं:

git checkout ours 
git merge 1234567 

जहां कच्चे प्रतिबद्ध-आईडी के आधार पर विलय कर रहे हैं। इससे भी बदतर, आप भी ऐसा कर सकते हैं:

जिस स्थिति में
git checkout 7777777 # detach HEAD 
git merge 1234567  # do a test merge 

कोई शाखा शामिल नामों देखते हैं!

मुझे लगता है कि इसे यहाँ थोड़ी मदद है, लेकिन वास्तव में, gitrevisions syntax में, आप एक व्यक्ति पथ के लिए सूचकांक में संख्या से, एक विरोध हुआ मर्ज के दौरान उल्लेख कर सकते हैं

git show :1:README 
git show :2:README 
git show :3:README 

स्टेज # 1 के आम पूर्वज है फाइलें, चरण # 2 लक्ष्य-शाखा संस्करण है, और चरण # 3 वह संस्करण है जिसे आप विलय कर रहे हैं।


कारण "हमारा" और "उनकी" विचार एक गुमनाम शाखा में rebase दौरान चारों ओर बदली, कि चेरी की पसंद की एक श्रृंखला करके काम करता है rebase है मिल (अलग HEAD मोड)। लक्ष्य शाखा अज्ञात शाखा है, और विलय-शाखा आपकी मूल (प्री-रीबेस) शाखा है: इसलिए "--ours" का अर्थ है अज्ञात एक रिबेस का निर्माण होता है जबकि "--थीर" का अर्थ है "हमारी शाखा को पुनर्जीवित किया जा रहा है" ।


gitattributes प्रवेश के लिए के रूप में: यह सकता है एक प्रभाव है: "हमारा" वास्तव में अर्थ है "उपयोग चरण # 2" आंतरिक रूप से। लेकिन जैसा कि आप ध्यान देते हैं, यह वास्तव में उस जगह पर नहीं है, इसलिए पर कोई प्रभाव नहीं होना चाहिए ... ठीक है, जब तक कि आप इसे शुरू करने से पहले कार्य पेड़ में कॉपी न करें।

इसके अलावा, यह हमारे और उनके सभी उपयोगों पर लागू होता है, लेकिन कुछ विलय रणनीति के लिए पूरे फ़ाइल स्तर (-s ours पर विलय रणनीति के लिए हैं; git checkout --ours विलय विवाद के दौरान) और कुछ टुकड़े-दर- -s recursive विलय के दौरान टुकड़ा आधार (-X ours या -X theirs)। जो शायद किसी भ्रम के साथ मदद नहीं करता है।

हालांकि, मैंने कभी इनके लिए बेहतर नाम नहीं लिया है। और: VonC's answer को दूसरे प्रश्न पर देखें, जहां git mergetool इनके लिए अभी भी अधिक नाम प्रस्तुत करता है, उन्हें "स्थानीय" और "दूरस्थ" कहता है!

+8

+1। रिबेस के दौरान हमारे और उनके उलट होने के बारे में, यह भी देखें: http://stackoverflow.com/a/2960751/6309 और http://stackoverflow.com/a/3052118/6309 – VonC

+1

दो चीजें एक दूसरे के साथ "विलय" करती हैं। जब एक विलय होता है तो दोनों पक्ष एक दूसरे को "अंदर" विलय करते हैं। मुझे लगता है कि यह कहना गलत होगा कि दोनों पक्षों में से एक "कुछ भी विलय नहीं कर रहा है"। यदि कोई शाखा नाम शामिल नहीं है (जैसा कि आप इंगित करते हैं) तो इसमें शामिल नाम शामिल हैं (आप "हमारा" और "उनके" के बजाय "7777777" और "1234567" कह सकते हैं। मैं समझता हूं कि रिबेस के दौरान क्या होता है और मुझे यह बिल्कुल भ्रमित नहीं लगता है। मुझे लगता है कि "हेड्स" और "इनकमिंग" "हमारा" और "उनके" से बेहतर काम करेंगे क्योंकि हमेशा "हेड" होता है (चाहे वह अलग हो या नहीं)। – CommaToast

+11

मुझे लगता है कि सिर दिमाग की सीट है, जो पहचान का स्रोत है, जो स्वयं का स्रोत है, यह सोचने के लिए थोड़ा और समझ में आता है कि जो भी सिर "मेरा" ("हमारा" क्योंकि मुझे लगता है कि और हेड दो बनाता है)। यदि कुछ और नहीं है, तो यह सिर्फ एक अच्छा निमोनिक डिवाइस होगा। – CommaToast

24

गिट में 'हमारा' मूल कार्यरत शाखा का जिक्र कर रहा है जिसमें गिट इतिहास का आधिकारिक/कैननिकल हिस्सा है।

'उनकी' संस्करण इसी क्रम में काम रखती rebased (परिवर्तन वर्तमान शाखा पर पुनः बजाया जा करने के लिए) होने के लिए संदर्भित करता है।

यह लोग हैं, जो जानते हैं कि कर रिबेसिंग (जैसे git rebase) वास्तव में पकड़ पर अपने काम को (जो उनकी है) आदेश विहित/मुख्य इतिहास जो है पर पुनः चलाने के लिए में ले जा रहा है नहीं कर रहे हैं करने के लिए बदला जा प्रतीत हो सकता है हमारा, क्योंकि हम तीसरे पक्ष के काम के रूप में हमारे परिवर्तनों को दोबारा कर रहे हैं।

git-checkout के लिए दस्तावेज़ आगे Git में स्पष्ट किया गया> = 2.5.1 के रूप में f303016 commit प्रति:

--ours --theirs

जब सूचकांक से पथ बाहर की जाँच, बाहर की जाँच चरण # 2 (अनमोल पथों के लिए 'हमारा') या # 3 ('उनका')।

ध्यान दें कि git rebase और git pull --rebase के दौरान, 'हमारा' और 'उनका' स्वैप दिखाई दे सकता है; --ours शाखा से संस्करण को देता है कि परिवर्तनों को पुन: चालू किया जाता है, जबकि --theirs उस शाखा से संस्करण देता है जो आपके काम को पुनर्स्थापित कर रहा है।

इसका कारण यह है rebase एक कार्यप्रवाह है कि साझा विहित एक के रूप में दूरदराज के इतिहास व्यवहार करता है में प्रयोग किया जाता है, और व्यवहार करता है काम शाखा आप तृतीय-पक्ष के रूप में काम कर रहे हैं रिबेसिंग पर किया एकीकृत किया जाना है, और आप कर रहे हैं अस्थायी रूप से विद्रोह के दौरान कैनोलिक इतिहास के रखवाले की भूमिका ग्रहण करना। कैनोलिक इतिहास के रखरखाव के रूप में, आपको ours (यानी "हमारे साझा कैनोलिक इतिहास") के रूप में रिमोट से इतिहास देखने की आवश्यकता है, जबकि आपने अपनी साइड शाखा पर theirs (यानी "इसके ऊपर एक योगदानकर्ता का काम")।

git-merge के लिए यह निम्नलिखित तरीके से समझाने है:

हमारा

यह विकल्प जिसे परस्पर विरोधी स्वत: समाधान हमारे संस्करण पक्ष द्वारा सफाई से होने के लिए बलों। दूसरे पेड़ से परिवर्तन जो हमारी तरफ से संघर्ष नहीं करते हैं वे मर्ज परिणाम परिलक्षित होते हैं। एक बाइनरी फ़ाइल के लिए, पूरी सामग्री हमारी तरफ से ली जाती है।

यह हमारी मर्ज रणनीति के साथ भ्रमित नहीं होना चाहिए, जो कि अन्य पेड़ में बिल्कुल भी नहीं दिखता है। यह अन्य पेड़ के सबकुछ को त्याग देता है, हमारे इतिहास को घोषित करने में वह सब कुछ होता है।

उनकी

यह हमारा के विपरीत है।

इसके अलावा अधिक, यहाँ उनके उपयोग का तरीका समझाया गया है:

मर्ज तंत्र (git merge और git pull आदेशों) बैकएंड मर्ज रणनीतियों -s विकल्प के साथ चुना जा सकता है। कुछ रणनीतियों को भी अपना विकल्प ले सकते हैं, जिन्हें -X<option>git merge और/या git pull पर तर्क देकर पारित किया जा सकता है।


तो कभी कभी यह भ्रामक हो सकते हैं, उदाहरण के लिए:

  • git pull origin master जहां -Xours हमारे स्थानीय है, -Xtheirs उनकी (रिमोट) शाखा
  • git pull origin master -r जहां -Xours उनकी है (रिमोट) , -Xtheirs हमारा

तो दूसरा उदाहरण पहले के विपरीत है, क्योंकि हम रिमोट एक के ऊपर हमारी शाखा को रिबेस कर रहे हैं, इसलिए हमारा प्रारंभिक बिंदु दूरस्थ है, और हमारे परिवर्तन बाहरी के रूप में माना जाता है।

git merge रणनीतियों के लिए समान (-X ours और -X theirs)।

+0

यह उत्तर दिनांक से बाहर लगता है => "गिट मर्ज --ours" मान्य विकल्प नहीं है –

+0

@AlexanderMills उत्तर में 'गिट मर्ज' के बारे में बात नहीं की गई, लेकिन उदाहरण के तौर पर 'गिट पुल' और 'गिट चेकआउट' नहीं है। यदि आप इस पैरामीटर का उपयोग 'गिट मर्ज' के साथ करना चाहते हैं, तो आपको '-X ours' का उपयोग करना चाहिए। आप अभी भी 'git checkout' के लिए' --ours' वाक्यविन्यास का उपयोग कर सकते हैं। मैंने जवाब को और स्पष्ट किया है। – kenorb

0
  • हमारा: इस शाखा पर आप वर्तमान में कर रहे हैं।
  • उनका: यह आपकी दूसरी शाखा है जो आपकी कार्रवाई में उपयोग की जाती है।

तो अगर आप रिहाई/2.5 शाखा पर हैं और आप मर्ज शाखा सुविधा/नया-बटन इसे में, तो सामग्री के रूप में रिलीज में पाया/2.5 क्या हमारा को संदर्भित करता है और सुविधा/नए-बटन पर मिली सामग्री है का संदर्भ है। एक मर्ज कार्रवाई के दौरान यह बहुत सीधे आगे है।

अधिकांश लोगों के लिए गिरने वाली एकमात्र समस्या रीबेस केस है। यदि आप सामान्य विलय के बजाय पुनः आधार करते हैं, तो भूमिकाएं बदल दी जाती हैं। सो कैसे? खैर, यह पूरी तरह से काम करने के तरीके के कारण होता है। इस तरह काम करने के लिए रिबेस के बारे में सोचो:

  1. सभी करता है क्या किया है के बाद से अपने पिछले पुल उनकी खुद की एक शाखा में ले जाया जाता है, चलो यह BranchX नाम करते हैं।
  2. आप किसी भी स्थानीय परिवर्तनों को छोड़कर, अपनी वर्तमान शाखा के प्रमुख को चेकआउट करते हैं, लेकिन इस तरह के सभी परिवर्तनों को पुनर्प्राप्त करने के लिए अन्य लोगों ने उस शाखा के लिए धक्का दिया है।
  3. अब पर प्रत्येक प्रतिबद्धता शाखाX आपकी वर्तमान शाखा में नए से पुरानी क्रम में चेरी-चुनी गई है।
  4. शाखाएक्स फिर से हटा दिया गया है और इस प्रकार किसी भी इतिहास में कभी दिखाई नहीं देगा।

बेशक, यह वास्तव में क्या नहीं चल रहा है लेकिन यह मेरे लिए एक अच्छा दिमाग मॉडल है। और यदि आप 2 और 3 देखते हैं, तो आप समझ जाएंगे कि भूमिकाएं अब क्यों बदल दी गई हैं। 2 में से, आपकी वर्तमान शाखा अब आपके किसी भी बदलाव के बिना सर्वर से शाखा है, इसलिए यह है (जिस शाखा पर आप हैं)। आपके द्वारा किए गए परिवर्तन अब एक अलग शाखा पर हैं जो आपके वर्तमान (शाखाX) नहीं हैं और इस प्रकार इन परिवर्तनों (आपके द्वारा किए गए परिवर्तन होने के बावजूद) उनके (आपकी कार्रवाई में उपयोग की जाने वाली अन्य शाखा) हैं।

इसका मतलब है कि यदि आप विलय करते हैं और आप हमेशा अपने परिवर्तनों को जीतना चाहते हैं, तो आप हमेशा "हमारा" चुनने के लिए गिट को बताएंगे, लेकिन यदि आप पुन: प्रयास करते हैं और आप अपने सभी परिवर्तनों को हमेशा जीतना चाहते हैं, तो आप हमेशा " उन लोगों के"।

संबंधित मुद्दे