2010-06-23 13 views
6

मैं किसी खास Git व्यवहार के बारे में एक भ्रम की स्थिति होने:Git नाम बदलने/हटाने भ्रम

के बाद कदम और स्थिति (कमांड की सूची भी बाद में दिए गए हैं) कर रहे हैं:

  1. मैं दो शाखाएं हैं: मास्टर और एक्सब्रैंच
  2. उनमें से दोनों में एक फ़ाइल src/a.txt है। यह सामग्री "पुरानी सामग्री"
  3. एक्सब्रैंच में मैं src/b.txt से src/b.txt का नाम बदलता हूं: mv, git rm, git add
  4. मास्टर में फ़ाइल a.txt का नाम बदलें। प्रतिबद्ध के दौरान मैं git rm src/a.txt किया, लेकिन git add src/b.txt मास्टर में करना भूल मुझे क्या करना: git rm src/a.txt और git commit

  5. मास्टर में, मैं फ़ाइल b.txt की सामग्री को संपादित करने के लिए "New Content

  6. मास्टर में मैं git add src/b.txt करते हैं और git commit
  7. मास्टर में मुझे क्या करना: git merge XBranch

फ़ाइल src/b.txt संघर्ष, जो पूरी तरह से संयुक्त राष्ट्र है derstandable। लेकिन सामग्री "Old Content" है। क्यूं कर?

<<<<<<< HEAD 
New Content 
======= 
Old content 
>>>>>>> XBranch 

कमांड की सूची::

क्यों नहीं यह कुछ की तरह है

[email protected] d:/merge_temp/test/case2 
$ mkdir source 

[email protected] d:/merge_temp/test/case2 
$ git init 
Initialized empty Git repository in d:/merge_temp/test/case2/.git/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ mkdir src 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/a.txt 
Old Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master (root-commit) 148500e] added src/a.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git branch XBranch 

[email protected] d:/merge_temp/test/case2 (master) 
$ git checkout XBranch 
Switched to branch 'XBranch' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git commit 
[XBranch b3ff8fa] changed a.txt to b.txt in XBranch 
1 files changed, 0 insertions(+), 0 deletions(-) 
rename src/{a.txt => b.txt} (100%) 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git checkout master 
Switched to branch 'master' 

[email protected] d:/merge_temp/test/case2 (master) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master bfeaecb] removed src/a.txt 
1 files changed, 0 insertions(+), 1 deletions(-) 
delete mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/b.txt 
New Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master 2361d5e] changed content of b.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git merge XBranch 
CONFLICT (rename/delete): Rename src/a.txt->src/b.txt in XBranch and deleted in HEAD 
Automatic merge failed; fix conflicts and then commit the result. 

[email protected] d:/merge_temp/test/case2 (master|MERGING) 
$ cat src/b.txt 
Old Content 

उत्तर

6

एक संघर्ष है, लेकिन फ़ाइल सामग्री के बारे में नहीं। यह पेड़ सामग्री के बारे में है।

  • एक ट्री में case2 निर्देशिका (मास्टर में), वहाँ है एक नई फ़ाइल b.txt
  • समान निर्देशिका (XBranch में) में, वहाँ है एक नाम दिया फ़ाइल a.txt => b.txt

जब आप संघर्ष का समाधान कर रहे हैं, तो आप असल में एक फ़ाइल या अन्य (फ़ाइल के भीतर एक पंक्ति नहीं) चुन रहे हैं। इसलिए परिणामस्वरूप फ़ाइल में "पुरानी सामग्री"।


ओपी टिप्पणी में कहते हैं:

लेकिन फिर कैसे तार्किक है यह निम्न स्थिति से अलग:

  1. मैं के साथ "ओल्ड सामग्री" master में एक फ़ाइल a.txt जोड़ने और इसे प्रतिबद्ध करो।
  2. मैं a.txt में XBranch में "नई सामग्री" के साथ एक फ़ाइल जोड़ता हूं और इसे प्रतिबद्ध करता हूं।
  3. मैं XBranchmaster में विलय करता हूं। इस बार यह उस फ़ाइल में दोनों सामग्री दिखा रहा है!

इस बार, दोनों पेड़ संदर्भ एक नई फ़ाइल a.txt (शाखाओं master और XBranch में case2 निर्देशिका): इसकी सामग्री संघर्ष संकल्प के साथ, विलय हो। इससे पहले, वहाँ एक a.txt (b.txt का नाम बदलकर) और के बीच एक संघर्ष था नई b.txt एक: दोनों फ़ाइलों (फाइल की, फ़ाइल सामग्री की नहीं), उसी शाखा में मौजूद नहीं कर सकते एक विकल्प था निर्मित किया जाने के लिए।

मेरे सवाल का चरण 4 में, अगर मैं "git rm" करते हैं और "git add" एक ही में, प्रतिबद्ध यह काम करता है के रूप में मैं उम्मीद! मैं अब समझने में असफल रहा। मैं भविष्यवाणी कैसे कर सकता हूं कि फ़ाइल में दोनों सामग्री कब होगी? जब इसकी केवल XBranch की सामग्री होगी और यह master की सामग्री कब होगी?

इसका मतलब है कि:

    बजाय XBranch विलय ( a.txt b.txt का नाम बदलकर) master के लिए एक नया b.txt चरण 6 (पेड़ का संघर्ष) से ​​साथ प्रतिबद्ध की
  • ,
  • आप XBranch विलय होगा (a.txt को b.txt के नाम से बदला गया) नए चरण 4 (a.txtसे मास्टर के साथ कोके रूप में भी बदल दिया गया): समान पेड़ सामग्री, लेकिन अलग ब्लॉब सामग्री: रेखाओं का संघर्ष।

कहा जा रहा है, ओ पी अभी भी सोचता है कि एक बग होना चाहिए:

+0

लेकिन फिर कैसे तार्किक है यह निम्न स्थिति से अलग : 1. मैं "पुरानी सामग्री" के साथ मास्टर में एक फ़ाइल a.txt जोड़ता हूं और इसे प्रतिबद्ध करता हूं। 2. मैं "नई सामग्री" के साथ XBranch में एक फ़ाइल a.txt जोड़ता हूं और इसे प्रतिबद्ध करता हूं। 3. मैं एक्सब्रांच को मास्टर में विलय करता हूं। इस बार यह उस फ़ाइल में दोनों सामग्री दिखा रहा है! – Sabya

+0

@ सब्बिया: इस बार, दोनों पेड़ (शाखाओं 'मास्टर' और 'एक्सब्रैंच' में 'केस 2' निर्देशिका) एक * नई * फ़ाइल' a.txt' संदर्भित करती है: इसकी सामग्री विवाद समाधान के साथ विलय हो जाती है। इससे पहले, ** 'a.txt' ** (जिसे 'b.txt' के नाम से बदला गया) और एक नया **' b.txt' ** के बीच एक संघर्ष था: दोनों फाइलें उसी शाखा में मौजूद नहीं हो सकतीं, एक विकल्प (फ़ाइल का, फाइल सामग्री नहीं) को बनाना था। – VonC

+0

मेरे प्रश्न के चरण 4 में, यदि मैं एक ही प्रतिबद्धता में "गिट आरएम" और "गिट एड" करता हूं, तो यह काम करता है जैसा कि मैं उम्मीद करता हूं! मैं अब समझने में असफल रहा हूं। मैं भविष्यवाणी कैसे कर सकता हूं कि फ़ाइल में दोनों सामग्रियां होंगी? जब इसमें एक्सब्रैंच की सामग्री होगी और इसमें मास्टर की सामग्री कब होगी? – Sabya