Bagaimana cara memperbaiki konflik gabungan karena penghapusan file di cabang?

208

Saya telah membuat dialogcabang dan ketika saya mencoba untuk menggabungkannya ke mastercabang. Ada 2 konflik. Saya tidak tahu bagaimana mengatasinya CONFLICT (delete/modify). Bisakah Anda memberi tahu saya apa yang harus saya lakukan?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

Saya telah membuka src/DialogAdapter.java, memperbaiki konflik dan melakukan a git add src/DialogAdapter.java. Apa lagi yang harus saya lakukan?

BuZZ-dEE
sumber
Anda dapat membaca posting ini di Stack Overflow: - Bagaimana Cara Memperbaiki Konflik Gabung di Git? Jawaban yang diterima merujuk pada manual git .
heavyd

Jawaban:

271

Pesan konflik:

CONFLICT (hapus / modifikasi): res / layout / dialog_item.xml dihapus dalam dialog dan diubah dalam HEAD

berarti yang res/layout/dialog_item.xmltelah dihapus di cabang 'dialog' yang Anda gabungkan, tetapi telah dimodifikasi di HEAD (di cabang tempat Anda bergabung).

Jadi, Anda harus memutuskan apakah

  • hapus file menggunakan " git rm res/layout/dialog_item.xml"

atau

  • terima versi dari HEAD (mungkin setelah diedit) dengan " git add res/layout/dialog_item.xml"

Kemudian Anda menyelesaikan penggabungan dengan " git commit".

Perhatikan bahwa git akan memperingatkan Anda bahwa Anda sedang membuat komit gabungan, dalam kasus (jarang) di mana itu adalah sesuatu yang tidak Anda inginkan. Mungkin tetap dari hari-hari di mana kasus itu kurang langka.

Jakub Narębski
sumber
22
Mencoba mantan ( git rm …) tetapi saya dapatkan …: needs mergedan rm '…'yang saya mengalami kesulitan menafsirkan. Dan kemudian jika saya mencoba melakukan, stackoverflow.com/questions/19985906/… muncul lagi.
Jesse Glick
17
Jangan pedulikan bagian kedua dari komentar itu. Output dari Git agak mengkhawatirkan tetapi tampaknya tidak berbahaya.
Jesse Glick
4
Apakah ada pendekatan massa? Saya memiliki proyek yang bergantung pada hal-hal eksternal yang tidak ingin saya pertahankan. Jadi ada banyak file yang dimodifikasi di bagian hulu dan saya ingin menghapus di cabang saya bahwa saya akan melakukan rebooting tidak peduli apa. Sangat membosankan untuk melakukannya satu per satu.
mlt
2
@mit: Anda dapat menggunakan git ls-files --stagedan / atau git status --porcelaindan / atau git diff-files <something>untuk mendapatkan daftar file yang diubah dan mengarahkan skrip untuk menghapusnya atau menerima versi Anda atau mereka.
Jakub Narębski
1
@ Madu: Pesan CONFLICT termasuk deskripsi tentang perubahan mana di cabang mana. Anda dapat memeriksanya nanti dengan git statusatau git diff --cc. Ada juga git log --mergeyang mungkin membantu ...
Jakub Narębski
74

Saya biasanya hanya menjalankan git mergetooldan itu akan meminta saya jika saya ingin menyimpan file yang dimodifikasi atau tetap menghapusnya. Ini adalah cara tercepat IMHO karena ini adalah satu perintah, bukan beberapa per file.

Jika Anda memiliki banyak file yang dihapus di subdirektori tertentu dan Anda ingin semuanya diselesaikan dengan menghapus file, Anda dapat melakukan ini:

yes d | git mergetool -- the/subdirectory

Ini ddisediakan untuk memilih menghapus setiap file. Anda juga dapat menggunakan muntuk menyimpan file yang dimodifikasi. Diambil dari prompt yang Anda lihat ketika Anda menjalankan mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
sumber
1
@BrianMinton saya juga, hal-hal lain hanya lingkaran setan
Nate L
2
Ini menjadi menjengkelkan ketika banyak file, apakah ada cara untuk memberikan satu jawaban untuk semua?
ideasman42
2
@ ideasman42 Saya telah memperbarui jawaban saya untuk menunjukkan solusi penghapusan-batch.
void.pointer
1
Saya tidak benar-benar tahu tentang alat penggabungan. Anda menyelamatkan saya hari Bung!
Mert
6

Jika Anda menggunakan Git Gui di windows,

  1. Batalkan penggabungan
  2. Pastikan Anda berada di cabang target Anda
  3. Hapus file yang bertentangan dari explorer
  4. Pindai ulang untuk perubahan di Git Gui (F5)
  5. Perhatikan bahwa file yang bertentangan dihapus
  6. Pilih Stage Changed Files To Commit (Ctrl-I) dari menu Commit
  7. Masukkan komentar komit seperti "file yang bentrok terhapus"
  8. Komit (ctrl-enter)
  9. Sekarang jika Anda me-restart penggabungan itu (semoga) bekerja.
salihcenap
sumber
5
Pria itu tidak suka cara Anda menangani Git dengan GUI, mungkin. Cara baris perintah lebih baik.
Souris