Git pull: error: Entry foo not uptodate. Không thể hợp nhất


86

Tôi đang cố gắng cập nhật repo của mình từ một nhánh từ xa và tiếp tục gặp lỗi này khi tôi thực hiện "git pull". Tôi chưa thực hiện bất kỳ thay đổi cục bộ nào và ngay cả khi có tôi cũng không cần giữ lại chúng.

Tôi đã thử:

git reset --hard

và tôi gặp vấn đề tương tự

Điều duy nhất có vẻ hoạt động là xóa tệp vi phạm và thử kéo lại git.

Tôi cũng đã thử git stashtheo sau bởi a git pull. Không đi.

chỉnh sửa: sử dụng PortableGit-1.6.4-preview20090729 để sửa bất kỳ lỗi nào trước đó có lỗi giả.


Xem giải thích trong git.or.cz/gitwiki/GitFaq có hữu ích không.
Jakub Narębski

Ditto " Điều duy nhất có vẻ hiệu quả là xóa tệp vi phạm và thử kéo git lại. ". Đối với tôi, ít nhất một tệp không có trong git; nó đã được xác định bằng quy tắc ký tự đại diện. Tuy nhiên, không chắc tại sao chúng lại là chất chặn.
ruffin

3
Tôi đã có thể giải quyết vấn đề này bằng cách chạy git rm --cached learned/tests/temp_funcs.py- Vì tôi luôn muốn tệp vẫn nằm trong danh sách Tệp chưa được theo dõi , hãy git rm --cachedbỏ chặn tôi trong trường hợp này.
Sâu

1
Điều này đã xảy ra với tôi trong một lần hợp nhất mà tôi mong muốn --abort. Không có giải pháp nào được đề xuất cho phép tôi hủy bỏ, ngoại trừ xóa các tệp vi phạm.
Trevor Reid

Câu trả lời:


55

Có một số cách để khắc phục điều này nhưng tôi thấy git stash hoạt động tốt cho tôi. Nó tạm thời đưa những thay đổi cục bộ của bạn vào một nơi khác. Sau đó, bạn có thể kéo để lấy những thay đổi mới nhất. Và sau đó bạn có thể lấy lại các thay đổi cục bộ của mình.

Chỉ như thế này:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

21
Từ câu hỏi ban đầu: "Tôi cũng đã thử" git stash ", theo sau là" git pull ". Không đi."
Charles Wood

Không hiệu quả với tôi - trong trường hợp của tôi, tôi phải git rm --cachednhận xét đầy đủ: stackoverflow.com/questions/1248029/…
Deep

38

Điều này có thể xảy ra nếu bạn cập nhật chỉ mục để bỏ qua các tệp nhất định:

git update-index --assume-unchanged <file>

và sau đó, ví dụ, thanh toán một số chi nhánh khác:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

Buộc làm mới chỉ mục khắc phục sự cố:

git update-index --really-refresh
<file>: needs update

Theo dõi bởi:

git reset --hard 

Và sau đó mọi thứ sẽ trở lại bình thường.


1
Tôi đã có thể giải quyết vấn đề này bằng cách chạy git rm --cached learned/tests/temp_funcs.py- Vì tôi luôn muốn tệp vẫn nằm trong danh sách Tệp chưa được theo dõi , hãy git rm --cachedbỏ chặn tôi trong trường hợp này.
Sâu

3
Đó git update-index --really-refreshlà mảnh bị thiếu! Tốt lắm, đây là khó tìm
Bernardo Dal Corno

28

Loại vấn đề này thường xảy ra do cố gắng lấy từ một kho lưu trữ có hai tên tệp chỉ khác nhau trong trường hợp. Nếu bạn đang sử dụng FAT, NTFS ở chế độ không phân biệt chữ hoa chữ thường (về cơ bản, bất cứ lúc nào nó được sử dụng trong Windows) hoặc HFS + ở chế độ phân biệt chữ hoa chữ thường và có hai tệp "foobar" và "FOOBAR", thì Git sẽ thấy hai tệp khác biệt nhưng hệ thống tệp sẽ chỉ thấy một tệp, điều này sẽ gây ra tất cả các loại vấn đề. Git sẽ kiểm tra, chẳng hạn như, "FOOBAR", và sau đó kiểm tra "foobar", hệ thống tệp coi như đơn giản là thay thế nội dung của "FOOBAR" nhưng vẫn để nguyên. Bây giờ với Git, có vẻ như "FOOBAR" đã được thay thế bằng nội dung của "foobar" và "foobar" đã biến mất.

