2013-03-01 10 views
7

Tôi đang gặp vấn đề về git nơi tôi muốn hợp nhất nhánh vào master nhưng từ chối hợp nhất vì nó cho rằng tôi có thay đổi cục bộ đối với tệp. Làm tình trạng cho thấy không có thay đổi và diffing các tập tin sản xuất không có gì. Đây là đầu ra của thiết bị đầu cuối:Git từ chối hợp nhất vì thay đổi đối với một tệp không đổi

$ git checkout ProductsAndContents 
Switched to branch 'ProductsAndContents' 

$ git status 
# On branch ProductsAndContents 
nothing to commit (working directory clean) 

$ git checkout master 
Switched to branch 'master' 

$ git status 
# On branch master 
nothing to commit (working directory clean) 

$ git merge ProductsAndContents 
error: Your local changes to the following files would be overwritten by merge: 
    tests/unit/src/models/BrandTests.js 
Please, commit your changes or stash them before you can merge. 
Aborting 

Bất kỳ trợ giúp hoặc đề xuất nào sẽ được đánh giá cao nhất!

+1

Bạn bằng cách nào đó đã quản lý tệp đó trong tệp '.git/info/exclude' hoặc tệp' .gitignore'? –

+2

Tùy chọn cấu hình trong [answer] (http://stackoverflow.com/a/12167041/166732) có giúp ích không? – asm

+0

Xin chào Andrew, thiết lập 'core.trustctime' thành false dường như đã thực hiện nó. Cảm ơn bạn đã chỉ cho tôi đúng hướng :) –

Trả lời

3

Nhờ nhận xét của Andrew Myers về câu hỏi ban đầu của tôi, tôi đã phát hiện ra thiết lập core.trustctime đến false đã giải quyết được sự cố.

git config core.trustctime false 

Điều gì đó về thời gian thay đổi inode không khớp. Tôi đoán điều này là bởi vì repo đang ngồi trên một fileshare trên một máy tính với một hệ thống tập tin khác nhau từ một trong những tôi đang sử dụng.

Cảm ơn tất cả các đề xuất!

-2

Chỉ vì mỗi nhánh không có gì để cam kết không có nghĩa là chúng giống nhau. Tôi sẽ quan tâm đến xem sự khác biệt giữa hai tập tin sử dụng

git diff 

Bạn có thể trở lại phiên bản đã được cam kết để các repo sử dụng

git checkout -- tests/unit/src/models/BrandTests.js 
+3

'Vui lòng cam kết thay đổi hoặc giấu chúng trước khi bạn có thể hợp nhất.' ngụ ý những thay đổi không được cam kết, không có sự khác biệt cam kết giữa các chi nhánh –

+0

Thực sự không có thay đổi nào đối với cam kết và không có tệp không được theo dõi. Như tôi đã đề cập, sự khác biệt tạo ra đầu ra bằng không. Tôi bối rối. –

1

Vâng, nếu bạn chắc rằng bạn đã thắng 't mất bất kỳ công việc, hãy thử những điều sau đây:

rm tests/unit/src/models/BrandTests.js 
git checkout -- tests/unit/src/models/BrandTests.js 

Điều đó nên đặt lại bất kỳ cơ chế nào khiến nó nghĩ rằng nó đã thay đổi. Nếu nó không hoạt động, có những người khác có thể.

+0

Cảm ơn đề xuất Trev! Tôi đã thử nhưng tiếc là nó vẫn cho cùng một lỗi. Rất lạ ... –

+0

Tôi cũng gặp phải điều này, nhưng có vẻ như 'git stash' sẽ từ chối xem một tệp đã được sửa đổi. Tôi đã sao lưu thủ công, kiểm tra và so sánh các thay đổi bằng tay. Có phải là một cách tốt hơn ... –

+0

@PaulLammertsma Đừng quên rằng một 'stash' là gì khác hơn là một cam kết và có băm riêng của nó. Bạn có thể hoạt động trên nó như bạn thực hiện bất kỳ cam kết nào khác. Mà lá nhiều lựa chọn khác. Tôi vừa tìm thấy ở trên là nhanh nhất. –

1

tôi sẽ đoán đây là kịch bản của bạn:

$ git checkout ProductsAndContents 
Switched to branch 'ProductsAndContents' 

Chi nhánh ProductsAndContents chứa các tập tin tests/unit/src/models/BrandTests.js, vì vậy trên checkout tạo ra nó và/hoặc đảm bảo nó được cập nhật với các cụ cam kết yêu cầu.

$ git status 
# On branch ProductsAndContents 
nothing to commit (working directory clean) 

Bạn chưa thực hiện bất kỳ thay đổi nào và bắt đầu với thư mục hoạt động sạch sẽ, vì vậy điều này là tốt.

$ git checkout master 
Switched to branch 'master' 

Điều này đảm bảo tất cả các tệp có trong cam kết mới nhất trên master đều được cập nhật trong thư mục làm việc. Tuy nhiên, nó không xóa hoặc cập nhật các tệp không có trong master hoặc bị bỏ qua. Ở đây tôi giả định master vì bất kỳ lý do gì hiện không bao gồm các tập tin trong câu hỏi.

$ git status 
# On branch master 
nothing to commit (working directory clean) 

Một lần nữa, bạn đã không thực hiện sửa đổi. Thực tế là các tập tin trong câu hỏi không được đề cập ở đây như là một tập tin untracked có thể có nghĩa là nó bị bỏ qua (hoặc trong .gitignore hoặc trong .git/info/exclude). master không chứa tệp để nó không lo ngại rằng nó tồn tại.

$ git merge ProductsAndContents 
error: Your local changes to the following files would be overwritten by merge: 
    tests/unit/src/models/BrandTests.js 
Please, commit your changes or stash them before you can merge. 
Aborting 

Ở đây, nỗ lực của bạn để hợp nhất vào chi nhánh khác muốn giới thiệu tệp mà master hiện không có, thường là tốt. Tuy nhiên, tệp đó tồn tại trong thư mục làm việc của bạn và git không muốn thùng rác thứ gì đó mà nó không chắc chắn được lưu giữ trong kho lưu trữ. Như được đề xuất ở nơi khác, bạn có thể (giả sử bạn biết nó an toàn) chỉ cần xóa tệp đó và thử lại quá trình hợp nhất.

Với thông tin bạn đã cung cấp, tôi không chắc chắn 100% đó là những gì bạn có ở đây; bạn có thể chạy hai lệnh dưới đây để kiểm tra tình trạng đó, mặc dù:

git ls-files master -- tests/unit/src/models/BrandTests.js 
git ls-files ProductsAndContents -- tests/unit/src/models/BrandTests.js 

Nếu tôi đoán là đúng, lệnh đầu tiên sẽ không hiển thị các tập tin tồn tại, trong khi ý chí thứ hai. Sau đó kiểm tra .gitignore.git/info/exclude để xem liệu nó có bị bỏ qua hay không (đối với .gitignore, bạn có thể cần phải kiểm tra phiên bản tồn tại trên từng nhánh của hai nhánh).

+0

Cảm ơn! Thật không may là tệp ở cả hai nhánh và không có trong .gitignore hoặc .git/info/exclude. Đây là đầu ra: $ git ls-files master - tests/unit/src/models/BrandTests.js kiểm tra/đơn vị/src/models/BrandTests.js $ git ls-files Sản phẩmAndContents - kiểm tra/đơn vị/src/models/BrandTests.js kiểm tra/đơn vị/src/mô hình/BrandTests.js –