Mengapa git mengatakan, "Tarik tidak mungkin karena Anda memiliki file yang tidak di-unmerged"?

195

Ketika saya mencoba menarik direktori proyek saya di terminal, saya melihat kesalahan berikut:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Mengapa git mengatakan "Pull is not possible because you have unmerged files", dan bagaimana saya bisa menyelesaikannya?

Harsukh Makwana
sumber
1
Dalam kasus saya, saya baru saja menggunakan perintah ini "git add." lalu "git commit -m" Test "dan pada akhirnya" git push ". Kesalahan dihapus
Akhzar Nazir
Anda hanya perlu menambahkan "$ git add <file" "... untuk memperbarui apa yang akan dikomit atau mengembalikan (untuk membuang perubahan dalam direktori kerja) kemudian komit" $ git commit ", lalu" $ git push "untuk menyimpulkan penggabungan.
find_X
Dalam hal ini membantu: Saya perhatikan bahwa hanya melakukan "git add." maka melakukan tidak berhasil. Saya harus menambahkan file individual dengan nama, kemudian komit dan tarik / dorong.
ouonomos

Jawaban:

212

Apa yang terjadi saat ini adalah, bahwa Anda memiliki set file tertentu, yang telah Anda coba gabungkan sebelumnya, tetapi mereka memunculkan konflik gabungan. Idealnya, jika seseorang mendapat konflik gabungan, ia harus menyelesaikannya secara manual, dan melakukan perubahan menggunakan git add file.name && git commit -m "removed merge conflicts". Sekarang, pengguna lain telah memperbarui file yang dipermasalahkan di repositori-nya, dan telah mendorong perubahannya ke repo hulu umum.

Kebetulan, konflik gabungan Anda dari (mungkin) komit terakhir tidak terselesaikan, jadi file Anda tidak digabung, dan karenanya flag U( unmerged) untuk file. Jadi sekarang, ketika Anda melakukan git pull, git memunculkan kesalahan, karena Anda memiliki beberapa versi file, yang tidak diselesaikan dengan benar.

Untuk menyelesaikan ini, Anda harus menyelesaikan konflik gabungan yang dipertanyakan, dan menambahkan dan melakukan perubahan, sebelum Anda dapat melakukan a git pull.

Reproduksi sampel dan resolusi masalah:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Pertama, mari kita buat struktur repositori

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Sekarang kita berada di repo_clone, dan jika Anda melakukan git pull, itu akan memunculkan konflik

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Jika kita mengabaikan konflik di klon, dan membuat lebih banyak komitmen dalam repo asli sekarang,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Dan kemudian kita lakukan git pull, kita dapatkan

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Perhatikan bahwa filesaat ini berada dalam keadaan tidak terendam dan jika kita melakukan git status, kita dapat dengan jelas melihat hal yang sama:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Jadi, untuk menyelesaikan ini, pertama-tama kita harus menyelesaikan konflik gabungan yang kita abaikan sebelumnya

repo_clone $ vi file

dan atur isinya ke

text2
text1
text1

lalu tambahkan dan komit perubahan

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
mu 無
sumber
1
Agar lengkap, saya akan menambahkan jawaban @ Pawan untuk menggunakan 'git mergetool' untuk menyelesaikan konflik. Langkah kedua hingga terakhir mungkin tidak terlalu praktis ("selesaikan penggabungan ... [dengan mengatur] ... isinya ke: [beberapa teks]").
tak terbantahkan
Atau, Anda dapat bergabung menggunakan saran @ user261. Either way, saya pikir menambahkan langkah tentang cara menggabungkan dalam arti praktis akan melengkapi jawaban ini.
tidak dapat disangkal dari
3
Jawaban ini berfungsi dengan sangat baik ketika Anda memiliki konflik sederhana untuk diperbaiki pada satu file. Misalnya, satu atau dua baris kode yang berbeda. Jika Anda memiliki banyak file yang telah banyak dimodifikasi, ini adalah perbaikan yang sulit. Tapi itu membawa pulang gagasan bahwa dengan Git Anda harus sering berkomitmen untuk menghindari konflik yang sulit.
Vaughn D. Taylor
46

