Kesalahan git saat melakukan setelah penggabungan - fatal: tidak dapat melakukan sebagian komitmen saat penggabungan

280

Saya menjalankan sebuah git pullyang berakhir dengan konflik. Saya menyelesaikan konflik dan semuanya baik-baik saja sekarang (saya menggunakan mergetool juga).

Ketika saya melakukan file yang diselesaikan dengan git commit file.php -m "message"saya mendapatkan kesalahan:

fatal: cannot do a partial commit during a merge.

Saya memiliki masalah yang sama sebelumnya dan menggunakan -adi komit bekerja dengan sempurna. Saya pikir itu bukan cara yang sempurna karena saya tidak ingin melakukan semua perubahan. Saya ingin mengkomit file secara terpisah dengan komentar yang terpisah. Bagaimana saya bisa melakukan itu? Mengapa git tidak mengizinkan pengguna untuk melakukan file secara terpisah setelah penggabungan? Saya tidak dapat menemukan jawaban yang memuaskan untuk masalah ini.

pMan
sumber
5
Dan Anda tahu, mencari git melakukan "komit penuh" mengembalikan hampir tidak ada yang berguna. Tidak ada dokumen yang relevan dari halaman manual Git. Ini adalah alat yang menyedihkan.
jww
6
@ Torek - bicara tentang kekacauan lain yang dibuat oleh Git ... Mengapa sangat sulit untuk checkout file yang konflik dari cabang lain sehingga konflik dihindari, tambahkan ke cabang ini, dan kemudian komit ??? Dan WTF adalah komitmen parsial? Saya tidak dapat menemukan dokumentasi tentang itu ... Pengguna dipaksa untuk mencoba tebakan di bawah ...
jww
Bagaimana kamu melakukannya? Saya memiliki konflik dan saya tidak bisa melakukan apa pun
Niklas R.

Jawaban:

442

Saya menemukan bahwa menambahkan "-i" ke komit memperbaiki masalah ini untuk saya. -I pada dasarnya memberitahu file stage tambahan sebelum melakukan. Itu adalah:

git commit -i myfile.php
MikaelHalen
sumber
18
Apa Stage additional filesartinya
jcalfee314
9
@ jcalfee314 pementasan di git adalah untuk mempersiapkan file untuk komit. Dalam kasus khusus ini akan mem-stage file melalui command line sebelum melakukan. Bendera -i digunakan sebagian besar ketika Anda menyimpulkan gabungan. Anda dapat membaca lebih lanjut tentang flag komit di sini .
MikaelHalen
4
@ jcalfee314 Saya memeriksa dokumentasi dan mengatakan "Sebelum membuat komit dari konten yang dipentaskan sejauh ini, tahap isi path yang diberikan pada baris perintah juga. Ini biasanya bukan yang Anda inginkan kecuali jika Anda menyimpulkan penggabungan yang bertentangan" . Dugaan saya adalah bahwa dalam kondisi ini, ada beberapa jenis ketidakkonsistenan dalam area pementasan yang tidak dapat diselesaikan git add, yang membuat git commitgagal. Menambahkan -iakan memberitahu git untuk menambahkan dan melakukan pada saat yang sama. Saya masih tidak yakin mengapa tetapi tampaknya masuk akal.
JonSlowCN
5
Untuk noobs seperti saya, Anda juga akan mendapatkan kesalahan yang sama jika Anda mencoba pesan yang menyertakan spasi tanpa tanda kutip. Misalnya. [git commit -m satu dua tiga] Benar: [git commit -m "satu dua tiga"]
Skychan
2
Komentar @ Skychan adalah tiket untuk saya.
tehbeardedone
106
git commit -am 'Conflicts resolved'

Ini berhasil untuk saya. Anda dapat mencoba ini juga.

