git pull error: error: remote ref berada di tetapi diharapkan

227

Pesan lengkap:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)
Sanjeev Kumar Dangi
sumber
3
Rupanya seseorang menulis ulang riwayat repositori oleh git push --force. Coba lari git pull --force.
xaizek
1
Memberikan kesalahan yang sama dengan git push --force
Sanjeev Kumar Dangi
5
Jawaban untuk pertanyaan ini telah menyelesaikan kesalahan ini - stackoverflow.com/questions/3046436/...
Sanjeev Kumar Dangi

Jawaban:

225

Jika Anda menjalankan git di bawah sistem file yang tidak peka huruf besar-kecil (Windows atau OS X) ini akan terjadi jika ada dua cabang dengan nama yang sama tetapi dengan huruf besar yang berbeda, misalnya user_model_changesdan User_model_changeskarena kedua cabang jarak jauh akan cocok dengan referensi pelacakan yang sama .

Hapus cabang jarak jauh yang salah (Anda tidak harus memiliki cabang yang berbeda hanya berdasarkan kasus) dan kemudian git remote prune origindan semuanya harus bekerja

krijesta
sumber
Terima kasih atas jawabannya. Ini bukan masalah dengan kesalahan ini. Saya sudah menemukan solusi untuk masalah ini dan memposting komentar di bawah pertanyaan.
Sanjeev Kumar Dangi
2
Membantu Mac OS X juga (sistem file default tidak sensitif huruf besar).
Tammo Freese
12
ya, masalah case-insensitive pada Windows menyebabkan masalah. Saya memperbaikinya dengan secara manual menghapus ref di .git\refs\remotes\originfolder dan kemudian git pulllagi.
Roy Ling
dan bagi mereka yang tidak tahu di mana folder .git akan .. itu akan dibuat di dalam folder Project / workspace Anda: D
kumar
1
Ini adalah bug git. (Setidaknya pesan kesalahan salah). Saya harap seseorang dapat melaporkan bug ini ke proyek git. Tampaknya sulit bagi saya untuk melaporkan bug ke proyek git. github.com/git/git
pria perunggu
190

Perbaikan Permanen

git update-ref -d menyelesaikan contoh kesalahan saya ini, mis

git update-ref -d refs/remotes/origin/user

Perhatikan bahwa ini tidak memengaruhi remote.

Dalam kasus saya, yang berikutnya git fetchmengambil cabang itu lagi, dan mengikuti git mengambil / menarik tidak lagi memberikan kesalahan "ref remote ada di tetapi diharapkan".

Jika itu tidak berhasil, perbaikan sementara:

Perhatikan juga bahwa jika Anda tidak peduli dengan cabang yang dimaksud (mis. Anda hanya ingin memperbarui master, bukan asal / pengguna), git pullsolusinya adalah mengambil kemudian menggabungkan cabang tertentu yang Anda pedulikan, misalnya

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master
JDiMatteo
sumber
Ini harus menjadi solusi yang diterima karena memecahkan masalah tanpa menyentuh jarak jauh.
Cerno
52

Hapus saja folder dan file di bawah \.git\refs\remotes\origin. Berhasil, saat Anda tidak memiliki perubahan yang tidak dicopot.

Prakash Saravanan
sumber
Ini mungkin tidak berfungsi jika referensi jarak jauh Anda 'penuh' dan karena itu tidak ada dalam referensi / remote / ** @ solusi JDiMatteo seharusnya masih bekerja
Alexander Bird
2
Bekerja untukku. Terima kasih banyak!
Swapnil Patwa
Bekerja seperti pesona! Terima kasih!
Anurag S Sharma
43

Saya menjalankan ini untuk memecahkan masalah:

git gc --prune=now
elad perak
sumber
2
Ini memperbaiki masalah bagi saya.
Aamir Rizwan
2
untuk saya juga ..-- :)
Aravind R Pillai
3
Terima kasih, perbaikan solusi ini untuk saya. Bisakah Anda jelaskan lebih banyak tentang solusi yang Anda berikan.
Aamol
1
pada dasarnya itu hanya alat pengumpul sampah git sehingga menghapus apa pun yang tidak disinkronkan tetapi ada di komputer lokal untuk keperluan caching
elad silver
42

Gunakan dua perintah di bawah ini satu per satu.

git gc --prune=now

git remote prune origin

Ini akan menyelesaikan masalah Anda.

Narender Gusain
sumber
1
Ini bekerja untuk saya tetapi ketika saya melakukan git pull yang lain masalah ini muncul lagi
Jojin
@ Jojin Sama seperti Anda. Dan saya akhirnya memilih cara yang disediakan Prakash Saravanan
xi.lin
1
Ini harus dinilai lebih tinggi daripada saran untuk mengedit file git :)
Mike Wise
hanya solusi ini yang bekerja untuk saya. Terima kasih!
insaineyesay
12

Saya harus menghapus cabang dari baris perintah di:

.git\refs\remotes\{my remote}\{**my branch**}

dan kemudian secara manual melakukan:

git pull [remote_name] [branch_name]

Saya bisa melakukan perubahan.

Catatan: Saya menggunakan SourceTree dan tidak dapat melakukan tarikan.

