2010-06-23 41 views
6

tôi có một sự nhầm lẫn về một hành vi git cụ thể:git đổi tên/xóa nhầm lẫn

Sau đây là các bước và tình hình (danh sách các lệnh cũng được nêu phía sau):

  1. Tôi có hai chi nhánh: chủ và XBranch
  2. Có một tệp src/a.txt trong cả hai tệp. Nội dung của nó là "Nội dung cũ"
  3. Trong XBranch tôi đổi tên src/a.txt thành src/b.txt, sử dụng: mv, git rm, git add.
  4. Trong tên chính, hãy đổi tên tệp a.txt. Trong cam kết tôi đã làm git rm src/a.txt nhưng quên làm git add src/b.txt Trong tổng thể tôi làm: git rm src/a.txtgit commit

  5. Trong tổng thể, tôi chỉnh sửa nội dung của tập tin b.txt để "New Content

  6. Trong tổng thể tôi làm git add src/b.txtgit commit
  7. Trong tổng thể tôi làm: git merge XBranch

Các tập tin xung đột src/b.txt, đó là một cách hoàn hảo un có thể hiểu được. Nhưng nội dung là "Old Content". Tại sao?

Tại sao không là nó cái gì đó như:

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

Danh sách Commands:

[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 

Trả lời

6

Có một mâu thuẫn, nhưng không phải về tập tin nội dung. Đó là về nội dung cây.

  • Trong một cây, case2 thư mục (trong tổng thể), có một mới tập tin b.txt
  • trong cùng thư mục (trong XBranch), có một đổi tên tập tin a.txt => b.txt

Khi bạn giải quyết xung đột, bạn đang có hiệu lực chọn một tệp hoặc khác (không phải một dòng trong tệp). Do đó, "Nội dung cũ" trong tệp kết quả.


Các OP cho biết thêm trong các ý kiến:

Nhưng sau đó như thế nào một cách logic là nó khác với các tình huống sau đây:

  1. tôi thêm một file a.txt trong master với "Old Nội dung" và cam kết.
  2. Tôi thêm tệp a.txt vào XBranch bằng "Nội dung mới" và cam kết.
  3. Tôi hợp nhất XBranch vào master. Lần này nó hiển thị cả hai nội dung trong tập tin đó!

Lần này, cả hai cây (thư mục Trường hợp2 tại các chi nhánh masterXBranch) tham khảo một file mớia.txt: nội dung của nó được sáp nhập, với độ phân giải xung đột . Trước đây, đã có một cuộc xung đột giữa một a.txt (đổi tên như b.txt) và một mớib.txt: cả hai tập tin không thể tồn tại trong cùng một chi nhánh , một sự lựa chọn (các tập tin, không nội dung tập tin) có được làm.

Trong bước 4 của câu hỏi của tôi, nếu tôi làm "git rm" và "git add" trong một đơn cam kết, nó hoạt động như tôi mong đợi! Tôi không hiểu điều đó bây giờ. Làm thế nào tôi có thể dự đoán khi nào tệp sẽ có cả hai nội dung? Khi nó chỉ có nội dung của XBranch và khi nào nó chỉ có nội dung của master?

Điều đó có nghĩa rằng:

  • thay vì sáp nhập XBranch (a.txt đổi tên thành b.txt) để master cam với một mới b.txt từ bước 6 (mâu thuẫn về cây),
  • bạn sẽ sáp nhập XBranch (a.txt đổi tên thành b.txt) bằng chính từ mới bước 4 (a.txtcũng được đổi tên thànhb.txt): cùng nội dung cây, nhưng khác nhau nội dung blob: xung đột đường kẻ.

Điều đó đang được nói, OP vẫn nghĩ phải có một lỗi:

+0

Nhưng sau đó như thế nào một cách logic là nó khác với các tình huống sau đây : 1. Tôi thêm tệp a.txt vào chủ với "Nội dung cũ" và cam kết. 2. Tôi thêm một tập tin a.txt trong XBranch với "Nội dung mới" và cam kết nó. 3. Tôi kết hợp XBranch thành master. Lần này, nó hiển thị cả hai nội dung trong tệp đó! – Sabya

+0

@Sabya: lần này, cả hai cây (thư mục 'case2' trong nhánh' master' và 'XBranch') tham chiếu tệp * new *' a.txt': nội dung của nó được hợp nhất, với độ phân giải xung đột. Trước đây, có một xung đột giữa ** 'a.txt' ** (được đổi tên thành' b.txt') và một tệp mới ** 'b.txt' **: cả hai tệp không thể tồn tại trong cùng một nhánh, một lựa chọn (của tệp, không phải nội dung tệp) phải được thực hiện. – VonC

+0

Trong bước 4 của câu hỏi của tôi, nếu tôi làm "git rm" và "git add" trong một cam kết, nó hoạt động như tôi mong đợi! Tôi không hiểu bây giờ. Làm thế nào tôi có thể dự đoán khi nào tệp sẽ có cả hai nội dung? Khi nó sẽ chỉ có nội dung của XBranch và khi nào nó sẽ chỉ có nội dung của chủ? – Sabya