Có hai biểu hiện khác nhau của vấn đề cơ bản này. Một là khi kho lưu trữ của bạn thực sự chứa hai tệp chỉ khác nhau về trường hợp. Trong trường hợp này, bạn cần làm việc trên hệ thống tệp phân biệt chữ hoa chữ thường hoặc bạn sẽ cần chỉnh sửa kho lưu trữ để đảm bảo rằng không có xung đột nào xảy ra; một hệ thống tệp không phân biệt chữ hoa chữ thường không thể lưu trữ nội dung của kho lưu trữ này.

Một trường hợp khác mà bạn có thể giải quyết là khi việc đổi tên xảy ra sẽ thay đổi trường hợp của tệp. Ví dụ: giả sử kho lưu trữ Git có đổi tên từ "EXAMPLE" thành "example". Trước khi Git kiểm tra phiên bản mới, nó sẽ thử và kiểm tra để đảm bảo rằng nó không ghi đè lên một số tệp hiện có mà bạn có trên đĩa của mình. Vì nó nghĩ rằng "example" là một tên tệp mới, nó sẽ hỏi hệ thống tệp nếu nó tồn tại và hệ thống tệp sẽ nhìn thấy "EXAMPLE" và nói có, vì vậy Git sẽ từ chối kiểm tra phiên bản mới vì nó cho rằng nó sẽ bị ghi đè các tệp chưa được kiểm tra. Trong trường hợp này, nếu bạn không có thay đổi cục bộ nào mà bạn quan tâm, đơn giảngit reset --hard <revision-to-checkout>nói chung sẽ đủ để giúp bạn vượt qua vấn đề và đến với bản sửa đổi mới. Chỉ cần thử và nhớ đừng đổi tên tệp thành những tên khác chỉ khác nhau trong trường hợp bạn đang sử dụng hệ thống tệp không phân biệt chữ hoa chữ thường, vì nó sẽ gây ra các vấn đề như thế này.


14

Để biết thêm chi tiết về bài đăng của @Brian Campbell (vì cài đặt lại cứng cũng không hoạt động), tôi muốn chỉ ra một trường hợp cạnh đang ngăn cản tôi.

Tôi đã chuyển một tệp OldFilesang một thư mục khác và đổi tên nó NewFile. Sau đó, tôi gắn cờ tệp là assume-unchanged.

Điều này đã ngăn tôi chuyển đổi chi nhánh và không có kho để lưu hoặc cam kết đẩy. Vấn đề là tôi đã không thực hiện thay đổi tệp này bằng một tên mới trước khi đặt assume-unchangedcờ. Vì vậy, tôi đặt nó trở lại no-assume-unchanged, cam kết nó, sau đó đặt nó trở lại assume-unchangedvà tôi có thể chuyển đổi chi nhánh một lần nữa.


1
Câu trả lời này đã đưa tôi đi đúng hướng, cảm ơn. Tôi đã sử dụng "git ls-files -v | grep '^ [[: low:]]' | awk '{print $ 2}' | xargs git update-index --no-giả định-không thay đổi" để đặt lại cờ giả định không thay đổi , sau đó tôi đã có thể đặt lại --hard mà không có lỗi.
ocroquette

Tôi nghĩ rằng điều này cũng áp dụng cho bất kỳ tệp nào được đánh dấu 'giả sử không thay đổi', tôi đã gặp vấn đề tương tự khi bỏ qua các thay đổi đối với tệp cục bộ có tên ban đầu. Nhận xét của bạn nhắc nhở tôi rằng tôi đã đánh dấu tệp đó, cảm ơn!
Jake_

5
Tôi có cùng một vấn đề. Về cơ bản "giả sử không thay đổi" là một tính năng xấu. Một khi bạn sử dụng nó, nó rất khó để kiểm tra các chi nhánh khác. Ngay cả khi bạn sử dụng checkout -f, nó sẽ bị lỗi.
John Henckel

13