Pratip Ghosh
sumber
1
Luar biasa, saya tidak tahu ini!
JeanValjean
11
Ini menambahkan semua file yang dimodifikasi ke komit, bahkan yang tidak dipentaskan yang mungkin tidak diinginkan. Pengguna mungkin ingin meninggalkan bendera 'a'
Chase Sandmann
4
Inilah yang diminta pengguna untuk tidak dilakukan, yaitu untuk menghindari melakukan semua file.
Michael
33

Anda dapat menggunakan git commit -isebagian besar kasus tetapi jika tidak berhasil

Yang perlu Anda lakukan git commit -m "your_merge_message". Selama konflik penggabungan, Anda tidak dapat menggabungkan satu file tunggal sehingga Anda perlu

  1. Hanya menampilkan file yang konflik ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
sumber
16

Anda mungkin mengalami konflik dalam sesuatu yang belum Anda lakukan untuk komitmen. git tidak akan membiarkan Anda melakukan hal-hal secara mandiri (karena itu semua bagian dari penggabungan, saya kira), jadi Anda perlu ke git addfile itu dan kemudian git commit -m "Merge conflict resolution". The -ibendera untuk git commitmelakukan add untuk Anda.

Paul Price
sumber
5
Bukan di 1.9.0 - yang commit -idikerjakan, tapi tidakgit add; git commit
LeeGee
14

Saya mendapatkan ini ketika saya lupa -mkomit git saya ketika menyelesaikan konflik git merge.

git commit "commit message"

seharusnya

git commit -m "commit message"
wgeorge
sumber
2
ah ah! Saya lupa lagi!
user2705463
9

Seperti pesan kesalahan mengatakan Anda tidak dapat melakukan sebagian komitmen setelah penggabungan. Alih-alih melakukan hanya file.phpAnda harus melakukan semua perubahan.

Ini seharusnya bekerja.

git commit -m "Fixing merge" 
Asim Jalis
sumber
Terima kasih, ini membantu
Narendra Pandey
Bekerja untuk saya apa adanya
Shashank Bodkhe
6

Penggabungan Anda berhenti di tengah tindakan. Anda harus menambahkan file Anda, dan kemudian 'git commit':

git add file_1.php file_2.php file_3.php git commit

Bersulang

Moyshe Zuchmir
sumber
5

Jika Anda hanya ingin parit memetik seluruh ceri dan melakukan file dalam set apa pun yang Anda inginkan,

git reset --soft <ID-OF-THE-LAST-COMMIT>

membuat kamu di sana.

Soft reset apa yang dilakukan adalah memindahkan pointer yang menunjuk ke HEAD saat ini ke commit (ish) yang Anda berikan tetapi tidak mengubah file. Reset keras akan memindahkan pointer dan juga mengembalikan semua file ke status dalam komit itu (ish). Ini berarti dengan soft reset Anda dapat menghapus status penggabungan tetapi menyimpan perubahan pada file aktual dan kemudian komit atau reset masing-masing secara individual sesuai keinginan Anda.

Zds
sumber
Bisakah Anda menjelaskan ini lebih lanjut? Ini mungkin yang saya butuhkan, tapi saya tidak mengikuti cara kerjanya ... Semua jawaban di sini hanya 'tambahkan file, lalu komit!', Tapi itu sangat jelas; alasan saya di sini adalah saya tidak ingin menambahkan file-file itu sebelum saya melakukan. -_-;
Kyle Baker
Itu membantu. Terima kasih. :)
Kyle Baker
5
  1. buka direktori proyek Anda
    1. tampilkan file tersembunyi (folder .git akan muncul)
    2. buka folder .git
    3. hapus MERGE_HEAD
    4. komit lagi
    5. jika git memberi tahu Anda bahwa git terkunci kembali ke folder .git dan hapus index.lock
    6. komit lagi semuanya akan berfungsi dengan baik saat ini.
Ahmed Samir
sumber
Bagus! Itu akan bekerja untuk saya. Ngomong-ngomong jika di MacOS, dari terminal Anda bisa memanggil `open .git`, penyihir akan menampilkan konten '.git' di Finder
tontonCD
Ini juga berfungsi untuk saya. Ini harus diterima sebagai jawaban.
vandu
3

