Git pull: error: Entri foo tidak uptodate. Tidak dapat digabungkan

87

Saya mencoba memperbarui repo saya dari cabang jarak jauh dan terus mendapatkan kesalahan ini ketika saya melakukan "git pull". Saya belum membuat perubahan lokal apa pun, dan bahkan jika saya memilikinya, saya tidak perlu menyimpannya.

Saya sudah mencoba:

git reset --hard

dan saya mendapatkan masalah yang sama

Satu-satunya hal yang tampaknya berhasil adalah menghapus file yang melanggar dan mencoba git pull lagi.

Saya juga sudah mencoba git stashdiikuti dengan a git pull. Tidak pergi.

edit: menggunakan PortableGit-1.6.4-preview20090729 sehingga setiap bug sebelumnya dengan kesalahan palsu harus diperbaiki.

yuit
sumber
Lihat apakah penjelasan di git.or.cz/gitwiki/GitFaq membantu.
Jakub Narębski
Ditto " Satu-satunya hal yang tampaknya berhasil adalah menghapus file yang melanggar dan mencoba git pull lagi. ". Bagi saya, setidaknya satu file tidak ada di git; itu .gitignored oleh aturan wildcard. Tidak yakin mengapa mereka pemblokir.
ruffin
3
Saya dapat menyelesaikan ini dengan menjalankan git rm --cached learned/tests/temp_funcs.py- Karena saya tetap ingin file tetap dalam daftar File yang Tidak Dilacak , git rm --cacheddalam kasus ini tidak diblokir saya.
Jauh
1
Ini terjadi pada saya selama penggabungan yang saya inginkan --abort. Tidak ada solusi yang diusulkan yang memungkinkan saya untuk membatalkan, kecuali untuk menghapus file yang melanggar.
Trevor Reid

Jawaban:

56

Ada beberapa cara untuk memperbaikinya, tetapi saya telah menemukan git simpanan berfungsi baik untuk saya. Ini sementara menempatkan perubahan lokal Anda ke tempat lain. Kemudian Anda dapat menarik, untuk mengambil perubahan terbaru. Dan kemudian Anda bisa mendapatkan perubahan lokal Anda kembali.

Seperti ini:

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

$ git stash
$ git pull
$ git stash pop
manat
sumber
21
Dari pertanyaan awal: "Saya juga mencoba" git stash "diikuti dengan" git pull ". Tidak boleh."
Charles Wood
Tidak berhasil untuk saya - dalam kasus saya, saya harus git rm --cached, komentar lengkap: stackoverflow.com/questions/1248029/…
Jauh
39

Ini mungkin terjadi jika Anda memperbarui indeks untuk mengabaikan file tertentu:

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

dan kemudian misalnya memeriksa beberapa cabang lain:

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

Memaksa penyegaran indeks memperbaiki masalah:

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

Diikuti oleh:

git reset --hard 

Dan kemudian semuanya harus kembali normal.

habitat
sumber
2
Saya dapat menyelesaikan ini dengan menjalankan git rm --cached learned/tests/temp_funcs.py- Karena saya tetap ingin file tetap dalam daftar File yang Tidak Dilacak , git rm --cacheddalam kasus ini tidak diblokir saya.
Jauh
3
Itu git update-index --really-refreshadalah bagian yang hilang! Kerja bagus, ini sulit ditemukan
Bernardo Dal Corno
29

Masalah semacam ini sering kali disebabkan oleh mencoba menarik dari repositori yang memiliki dua nama file yang hanya berbeda dalam kasus. Jika Anda menggunakan FAT, NTFS dalam mode case-insensitive (pada dasarnya, kapan pun itu digunakan pada Windows), atau HFS + dalam mode case-insensitive, dan memiliki dua file "foobar" dan "FOOBAR", maka Git akan melihat dua yang berbeda file, tetapi sistem file hanya akan melihat satu file, yang akan menyebabkan berbagai macam masalah. Git akan melakukan checkout, katakanlah, "FOOBAR", dan kemudian "foobar", yang dilihat oleh filesystem hanya dengan mengganti konten "FOOBAR" tetapi membiarkannya di tempatnya. Sekarang bagi Git, tampaknya "FOOBAR" telah diganti dengan konten "foobar", dan "foobar" telah hilang.