jogam5
sumber
Akhirnya saya mengganti nama remote saya: Saya punya dua remote "Bitbucket / staging" dan "bitbucket / staging" dalam sejarah SourceTree saya tetapi hanya "Bitbucket" yang muncul di baris perintah ketika melakukan: git remote -v. Jadi saya mengganti nama Bitbucket menjadi bitbucket dan konflik akhirnya menghilang, semoga ini membantu sebagian besar pengguna SourceTree.
jogam5
Saya juga harus menghapus cabang .git\packed-refssebelum diperbaiki untuk saya.
Michael
6

Hard reset juga akan menyelesaikan masalah

git reset --hard origin/master
mruanova
sumber
Sudahkah Anda memilih jawaban terbaik?
mruanova
5

Langkah-langkah yang lebih jelas

  1. di terminal

    cd /.git/refs/remotes/origin
    
  2. lakukan ls, Anda akan melihat beberapa cabang dan KEPALA

  3. Hapus cabang yang menurut Anda memiliki masalah

    rm branchname
    
  4. Jika tidak berhasil, hapus semua cabang / KEPALA

    • Anda mungkin ingin menarik

Semoga berhasil sekarang.

shareef
sumber
Apakah ini pada dasarnya sama dengan git update-ref -d <branchname>?
jt000
2

Coba ini, itu berhasil untuk saya. Di dalam terminal: git remote prune origin.

Ranganatha GV
sumber
2

Sayangnya, perintah GIT seperti prune dan reset atau push tidak bekerja untuk saya. Prune bekerja sekali dan kemudian masalah kembali.

Solusi permanen yang berhasil bagi saya adalah mengedit file git secara manual. Cukup buka folder .git proyek dan kemudian buka file paket-ref dalam editor teks seperti Notepad ++. Kemudian arahkan ke baris dengan cabang yang gagal dan perbarui panduannya ke yang diharapkan.

Jika Anda memiliki pesan seperti:

"error: tidak dapat mengunci ref 'ref / remote / origin / feature / branch_xxx': ada di 425ea23facf96f51f412441f41ad488fc098cf23 tetapi diharapkan 383de86fed394ff1a1aeefc4a522d886adcecd79"

kemudian pada file cari baris dengan 'ref / remote / origin / feature / branch_xxx'. Penunjuk jalan akan menjadi yang diharapkan (ke-2) - 383de86fed394ff1a1aeefc4a522d886adcecd79. Anda perlu mengubahnya ke yang asli (pertama) - 425ea23facf96f51f412441f41ad488fc098cf23.

Ulangi untuk cabang gagal lainnya dan Anda akan baik untuk melanjutkan. Kadang-kadang setelah mengambil ulang saya harus mengulangi untuk cabang yang sama yang sudah saya 'perbaiki' sebelumnya. Saat mengambil ulang panduan pembaruan GIT dan memberi Anda yang terbaru.

Bagaimanapun masalahnya bukan penghenti acara. Daftar cabang diperbarui. Ini lebih merupakan peringatan.

Andrei S.
sumber
1

git untuk-masing-masing ref --format = 'delete% (refname)' ref / original | git pembaruan-ref --stdin git reflog kedaluwarsa - expire = sekarang - semua git gc --prune = sekarang

Luciano
sumber
0

Kasus yang sama di sini, tetapi tidak ada tentang komentar yang diposting itu benar dalam kasus saya, saya hanya memiliki satu cabang (master) dan hanya menggunakan sistem file Unix, kesalahan ini terjadi secara acak ketika saya menjalankan git fetch --progress --probe asal dan cabang berada di depan atau 'asal / master'. Tidak ada yang bisa melakukan, hanya 1 pengguna yang bisa melakukan push.

CATATAN: Saya memiliki submodule dalam repositori acme, dan acme memiliki perubahan submodule baru (komit baru), saya harus terlebih dahulu melakukan pembaruan submodule dengan pembaruan submodule git.

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

Untuk mengatasi masalah ini (dalam kasus saya) jalankan saja git push terlebih dahulu jika cabang Anda berada di depan.

Tecnocat
sumber
3
Jawaban Anda di sini hanya berkaitan dengan fakta bahwa repositori lokal Anda berada di depan asalnya setelah komit baru. Ini adalah keadaan alami dari operasi komit git lokal dan tidak berhubungan dengan pertanyaan awal.
davient
0

Saya tahu ini sudah tua, tetapi saya memiliki perbaikan sendiri. Karena saya menggunakan sumber pohon, kesalahan ini terjadi karena seseorang membuat cabang baru. Pohon sumber bingung tentang ini. Setelah saya menekan tombol "Refresh" di samping "remote branch to pull" combobox, nampaknya sourcetree telah memperbarui daftar cabang, dan sekarang saya dapat menarik dengan sukses.

Chen Li Yong
sumber
0

Saya memiliki masalah yang sama yang disebabkan karena saya pindah ke komit yang lebih tua meskipun saya sudah mendorong ke cabang terpencil.

Saya menyelesaikannya dengan menghapus cabang lokal saya kemudian memeriksa cabang asal git checkout origin/my_branchdan kemudian mengeksekusigit checkout my_branch

Hitam
sumber
-1

Setelah mencari terus-menerus, ini adalah solusi yang bekerja untuk saya yang memerlukan unsetting / menghapus Hulu

git branch --unset-upstream
Sugoi Reed
sumber