Nói chung, điều này có nghĩa là bạn có những thay đổi trong các tệp cục bộ chưa được cam kết với kho lưu trữ cục bộ của bạn. Bạn cũng có thể xem câu hỏi stackoverflow này để biết thêm một chút chi tiết.


11
Từ câu hỏi: "Tôi chưa thực hiện bất kỳ thay đổi cục bộ nào ..."
Charles Wood

Đó là một lỗi git hoặc đó là lỗi kho lưu trữ git.
Warren P

11

Tôi đã gặp vấn đề tương tự (Windows 10): Tôi đã bật branchAvà muốn truy cập master. Tôi đã có một số thay đổi không giới hạn vì vậy đầu tiên tôi git stashsau đó git checkout -f masternhưng tôi vẫn nhận được Entry 'fileName' not uptodate. Cannot merge.

git status không hiển thị bất cứ điều gì để cam kết.

Cuối cùng, tôi chỉ xóa tệp theo cách thủ công và tôi có thể đi đến nhánh khác (tất nhiên là đã làm cho tệp của tôi quay lại) vì vậy tôi đoán đã có lỗi trong git ở đâu đó.


1
Đây là giải pháp duy nhất cho câu hỏi này phù hợp với tôi. Tôi đã gặp lỗi với .gitignoretệp! Mặc dù tôi đã không thực hiện bất kỳ thay đổi nào đối với nó, và git sẽ không cho phép tôi "lưu trữ" nó (vì không có thay đổi cục bộ nào, duh!). Vì vậy, tôi đã di chuyển .gitignoretệp ra bên ngoài kho lưu trữ (như một loại "sao lưu") và sau đó thực hiện một git reset --hard, "cố định" kho lưu trữ thành trạng thái khỏe mạnh.
Masked Man

git statuscho tôi thấy tệp nào đã được thay đổi và gợi ý rằng tôi có thể sử dụng git restore myFilethay vì xóa nó, cách này đã hoạt động.
Noumenon

7

Nó cũng có thể là một vấn đề với quyền tệp. Git cũng đang tạo phiên bản cho chúng, trừ khi cấu hình nói khác. Chỉ thêm câu trả lời này cho những người hầu như có nhưng không phải vấn đề tương tự.


5

Đáng thử:

Bạn có thể đặt, chỉ cho bản cập nhật này, đặt thông số cấu hìnhcore.trustctime thành false không?

core.trustctime

Nếu sai, sự khác biệt về thời gian giữa chỉ mục và bản sao làm việc sẽ bị bỏ qua; hữu ích khi thời gian thay đổi inode thường xuyên được sửa đổi bởi thứ gì đó bên ngoài Git (trình thu thập thông tin hệ thống tệp và một số hệ thống sao lưu).


2
Rất vui, điều này thực sự hiệu quả với tôi khi tôi thấy thông báo lỗi ở trên khi chạy "git reset --merge". Khi tôi đặt paramater này thành false, nó đã loại bỏ được lỗi.
DemitryT

1
Đã làm việc cho tôi khi kiểm tra xung đột với một nhánh khác bằng cách sử dụng "git merge <feature> --no-ff --no-commit" sau đó hoàn nguyên bằng "git merge --abort". Xcode là "thứ gì đó bên ngoài Git" trong trường hợp này. Cảm ơn gần 10 năm sau!
Ralfonso

@Ralfonso Gần mười năm sau, bạn được chào đón nhiều nhất :)
VonC

2

Thêm câu trả lời của tôi vì không ai trong số những người khác đề cập đến điều này. Trong trường hợp của tôi, điều này xảy ra sau khi tôi thêm các tệp mới vào chỉ mục với -Ncờ, vì vậy chỉ cần thêm chúng vào chỉ mục mà không thêm nội dung của chúng. Trong trạng thái này, thực hiện dẫn git stashđến lỗi này.


0

Tôi đã gặp lỗi tương tự, sau một tình huống git statuscho biết new file: foo.cpptệp không được thêm vào khu vực tổ chức. tức là dưới tiêu đề "Thay đổi không được tổ chức cho cam kết". Rất kỳ lạ, điều này thường không xảy ra.

Giải pháp:, git add foo.cppvà sau đó git stashhoạt động trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.