2012-03-30 33 views
10

Tôi có một dự án đã được bắt đầu trong TFS, sau đó chuyển đến Git. Thật không may, anh chàng chuyển nó sang Git chỉ cần kiểm tra trong các tập tin hiện tại thay vì sử dụng git-tfs. Tôi đang cố gắng để rebase cam kết mới của mình trong Git trên đầu trang của các cam kết tôi kéo từ TFS bằng cách sử dụng git-tfs.Tại sao git hiển thị xung đột giữa hai tệp được thêm giống hệt nhau?

Để làm điều này, tôi chỉ đơn giản là rebasing cam kết của mình trên đầu trang của các cam kết git-tfs. (Tôi nhận ra điều này sẽ làm hỏng các chi nhánh Git từ xa, nhưng chúng tôi là một nhóm nhỏ và nó sẽ ổn thôi. Tôi cũng đã thử chọn lựa anh đào nhưng tôi cũng gặp vấn đề tương tự.)

Vấn đề tôi ' đang chạy vào là một tập hợp của những xung đột mà trông như thế này:

<<<<<<< HEAD 
namespace OurNiftyProject 
{ 
    public enum CardType 
    { 
     Visa = 0, 
     MasterCard = 1 
    } 
} 
||||||| merged common ancestors 
======= 
namespace OurNiftyProject 
{ 
    public enum CardType 
    { 
     Visa = 0, 
     MasterCard = 1 
    } 
} 
>>>>>>> Add a bunch of stuff. 

dường như đây là một cuộc xung đột giữa một cam kết từ phía TFS rằng thêm những tập tin này, và cam kết ở phía bên Git đó thêm họ (khi repo của Git bắt đầu trống rỗng).

Điều hợp lý sẽ là bỏ qua cam kết này, có lẽ, nhưng có một vài tệp trong đó (nói mười trong số vài trăm) là mới. Những người không gây ra xung đột, tất nhiên.

Tại sao Git không thể tự phát hiện ra rằng hai tệp giống hệt nhau? Ngay cả khi tôi sử dụng --ignore-whitespace khi tôi rebase, Git vẫn cho thấy hàng chục tập tin như thế này mà xuất hiện để được giống hệt nhau. Tôi đang thua lỗ để giải quyết vấn đề này.

+0

'diff' có cung cấp cho bạn sự khác biệt không? – Reactormonk

+4

Nó có thể là sự khác biệt kết thúc dòng? – ebneter

+0

Trailing whitespaces có lẽ –

Trả lời

9

Cần có sự khác biệt về kết thúc dòng, như ebneter nhận xét.
Tôi đã trình bày chi tiết trong một thời gian dài trước đây như thế nào git merge là không giỏi phớt lờ những khác biệt (như trái ngược với khoảng trắng khác biệt):
"Is it possible for git-merge to ignore line-ending differences?"

Đó là lý do tại sao một chính sách chuyển đổi eol phù là cần thiết cho những kho lưu trữ trên môi trường không đồng nhất.
Xem "Distributing git configuration with the code".

+0

Git có thực sự xem xét sự khác biệt giữa các dòng khác biệt với khoảng trắng khác biệt không !? Tôi nghĩ rằng kết thúc dòng * là * khoảng trắng! –

+0

@Kyralessa: không chính xác. http://gitster.livejournal.com/28862.html đề cập đến 'cr-at-eol': với' dấu cách-dấu cách', không kích hoạt nếu ký tự trước một dấu xuống dòng không phải là khoảng trống, nhưng nó là * không được kích hoạt theo mặc định *. – VonC

5

Tôi đang làm một điều tương tự và chỉ phát hiện ra "-X bỏ qua-không gian-at-eol". Nó có sẵn cho cả hai hợp nhất và rebase. Có vẻ như đang làm điều đúng nhưng làm cho nó chết chậm chạp đối với tôi.

+1

Có lẽ họ đã tìm thấy một sự tăng tốc, bởi vì đối với tôi, việc thêm cờ không làm chậm tôi. git phiên bản 1.9.5.msysgit.0 – AnneTheAgile

1

Tôi vừa gặp phải vấn đề này, tiếp theo là bài đăng này chỉ để nhận ra đó là kịch bản kết thúc cho tôi. Vì vậy, FWIW, điều này đã xảy ra trong trường hợp của tôi bởi vì tôi từng có "Sử dụng kết thúc dòng kiểu Windows", nhưng tại một thời điểm nào đó, cho một dự án khác, tôi đã cấu hình lại nó để "Sử dụng kết thúc dòng kiểu Unix" (các cấu hình này có sẵn từ chương trình Thiết lập Git).

Quay trở lại với "Sử dụng Windows kết thúc dòng phong cách" giải quyết vấn đề mà không sử dụng "--ignore-khoảng trắng"

1

Nếu bạn có thể loại trừ những thay đổi vô hình do kết thúc dòng khác nhau, bạn có thể muốn kiểm tra xem các tập tin có các chế độ khác nhau (ví dụ: nếu bit thực thi được thiết lập). Git hiển thị toàn bộ tập tin trong một diff khi chế độ tập tin thay đổi.

Các vấn đề liên quan