Ada dua manifestasi berbeda dari masalah dasar ini. Salah satunya adalah ketika repositori Anda sebenarnya berisi dua file yang hanya berbeda dalam kasus. Dalam kasus ini, Anda perlu bekerja pada sistem file case-sensitive, atau Anda perlu mengedit repositori untuk memastikan bahwa tidak ada benturan semacam ini yang terjadi; sistem file case-insensitive tidak dapat menyimpan konten repositori ini.

Kasus lain yang dapat Anda atasi adalah saat terjadi penggantian nama yang mengubah kasus file. Misalnya, repositori Git berisi penggantian nama dari "EXAMPLE" menjadi "example". Sebelum Git memeriksa versi baru, Git akan mencoba dan memeriksa untuk memastikan itu tidak menimpa beberapa file yang ada yang Anda miliki di disk Anda. Karena ia mengira bahwa "contoh" adalah nama file baru, ia akan menanyakan sistem berkas apakah itu ada, dan sistem berkas akan melihat "CONTOH" dan berkata ya, jadi Git akan menolak untuk memeriksa versi baru karena menurutnya itu akan menimpa file yang tidak terlacak. Dalam hal ini, jika Anda tidak memiliki perubahan lokal yang Anda pedulikan, sederhanagit reset --hard <revision-to-checkout>umumnya akan cukup untuk membuat Anda melewati masalah dan ke revisi baru. Coba dan ingat untuk tidak mengganti nama file ke nama lain yang berbeda hanya jika Anda menggunakan sistem file yang tidak peka huruf besar / kecil, karena akan menyebabkan masalah seperti ini.

Brian Campbell
sumber
14

Untuk uraian lebih lanjut tentang posting @Brian Campbell (karena reset keras juga tidak berhasil) saya ingin menunjukkan kasus tepi yang menghentikan saya.

Saya telah memindahkan file OldFileke folder lain dan mengganti namanya NewFile. Saya kemudian menandai file tersebut sebagai assume-unchanged.

Ini mencegah saya untuk berpindah cabang dan tidak ada simpanan untuk disimpan atau berkomitmen untuk didorong. Masalahnya adalah saya tidak melakukan perubahan file ini dengan nama baru sebelum menyetel assume-unchangedbendera. Jadi saya setel kembali ke no-assume-unchanged, lakukan, lalu setel kembali ke assume-unchangeddan saya bisa beralih cabang lagi.

Agresor
sumber
1
Jawaban ini menempatkan saya di jalur yang benar, terima kasih. Saya menggunakan "git ls-files -v | grep '^ [[: lower:]]' | awk '{print $ 2}' | xargs git update-index --no-asumsi-unchanged" untuk menyetel ulang tanda anggap-tidak berubah , maka saya dapat mengatur ulang --hard tanpa kesalahan.
ocroquette
Saya pikir ini juga berlaku untuk file apa pun yang ditandai 'asumsikan-tidak berubah', saya memiliki masalah yang sama karena mengabaikan perubahan pada file lokal yang memiliki nama aslinya. Komentar Anda mengingatkan saya bahwa saya telah menandai file itu, terima kasih!
Jake_
5
Saya memiliki masalah yang sama. Pada dasarnya "menganggap tidak berubah" adalah fitur jahat. Setelah Anda menggunakannya, akan SANGAT sulit untuk melakukan checkout di cabang lain. Bahkan jika Anda menggunakannya checkout -f, itu akan gagal.
John Henckel
13

Secara umum, ini berarti Anda memiliki perubahan dalam file lokal Anda yang belum dikomit ke repositori lokal Anda. Anda juga dapat melihat pertanyaan stackoverflow ini untuk sedikit lebih detail.

