Git Pull Tidak Mungkin, File Tidak Digabung

90

Saya telah membaca semua pertanyaan serupa tentang ini; tampaknya tidak satu pun dari yang berikut ini berhasil:

Delete offending files
git reset --hard HEAD
git stash
git pull

Hampir setiap kombinasi, menyembunyikan perubahan dan menarik dari repositori, menghasilkan file yang tidak dapat digabung. Saya ingin membuang semua perubahan lokal dan hanya menggunakan remote, tetapi saya tidak dapat mengkloning lagi (bandwidth dan batasan penggunaan internet dengan pengembang mencoba melakukan ini). Bagaimana saya melakukan ini?

Baru saja mencoba:

git stash
git pull

Juga tidak berhasil.

Info lebih lanjut

Ada satu komit lokal, dan upstream juga memiliki komit. Saya telah mencobanya git pull --rebasetetapi masih tidak berfungsi dengan benar ... Itu memberi saya kesalahan - "keluar karena konflik yang belum terselesaikan". Jika saya melakukannya git stash, git reset --hard HEAD, git pull --rebase, saya mendapatkan pesan kesalahan "penarikan tidak mungkin, perubahan tidak digabungkan ..."

Christian Stewart
sumber

Jawaban:

202

Katakanlah remote origindan cabangnya master, dan katakan Anda sudah mastercheck out, mungkin mencoba yang berikut ini:

git fetch origin
git reset --hard origin/master

Ini pada dasarnya hanya mengambil cabang saat ini dan mengarahkannya ke HEADcabang jarak jauh.

PERINGATAN : Seperti yang dinyatakan dalam komentar, ini akan membuang perubahan lokal Anda dan menimpa dengan apa pun yang ada di asalnya .

Atau Anda dapat menggunakan perintah pipa untuk melakukan hal yang pada dasarnya sama:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

EDIT: Saya ingin menjelaskan secara singkat mengapa ini berhasil.

The .gitfolder dapat menahan komit untuk sejumlah repositori. Karena hash komit sebenarnya adalah metode verifikasi untuk konten komit, dan bukan hanya nilai yang dihasilkan secara acak, ini digunakan untuk mencocokkan set komit antar repositori.

Cabang hanyalah penunjuk bernama ke hash yang diberikan. Inilah contoh set:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Masing-masing file ini berisi hash yang mengarah ke komit:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Ini semua untuk mekanisme penyimpanan git internal, dan bekerja secara independen dari direktori kerja . Dengan melakukan hal berikut:

git reset --hard origin/master

git akan mengarahkan cabang saat ini pada nilai hash yang sama dengan yang ditunjuk oleh origin / master. Kemudian secara paksa mengubah direktori kerja agar sesuai dengan struktur file / konten pada hash itu.

Untuk melihat ini di tempat kerja, lanjutkan dan coba yang berikut ini:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD
Trevor Norris
sumber
2
Dari suntingan baru yang disetujui menambahkan peringatan besar-besaran di awal, seperti menunjukkan bahwa itu sudah disebutkan: "Kemudian [git] secara paksa mengubah direktori kerja agar sesuai dengan struktur file / konten pada hash itu." Tapi tebak itu belum cukup eksplisit.
Trevor Norris
6

Diselesaikan, menggunakan set perintah berikut:

git reset --hard
git pull --rebase
git rebase --skip
git pull

Triknya adalah melakukan rebase terhadap perubahan ... Kami mengalami masalah dalam melakukan rebasing satu komit yang remeh, jadi kami melewatkannya menggunakan git rebase --skip (setelah menyalin file).

Christian Stewart
sumber
3

Jika Anda pernah mendapatkan masalah ini setelah menjalankan a git fetchdan kemudian git tidak mengizinkan Anda untuk menjalankan git pullkarena konflik penggabungan ( baik file yang dimodifikasi / tidak digabungkan , dan untuk membuat Anda lebih frustrasi, itu tidak akan menampilkan penanda konflik apa pun di file karena belum digabungkan). Jika Anda tidak ingin kehilangan pekerjaan Anda, Anda dapat melakukan hal berikut.

mementaskan file.

$ git add filename

lalu simpan perubahan lokal.

$ git stash

tarik dan perbarui direktori kerja Anda

$ git pull

kembalikan file lokal Anda yang dimodifikasi (git akan secara otomatis bergabung jika bisa, jika tidak menyelesaikannya)

$ git stash pop

Semoga bisa membantu.

Nimeshka Srimal
sumber
2

Ada solusi meskipun Anda tidak ingin menghapus perubahan lokal Anda. Perbaiki saja file yang tidak digabungkan (dengan git addatau git remove). Lalu lakukan git pull.

Preeti A.
sumber
1

Dengan asumsi Anda ingin membuang perubahan apa pun yang Anda miliki, periksa dulu outputnya git status. Untuk file apa pun yang bertuliskan "unmerged" di sebelahnya, jalankan git add <unmerged file>. Kemudian tindak lanjuti dengan git reset --hard. Itu akan menyingkirkan semua perubahan lokal kecuali untuk file yang tidak terlacak.

Ryan Stewart
sumber
Oh iya. Mungkin tidak tertulis "tidak digabungkan". Bisa juga dikatakan "keduanya diubah" atau mungkin satu atau dua hal lainnya. Apa outputnya git status?
Ryan Stewart
Setelah memposting ini, saya memberi tahu anggota tim untuk mencoba git rebase --abortdan git pull --rebasesesuai saran oleh git
Christian Stewart
1

Saya diselesaikan dengan git hapus file yang tidak digabungkan secara lokal.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Ketika saya mengirim git commit sesudahnya:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Chetabahana
sumber
0

Jawaban Ryan Stewart hampir sampai. Dalam kasus di mana Anda sebenarnya tidak ingin menghapus perubahan lokal Anda, ada alur kerja yang dapat Anda gunakan untuk menggabungkan:

  • Lari git status. Ini akan memberi Anda daftar file yang tidak digabungkan.
  • Gabungkan mereka (dengan tangan, dll.)
  • Lari git commit

Git hanya akan melakukan penggabungan menjadi komit baru. (Dalam kasus saya, saya memiliki file tambahan pada disk, yang tidak disatukan ke dalam komit itu.)

Git kemudian menganggap penggabungan berhasil dan memungkinkan Anda untuk melanjutkan.

nightblade9
sumber