Anda mencoba menambahkan satu lagi komitmen baru ke cabang lokal Anda sementara direktori kerja Anda tidak bersih. Alhasil, Git menolak melakukan tarikan. Pertimbangkan diagram berikut untuk memvisualisasikan skenario dengan lebih baik:

jarak jauh: A <- B <- C <- D
lokal: A <- B *
(* menunjukkan bahwa Anda memiliki beberapa file yang telah dimodifikasi tetapi tidak dikomit.)

Ada dua opsi untuk menghadapi situasi ini. Anda dapat membuang perubahan di file Anda, atau menyimpannya.

Opsi satu: Buang perubahan yang
bisa Anda gunakan git checkoutuntuk setiap file yang tidak dihapus, atau Anda dapat menggunakan git reset --hard HEADuntuk mengatur ulang semua file di cabang Anda ke HEAD. Omong-omong, KEPALA di cabang lokal Anda adalah B, tanpa tanda bintang. Jika Anda memilih opsi ini, diagram menjadi:

jarak jauh: A <- B <- C <- D
lokal: A <- B

Sekarang ketika Anda menarik, Anda dapat memajukan cabang Anda secara cepat dengan perubahan dari master. Setelah menarik, cabang Anda akan terlihat seperti master:

lokal: A <- B <- C <- D

Opsi dua: Pertahankan perubahan
Jika Anda ingin menyimpan perubahan, pertama-tama Anda ingin menyelesaikan konflik penggabungan di setiap file. Anda dapat membuka setiap file di IDE Anda dan mencari simbol-simbol berikut:

<<<<<<< KEPALA
// versi kode Anda
=======
// kode versi remote
>>>>>>>

Git memberi Anda dua versi kode. Kode yang terkandung dalam marka HEAD adalah versi dari cabang lokal Anda saat ini. Versi lainnya adalah apa yang datang dari remote. Setelah memilih versi kode (dan menghapus kode lainnya bersama dengan spidol), Anda dapat menambahkan setiap file ke area pementasan dengan mengetik git add. Langkah terakhir adalah mengkomit hasil Anda dengan mengetik git commit -m dengan pesan yang sesuai. Pada titik ini, diagram kami terlihat seperti ini:

jarak jauh: A <- B <- C <- D
lokal: A <- B <- C '

Di sini saya memberi label komit yang baru kami buat sebagai C 'karena berbeda dari komit C pada remote. Sekarang, jika Anda mencoba menarik, Anda akan mendapatkan kesalahan maju yang tidak cepat. Git tidak dapat memainkan perubahan di remote di cabang Anda, karena baik cabang Anda dan remote telah menyimpang dari leluhur yang sama melakukan B. Pada titik ini, jika Anda ingin menarik Anda bisa melakukan yang lain git merge, atau git rebasecabang Anda di remote.

Mendapatkan penguasaan Git membutuhkan kemampuan untuk memahami dan memanipulasi daftar tertaut satu arah. Saya harap penjelasan ini akan membuat Anda berpikir ke arah yang benar tentang penggunaan Git.

Tim Biegeleisen
sumber
33

Ada solusi sederhana untuk itu. Tetapi untuk itu Anda harus terlebih dahulu mempelajari yang berikut ini

vimdiff

Untuk menghapus konflik, Anda dapat menggunakan

git mergetool

Perintah di atas pada dasarnya membuka file lokal, file campuran, file jarak jauh (total 3 file), untuk setiap file yang konflik. File lokal & jarak jauh hanya untuk referensi Anda, dan dengan menggunakannya Anda dapat memilih apa yang akan disertakan (atau tidak) dalam file campuran. Dan cukup simpan dan keluar file.

Pawan Seerwani
sumber
2
Saya akan mengatakan bahwa vimdiff tidak diperlukan (Anda dapat menggunakan alat penggabung / diff pilihan Anda, seperti WinMerge, atau FileMerge bawaan OSX, dll.). Karena itu, ini adalah tambahan yang bagus untuk jawaban @ mu.
tidak dapat disangkal dari
32