Bagi saya ini terjadi di SourceTree ketika saya mencoba melakukan gabungan sebelum menyelesaikan semua file. Saya kemudian menandai file terakhir diselesaikan dan masih memberi saya kesalahan ini ketika mencoba melakukan. Saya menutup SourceTree dan membukanya kembali, lalu melakukannya dengan baik.

Justin
sumber
1
terima kasih, tetapi sayangnya ini tidak berhasil untuk saya. Mengganggu, saya harus melakukan view-private serta penggabungan sebelum akan membiarkan saya melakukan penggabungan.
Coxy
3

Saya memecahkan ini dengan pendekatan yang sama sekali berbeda, hanya menggunakan Kontrol Sumber Xcode.

Latar Belakang: Tim lain Mendorong perubahan pada repositori Git jarak jauh (melalui Beanstalk). Pada akhirnya, file .xcodeproj berada di bawah direktori yang berbeda, dan perubahan tidak terjadi. Kemudian, ketika saya mencoba melakukan, saya menerima kesalahan Tree Conflict di Xcode.

Tangkapan Layar Konflik Pohon

Menjadi hampir mustahil untuk dikoreksi menggunakan Xcode, saya mengganti .xcodeprojfile dengan versi yang diunduh dari server Git. Hasilnya ... proyek Xcode tampak jelas, namun semua pembaruan dari Pull yang korup muncul sebagai perubahan yang saya buat dan diatur untuk Komit.

Lihatlah semua Mod dan file yang ditambahkan ini

Namun ketika mencoba Berkomitmen, saya menerima kesalahan "fatal: tidak dapat melakukan sebagian komitmen saat penggabungan", dibahas di sini.

Inilah cara saya memecahkan masalah ... (Sekarang, pahami bahwa saya seorang programmer pemula, jadi saya bisa kurang mengerti ... tapi ketidaktahuan saya membuat saya menemukan cara lain untuk melakukan ini.) Pertama, saya Mengkloning master saya Cabang menjadi Cabang sekunder dan beralih ke cabang itu. Kemudian saya membuat Copy Pekerjaan dan menempatkan direktori ke copy pekerjaan di luar direktori proyek asli. (Saya tidak tahu apakah ini perlu, tetapi ini yang saya lakukan ketika saya membaca teknik pemecahan masalah lainnya.) Kemudian saya beralih cabang ke master, di mana saya menyadari semua file Staged saya (perubahan ke Commit) hilang. Untuk memastikan semua file diperbarui ke perubahan terbaru yang dibuat oleh pihak lain, saya membuat cabang baru bernama ThirdBranch, yang menggandakan semua file, Mendorongnya ke Git Server dan membiarkan Beanstalk membandingkan versi server saya dari cabang master ke cabang ThirdBrach yang baru saja saya Dorong (baris demi baris), dan semua perubahan oleh pihak lain ada di Xcode saya. Ini berarti bahwa repositori master saya dan repositori master Git adalah sama, yang memverifikasi bahwa saya menyelesaikan masalah menggunakan Xcode, hanya.

Jangan tanya saya bagaimana, melampaui apa yang baru saja saya jelaskan ... dan tentu saja mengisi kekosongan yang saya tinggalkan. Saya baru dalam hal ini dan saya tidak mengerti segalanya. Mungkin seorang programmer yang berpengalaman dapat memisahkan informasi yang tidak relevan dari yang relevan dan menciptakan kembali teknik ini dengan lebih jelas, yang merupakan sebagian alasan saya memposting ini.

Ini adalah jawaban rangkap untuk pertanyaan rangkap seperti di: Gagal Xcode Git Merge macet

