2010-06-23 1 views
6
Belirli bir git davranışı hakkında bir karışıklığa sahip

:git yeniden adlandırma/silme karışıklık

ardından adımları ve durum (komutların listesi de sonradan verilmiştir) şunlardır:

  1. İki şubeleri var: master ve XBranch
  2. Her ikisinde de bir dosya src/a.txt var. İçeriği "Eski İçerik"
  3. XBranch'da src/a.txt dosyasını src/b.txt olarak yeniden adlandırıyorum: mv, , git rm, git add.
  4. Ana sayfada a.txt dosyasını yeniden adlandırın. taahhüt sırasında git rm src/a.txt yaptım ama yapmam Master'da git add src/b.txt yapmak unuttum: git rm src/a.txt ve Master'da

  5. git commit, ben "efendi olarak New Content

  6. ben git add src/b.txt yapmak ve dosya b.txt içeriğini düzenlemek Master'da git commit
  7. yapmam: git merge XBranch

dosya src/b.txt çatışmaları, mükemmel un hangi derstandable. Ancak içerik "Old Content" şeklindedir. Niye ya? Komutların

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

listesi::

Neden değil

bir şey gibi

[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 

cevap

6

Orada bir çatışma değil, dosya içeriği hakkında. Bu içerik, içeriği ile ilgilidir. tek ağacında

  • , case2 dizin (master'da), aynı dizinde (XBranch cinsinden) bir yeni dosya b.txt
  • , orada bir dosya a.txt => b.txt
değiştirildi vardır

Çakışmayı çözerken, bir dosya veya diğer (dosya içinde bir satır değil) seçiyorsunuz. Sonuçta ortaya çıkan "Eski İçerik" dosyasında.


OP yorumlarda ekler:

Ama sonra nasıl mantıksal olan aşağıdaki durumdan farklı:

  1. ben "Eski İçerik" ile master bir dosyayı a.txt eklemek ve bunu taahhüt et.
  2. Ben "Yeni İçerik" ile XBranch bir dosyayı a.txt ekleyin ve taahhüt.
  3. ben master içine XBranch birleşir. Bu sefer bu dosyada her iki içeriği de gösteriyor!

Bu sefer her iki ağaçlar referans bir yeni dosya a.txt (dalların master ve XBranch yılında Durum 2 dizini): içeriğinin çatışma çözünürlüğe sahip, birleştirilir. Önce, bir a.txt (b.txt olarak değiştirildi ) arasında bir çatışma yoktu yeni b.txt a: vardı her iki dosya (dosya değil, dosya içeriğinin), aynı işkolunda bir seçim var olamaz yapılacak. Soruma 4. adımda

, ben "git rm" yaparsanız ve tek yılında "git add", taahhüt beklediğim gibi çalıştığını! Bunu şimdi anlayamıyorum. Dosyanın her iki içeriğinin ne zaman olacağını tahmin edebilirim? sadece XBranch içeriğini olacak ve ne zaman master sadece içeriği hale gelecek?

yerine Adım 6'da (ağacın çatışma) yeni b.txt ile taahhüt master için ( a.txt b.txt olarak değiştirildi) XBranch birleştirme
  • ,
  • Eğer XBranch birleştirmeyi öngören: demektir

yeni aşama 4 (a.txtgelen ana ile (a.txtb.txt yeniden adlandırılmış olan), aynı zamandaolarak değiştirildi): aynı ağaç içeriği, ancak farklı blob içeriği: satır çakışması. söyleniyor


, OP hala bir hata olmalı düşünür:

+0

Ama sonra nasıl mantıksal olan aşağıdaki durumdan farklı : 1. Master'da "Eski İçerik" ile bir dosya a.txt dosyası ekledim ve taahhüt ediyorum. 2. Ben "Yeni İçerik" ile XBranch bir dosya a.txt ekleyin ve taahhüt. 3. XBranch'ı ana bilgisayara birleştiriyorum. Bu sefer bu dosyada hem içeriğini gösteriyor! – Sabya

+0

@Sabya: bu sefer, her iki ağaç da (şubelerdeki 'ana' ve 'XBranch'daki' case2' dizini) bir * yeni * dosya 'a.txt' başvurusu: içeriği birleştirilmiş, çakışma çözümüyle birleşiyor. Daha önce, bir ** 'a.txt' ** (b.txt' olarak yeniden adlandırıldı) ve yeni bir ** b.txt' ** arasında bir çakışma vardı: her iki dosya aynı dalda mevcut olamaz, bir seçim (dosya içeriğinin değil, dosya) yapılması gerekiyordu. – VonC

+0

Sorumluluğumun 4. adımında, tek bir işlemde "git rm" ve "git add" yaparsam, beklediğim gibi çalışır! Şimdi bunu anlayamıyorum. Dosyanın her iki içeriğinin ne zaman olacağını tahmin edebilir miyim? Sadece XBranch içeriğine sahip olacak ve ne zaman sadece master içeriğine sahip olacak? – Sabya