Jika Anda tidak ingin menggabungkan perubahan dan masih ingin memperbarui lokal Anda maka jalankan:

git reset --hard HEAD  

Ini akan mengatur ulang lokal Anda dengan HEAD dan kemudian menarik remote Anda menggunakan git pull.

Jika Anda sudah melakukan penggabungan secara lokal (tetapi belum mendorong ke jarak jauh), dan ingin mengembalikannya juga:

git reset --hard HEAD~1 
Santosh
sumber
6

Jika Anda ingin menarik cabang jauh untuk dijalankan secara lokal (katakanlah untuk meninjau atau menguji tujuan), dan ketika $ git pullAnda mendapatkan konflik gabungan lokal:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
pengguna5245397
sumber
5

Anda memiliki beberapa file secara lokal yang perlu digabungkan sebelum Anda dapat menarik. Anda dapat checkout file dan kemudian tarik untuk menimpa file lokal Anda.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
Nick
sumber
Penggabungan menggabungkan konten dari dua file. Saat ini file lokal Anda berbeda dari yang ada di server jarak jauh. Penggabungan harus dilakukan di server jauh. Jadi, jika Anda mengatur file yang diedit dan mendorongnya, perubahan Anda akan ditambahkan ke file pada repositori. Kemudian file Anda akan disinkronkan dan Anda dapat menarik seluruh proyek dengan perubahan lain. Saya menemukan buku bantuan git sangat membantu ketika saya mulai menggunakan git. Anda dapat menemukannya di sini: git-scm.com/book/en/Getting-Started
Nick
Perhatikan bahwa saya bukan OP. "Menggabungkan file" adalah istilah yang tidak tepat. Sebenarnya, Anda menggabungkan komit, bukan file.
jub0bs
Ah ya itu benar, maaf saya. Saya mencoba memberikan jawaban sederhana
Nick
Nah, jika Anda memiliki konflik saat menggabungkan komit, maka ya, Anda akan memiliki file yang bertentangan dan tidak digabungkan dan Anda harus menggabungkannya.
Edward Thomson
3

Langkah-langkah untuk diikuti:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Terima kasih, Sarbasish

Sarbasish Mishra
sumber
2

Ada masalah yang sama dengan saya.
Dalam kasus saya, langkah-langkahnya seperti di bawah ini -

  1. Dihapus semua file yang sedang dimulai dengan simbol U (unmerged) . sebagai-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Tarik kode dari master

$ git pull origin master
  1. Memeriksa status

 $ git status

Berikut adalah pesan yang muncul-
dan masing-masing memiliki 2 dan 1 komit yang berbeda. Anda memiliki jalur yang tidak dihapus.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Jalur yang tidak dihapus:
(gunakan "git add ..." untuk menandai resolusi)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Menambahkan semua perubahan baru -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Melakukan perubahan pada head-

$ git commit -am "resolved conflict of the app."
  1. Mendorong kode -

$ git push origin master

Putaran mana yang mungkin masalah teratasi dengan gambar ini - masukkan deskripsi gambar di sini

S.Yadav
sumber
1

Ketika konflik gabungan terjadi, Anda bisa membuka file individual. Anda akan mendapatkan simbol "<<<<<<< atau >>>>>>>". Ini merujuk pada perubahan Anda dan perubahan yang ada pada remote. Anda dapat secara manual mengedit bagian yang diperlukan. setelah itu simpan file tersebut lalu lakukan: git add

Konflik gabungan akan diselesaikan.

dfordevy
sumber
-1

Jalankan saja perintah ini:

git reset --hard
Grace Green
sumber
3
Anda harus menjelaskan apa yang dilakukan perintah itu, karena beberapa orang akan sangat kecewa jika mereka mencoba dan mengetahui bahwa itu menghapus semua perubahan lokal mereka saat ini: /
Joseph Budin
Ini berfungsi jika Anda hanya menyalin perubahan Anda ke sumber sementara eksternal .. jika Anda hanya punya beberapa file misalnya file konfigurasi untuk proyek itu sempurna. Lakukan perintah dan kemudian kembalikan perubahan Anda. Bekerja untukku!
cwiggo