2011-10-26 9 views
6

Điều gì có nghĩa là khi một git rebase tìm thấy xung đột, nhưng không có vấn đề rõ ràng trong tệp? Tệp được đề cập không có điểm đánh dấu xung đột và git mergetool cho biết "không có gì để hợp nhất".Git xung đột rebase không có gì để hợp nhất?

Các tùy chọn Tôi đã được reset hoặc thêm:

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  filename.js 

Làm thế nào để tìm hiểu những gì này là về và đó đường dẫn đến mất?

git ls-files -s filename.js cho 3 hàng:

100644 d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 1 filename.js 
100644 9010798f1d19ac712196b1fc9b0870fd332b1275 2 filename.js 
100644 b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 3 filename.js 

Theo hướng dẫn tốt, lệnh này cho chúng ta biết các bit mode, tên đối tượng, và số giai đoạn. Các bit chế độ giống nhau. Vì vậy, những gì là 1, 2, và 3, và tại sao họ "cả hai sửa đổi", nhưng không hiển thị các dấu hiệu xung đột?

+1

Nó có thể khác biệt về khoảng trắng. – birryree

+0

Hãy thử 'git ls-files -s filename.js' để xem các phiên bản có khác nhau không. –

+0

@JoshLee Tôi đã cập nhật câu hỏi của tôi để phản hồi nhận xét của bạn. Đầu ra cho thấy 3 đốm màu, nhưng tôi không chắc chắn nơi để đi từ đó, làm thế nào để tôi tìm thấy sự khác biệt, hoặc cho biết cái nào là "thêm" hoặc "thiết lập lại"? –

Trả lời

7

Các phiên bản trong chỉ mục đánh dấu 1, 2, và 3 có ý nghĩa như sau:

  1. Các tập tin như trong một tổ tiên chung của hai cam kết bạn đang sáp nhập.
  2. Tệp như trong HEAD, tức là cam kết hiện tại của bạn khi bạn đã hợp nhất.
  3. Tệp như trong cam kết mà bạn đang cố gắng hợp nhất vào HEAD.

Nguồn của tôi cho thông tin này là the git manual's useful section on resolving conflicts.

Đầu ra both modified trong git status cho biết, tất nhiên, tệp được thay đổi theo các cách khác nhau theo hai cam kết mà bạn đang hợp nhất từ ​​tổ tiên chung của chúng. Tuy nhiên, điều này khá bí ẩn đối với tôi vì sao bạn không thấy các dấu xung đột trong tệp, rằng các đốm màu có các tên đối tượng khác nhau (băm) ở đầu ra của git ls-files -s cho biết rằng byte-by-byte mà chúng chắc chắn có nội dung khác nhau. Nếu bạn hài lòng với tệp như trong bản sao làm việc của mình, bạn chỉ có thể thực hiện git add filename.js và sau đó git rebase --continue. Tuy nhiên, trong mọi trường hợp bạn có thể muốn tìm ra sự khác biệt đó là gì. Để làm điều đó, tôi sẽ thử như sau:

git diff :2:filename.js filename.js 

... mà sẽ hiển thị sự khác nhau giữa các phiên bản trong HEAD và bản sao làm việc hiện tại của bạn. Tương tự, bạn có thể thử:

git diff :3:filename.js filename.js 

... để xem sự khác biệt giữa phiên bản đang được hợp nhất và bản sao làm việc của bạn.

1

Các 1, 23 của git ls-files -s đại diện cho "sân khấu" của một 3-way merge: 1 là tổ tiên chung, 2 là chi nhánh ĐẦU hiện tại và 3 là chi nhánh ĐẦU khác.Trên Linux, bạn có thể thử các lệnh sau để xem những gì khác nhau giữa các tệp:

$ git cat-file blob d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 | xxd -ps 
$ git cat-file blob 9010798f1d19ac712196b1fc9b0870fd332b1275 | xxd -ps 
$ git cat-file blob b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 | xxd -ps