kodeinkarnasi
sumber
11
Dari pertanyaan: "Saya belum membuat perubahan lokal apa pun ..."
Charles Wood
Ini adalah bug git atau kerusakan repositori git.
Warren P
12

Saya melihat masalah serupa (Windows 10): Saya aktif branchAdan ingin pergi master. Saya memiliki beberapa perubahan tidak terikat jadi pertama saya git stashkemudian git checkout -f mastertapi saya masih mendapatkan Entry 'fileName' not uptodate. Cannot merge.

git status tidak menunjukkan apa pun untuk dilakukan.

Akhirnya saya menghapus file secara manual dan saya bisa pergi ke cabang lain (yang tentu saja membuat file saya kembali) jadi saya rasa ada bug di dalam git di suatu tempat.

pengguna276648
sumber
1
Ini adalah satu-satunya solusi untuk pertanyaan ini yang berhasil untuk saya. Saya mendapatkan kesalahan dengan .gitignorefile! Meskipun saya belum membuat perubahan apa pun padanya, dan git tidak mengizinkan saya untuk "menyimpannya" (karena tidak ada perubahan lokal, ya!). Jadi saya memindahkan .gitignorefile ke luar repositori (sebagai semacam "backup") dan kemudian melakukan git reset --hard, yang "memperbaiki" repositori ke dalam keadaan waras.
Masked Man
git statusmenunjukkan kepada saya file mana yang diubah dan mengisyaratkan bahwa saya dapat menggunakan git restore myFilealih-alih menghapusnya, yang berfungsi.
Noumenon
7

Mungkin juga ada masalah dengan izin file. Git juga membuat versinya, kecuali config mengatakan sebaliknya. Hanya menambahkan jawaban ini untuk orang yang hampir tetapi tidak memiliki masalah suka.

Drachenfels
sumber
5

Patut dicoba:

Bisakah Anda menyetel, hanya untuk pembaruan ini, menyetel parameter configcore.trustctime ke false?

core.trustctime

Jika salah, perbedaan waktu antara indeks dan copy pekerjaan diabaikan; berguna ketika waktu perubahan inode secara teratur diubah oleh sesuatu di luar Git (crawler sistem file dan beberapa sistem cadangan).

VonC
sumber
2
nice find, ini benar-benar berhasil untuk saya ketika saya melihat pesan kesalahan di atas ketika menjalankan "git reset --merge". Saat saya menyetel parameter ini ke false, kesalahan tersebut telah dihapus.
DemitryT
1
Bekerja untuk saya saat memeriksa konflik dengan cabang lain menggunakan "git merge <feature> --no-ff --no-commit" lalu mengembalikan dengan "git merge --abort". Xcode adalah "sesuatu di luar Git" dalam kasus ini. Terima kasih hampir 10 tahun kemudian!
Ralfonso
@Ralfonso Hampir sepuluh tahun kemudian, Anda sangat disambut :)
VonC
2

Menambahkan jawaban saya karena tidak ada yang lain yang menyebutkan ini. Dalam kasus saya ini terjadi setelah saya menambahkan file baru ke dalam indeks dengan -Nbendera, jadi tambahkan saja ke indeks tanpa menambahkan isinya. Dalam keadaan ini, melakukan git stashmenghasilkan kesalahan ini.

Aviad P.
sumber
0

Saya mengalami kesalahan yang sama, setelah situasi di mana git statusdikatakan new file: foo.cppuntuk file tidak ditambahkan ke area pementasan. yaitu di bawah tajuk "Perubahan tidak dipentaskan untuk berkomitmen". Sangat aneh, ini biasanya tidak terjadi.

Solusi:, git add foo.cpplalu git stashbekerja lagi.

David Faure
sumber
0

Saya mencoba melakukan git merge --abort. Perintah git restore your_file telah memperbaiki masalah saya

Youness Marhrani
sumber