Plexander
sumber
2
Tolong jangan memposting jawaban duplikat. Meskipun masalah yang mendasarinya mungkin sama, jawaban Anda untuk masalah yang jauh lebih spesifik dan hanya mengaburkan jawaban untuk pertanyaan umum ini. Saya pikir dalam hal ini komentar terhadap pertanyaan di mana Anda menautkan ke jawaban asli Anda lebih tepat.
Fookatchu
2

Selama penggabungan, Git ingin melacak cabang induk dengan segala macam alasan. Apa yang ingin Anda lakukan bukanlah penggabungan seperti yang dilihat git. Anda mungkin ingin melakukan rebase atau memilih-ceri secara manual.

Talljoe
sumber
1
Saya tidak pernah menggunakan rebase atau cherry-pick sebelumnya, saya hanya menjalankan manual sekarang, jadi apa yang akan Anda sarankan, "git rebase master" setelah penggabungan konflik akan berhasil?
pMan
1
Ini alur kerja paralel. Lihat stackoverflow.com/questions/804115/git-rebase-vs-git-merge Pada dasarnya, jika Anda ingin "gabungan" menjadi komit terpisah, alih-alih rebase cabang sumber ke ujung cabang target.
Talljoe
1
Cukup git tambahkan setiap file individu lalu komit tanpa -a.
Peter DeWeese
4
Anda tidak benar-benar menjawab pertanyaan tetapi hanya memberi lebih banyak untuk dicari. Sekarang kita perlu tahu "apa yang memetik ceri" dan "apa itu rebase".
ftrotter
2
Saya bertanya-tanya mengapa jawaban ini tidak dipilih. Saya selalu memiliki rasa ingin tahu anak ketika seseorang mengatakan kepada saya hal-hal yang tidak pernah saya ketahui sebelumnya. Seperti yang saya komentari di atas, sekarang saya tahu tentang cherry pick dan rebase. Bukankah itu progresif / bermanfaat?
Ayah
2

git commit -i -m 'merge message'tidak bekerja untuk saya. Itu berkata:

fatal: No paths with --include/--only does not make sense.

FWIW, saya tiba di sini melalui pertanyaan terkait ini karena saya menerima pesan ini:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Saya juga mencoba mergetool, yang mengatakan No files need merging. Sangat membingungkan! Jadi MERGE_HEAD tidak ada dalam file yang perlu digabung- ??

Akhirnya, saya menggunakan trik ini untuk menambahkan hanya file yang dimodifikasi (tidak ingin menambahkan semua file di pohon saya, karena saya punya beberapa yang saya ingin tetap tidak terlacak):

git ls-files -m | xargs git add

Kemudian saya akhirnya (!) Dapat berkomitmen dan mendorong. Tentu akan lebih baik jika git memberi Anda petunjuk yang lebih baik tentang apa yang harus dilakukan dalam situasi ini.

szeitlin
sumber
1

Jika ada di Source Tree , kita harus secara eksplisit menandai file sebagai diselesaikan setelah konflik diselesaikan. Pilih file yang baru saja diselesaikan tanpa konflik. Kemudian Tindakan -> Selesaikan Konflik -> Tandai Terselesaikan . Jika Anda memiliki banyak file, lakukan hal yang sama untuk semua. Komit sekarang.

cgr
sumber
1

Setelah membaca semua komentar. ini adalah resolusi saya:
saya harus "Tambahkan" lagi daripada melakukan:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
sumber
1

Jika Anda menggunakan pohon Sumber atau GUI lain, pastikan semua file diperiksa (setelah digabung).

suam
sumber
0

Terkadang saat penggabungan, jika konflik muncul dan ada delta yang membutuhkan resolusi manual. Dalam kasus tersebut, perbaiki resolusi manual untuk file yang disebutkan.

Sekarang jika Anda mengeluarkan,

git status Lib/MyFile.php

Anda akan melihat output seperti

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Karena, Anda sudah melakukan komit, Anda hanya perlu mengeluarkan

git commit

Dan komit Anda akan dilakukan tanpa masalah.

Ketan Patel
sumber