Bagaimana cara saya menyelesaikan gabungan setelah menyelesaikan konflik gabungan saya?


282

Saya telah membaca bagian Dasar Cabang dan Penggabungan Buku Komunitas Git.

Jadi saya mengikutinya dan membuat satu cabang: experimental.

Maka saya:

  1. beralih ke cabang eksperimental (eksperimental git checkout)
  2. membuat banyak perubahan
  3. komit (git commit -a)
  4. beralih ke cabang utama (master checkout git)
  5. buat beberapa perubahan dan komit di sana
  6. beralih kembali ke eksperimental (eksperimen checkout git)
  7. gabungkan perubahan master ke eksperimental (git merge master)
  8. ada beberapa konflik tetapi setelah saya menyelesaikannya, saya 'git add myfile'

  9. Dan sekarang saya mandek, saya tidak bisa kembali ke master

ketika saya melakukannya

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

dan saya lakukan:

$ git rebase --abort

Tidak ada rebase dalam proses?

dan saya lakukan:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Apa yang bisa saya lakukan agar saya bisa kembali ke cabang utama saya?


Setelah saya memperbaiki konflik, melakukan penambahan, dan kemudian mencoba untuk melakukan komit git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", hasilnya fatal: cannot do a partial commit during a merge.. Dan tentu saja, "Komitmen parsial" tampaknya tidak didokumentasikan atau didiskusikan di mana pun di halaman manual git. Pertunjukan git mergesetelah perbaikan menghasilkan Please, commit your changes before you can merge.Apa alat keledai yang rusak ...
jww

2
git commit dengan path eksplisit didokumentasikan dalam manual di DESCRIPTION "as" 3. dengan mendaftarkan file sebagai argumen pada perintah commit, dalam hal ini komit akan mengabaikan perubahan yang dilakukan dalam indeks, dan sebagai gantinya merekam konten saat ini dari file yang terdaftar (yang harus sudah diketahui oleh Git); "dan juga di bawah '- -hanya 'pilihan. Saya cukup yakin pesan gabungan ditulis oleh seseorang yang berasumsi Anda akan membaca bagaimana perintah komit bekerja, dan bisa mengenali arti kata "parsial" dalam deskripsi itu, jika belum maka setidaknya lagi dan lebih hati-hati. @jww
jthill

1
Jadi, mengapa studi kasus itu pantas dibaca dengan seksama untuk pemahaman, sedangkan manpage tidak? @jww
jthill

1
Nah, menggunakan git jelas membutuhkan pemahaman membaca yang lebih baik daripada yang Anda siapkan. Saya mungkin bahkan lebih tidak yakin bahwa itu adalah kesalahan dalam git daripada yang Anda yakini.
jthill

1
Dengan Git 2.12 (Q1 2017), Anda akan segera melakukan git merge --continue. Lihat jawaban saya di bawah ini
VonC

Jawaban:


267

Ketika ada konflik selama penggabungan, Anda harus menyelesaikan komit gabungan secara manual. Kedengarannya seperti Anda telah melakukan dua langkah pertama, untuk mengedit file yang bertentangan dan kemudian menjalankannya git adduntuk menandai mereka sebagai terselesaikan. Akhirnya, Anda harus benar-benar melakukan penggabungan git commit. Pada titik itu Anda akan dapat berganti cabang lagi.


Jika Anda menggunakan "git gui &" untuk melakukan komit - Anda mungkin tidak menyadari status cabang Anda tidak lagi "penggabungan". Menindaklanjuti dengan "status git" bermanfaat untuk memastikan status cabang Anda benar.
Tony Ashworth

4
Coba git commit -am "your commit message"lakukan penambahan dan komit secara bersamaan.
vaheeds

3
git committidak bekerja. Dan yang terbaik adalah menggunakannya untuk mendapatkan pesan komit gabungan digabung untuk Anda. Saya menghindari `git commit -am" karena ini akan menimpa pesan
Arijoon

1
Coba git push.
alper

Saya mendapatkan situasi ini dalam skenario di bawah ini -> Saya menggabungkan cabang X dengan cabang Y. Kemudian saya menyadari saya melakukan sesuatu yang salah di cabang Y, jadi saya memperbaikinya dan kemudian saya "mengubah" perubahan saya di cabang Y. Karena perubahan git tidak membuat komit baru. Jadi ketika saya menggabungkan cabang X dengan cabang Y yang diperbarui, itu menimbulkan konflik. Terima kasih atas jawaban ini.
doga

157

Bagaimana cara saya menyelesaikan gabungan setelah menyelesaikan konflik gabungan saya?

Dengan Git 2.12 (Q1 2017), Anda akan memiliki perintah yang lebih alami:

git merge --continue

Lihat komit c7d227d (15 Des 2016) oleh Jeff King ( peff) .
Lihat komit 042e290 , komit c261a87 , komit 367ff69 (14 Des 2016) oleh Chris Packham ( cpackham) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 05f6e1b , 27 Des 2016)

Lihat 2.12 catatan rilis .

merge: tambahkan --continueopsi ' ' sebagai sinonim untuk ' git commit'

Mengajar ' git merge' yang --continuepilihan yang memungkinkan 'melanjutkan' gabungan dengan menyelesaikan itu.
Cara tradisional menyelesaikan penggabungan setelah menyelesaikan konflik adalah dengan menggunakan ' git commit'.
Sekarang dengan perintah seperti ' git rebase' dan ' git cherry-pick' memiliki --continueopsi ' ' menambahkan opsi seperti itu ke ' git merge' menyajikan UI yang konsisten.


Saya sedang bersiap memposting komentar tentang bagaimana ini baru-baru ini ditambahkan pada 2.12 di Q1 2017, tetapi kemudian saya membaca ulang baris pertama jawaban Anda. Tidak heran opsi tidak ditemukan untuk saya di versi 2.10!
cjsimon

1
Saya mencoba git merge --continue dan Git Bash tidak dapat mengenali itu sebagai perintah. Tapi yang berhasil adalah git commit -m "Commit message"
Mimi

2
@ Mimi OK, tetapi apakah Anda menggunakan Git 2.12 atau lebih?
VonC

@VonC Anda benar, saya menggunakan versi Git yang lebih lama!
Mimi

23

Jika Anda pernah terjebak selama penggabungan / rebase Anda selalu bisa

git reset --hard

untuk mengembalikan pekerjaan Anda ke kondisi komit terakhir. Ini akan kehilangan perubahan Anda dari pohon kerja jadi jika Anda memiliki modifikasi lokal sebelum penggabungan mereka akan hilang setelah ini — itulah sebabnya mengapa disarankan untuk tidak memulai penggabungan ketika Anda memiliki modifikasi lokal. :)


16
peringatan wajib: git reset --hardmembuang perubahan yang tidak dikomit
Geoffrey Hale

2
Mengapa tidak adil git merge --abort, yang tidak berisiko kehilangan apa pun?
Alexander George


11

Setiap kali Anda menggabungkan dua cabang menggunakan perintah git merge brancha branchb, Ada dua kemungkinan:

  1. Satu cabang (katakanlah brancha) dapat dijangkau oleh cabang lainnya (katakanlah branchb) dengan mengikuti sejarah komitnya. Dalam hal ini git cukup memajukan kepala untuk menunjuk ke cabang baru-baru ini (dalam hal ini branchb).

    2.Tetapi jika kedua cabang telah menyimpang pada titik yang lebih lama maka git membuat snapshot baru dan menambahkan komit baru yang menunjuk padanya. Jadi jika tidak ada konflik antara cabang yang Anda gabungkan, git dengan lancar membuat komit baru.

Jalankan git loguntuk melihat komit setelah Anda menggabungkan dua cabang yang tidak bertentangan.

Sekarang kembali ke kasus menarik ketika ada konflik penggabungan antara cabang-cabang yang bergabung. Saya mengutip ini dari halaman https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git belum secara otomatis membuat komit gabungan. Itu telah menghentikan proses saat Anda menyelesaikan konflik. Jika Anda ingin melihat file mana yang tidak dihapus pada titik mana pun setelah konflik gabungan, Anda bisa menjalankannyagit status


Jadi jika ada konflik gabungan, Anda perlu menyelesaikan konflik kemudian tambahkan perubahan yang telah Anda buat ke area pementasan menggunakan git add filenamedan kemudian komit perubahan dengan menggunakan perintah git commit yang dijeda oleh git karena konflik. Saya harap ini menjelaskan Anda pertanyaan. Kunjungi juga tautan di atas untuk pemahaman terperinci. Jika ada pertanyaan, silakan komentar di bawah ini, saya akan dengan senang hati membantu.


7

Langkah-langkah selanjutnya setelah menyelesaikan konflik secara manual adalah: -

  1. git add.
  2. status git (ini akan menunjukkan kepada Anda perintah mana yang diperlukan untuk melanjutkan prosedur penggabungan otomatis)
  3. [perintah git menunjukkan, misalnya git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Tidak ada git merge --continue
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad Ini tidak benar. Zie git output di bawah ini setelah konflik: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
Ada rebase --continue, not merge --continue
Hola Soy Edu Feliz Navidad

git merge --continue, yang sedang saya coba lakukan, menghasilkan error: unknown option 'continue'. Saya yakin jawaban Anda salah karena git-mergehalaman manual tidak mencantumkannya. Git versi apa yang Anda gunakan? Saya menggunakan git version 1.8.5.2 (Apple Git-48). Saya juga mencoba dengan MacPorts git version 2.9.3.
jww

1
Dengan git 2.10 untuk penggabungan sederhana, perintahnya sudah jelasgit commit
Chris Charabaruk

2

Konflik gabungan terjadi ketika dua cabang yang Anda coba gabungkan keduanya mengubah bagian yang sama dari file yang sama. Anda dapat membuat daftar konflik dengan git status.

Ketika baris yang konflik ditemui, Git akan mengedit konten file yang terpengaruh dengan indikator visual yang menandai kedua sisi konten yang bertentangan.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Ketika Anda memperbaiki file yang konflik dan Anda siap untuk bergabung, yang harus Anda lakukan adalah menjalankan git adddan git commitmenghasilkan komit gabungan. Setelah komit dibuat, git pushperubahan ke cabang.

Artikel referensi: Git merge .


2

Setelah semua file ditambahkan, langkah selanjutnya adalah " git commit ".

"git status" akan menyarankan apa yang harus dilakukan: file yang belum ditambahkan terdaftar di bagian bawah, dan setelah semuanya selesai, itu akan menyarankan komit di atas, di mana ia menjelaskan status gabungan dari cabang saat ini.


1

Hal pertama yang ingin saya jelaskan adalah bahwa nama cabang hanyalah alias untuk komit tertentu. komit adalah apa yang berhasil dilakukan git, saat Anda menarik, mendorong penggabungan, dan sebagainya. Setiap komit memiliki id unik.

Ketika Anda melakukan penggabungan $ git, yang sebenarnya terjadi adalah git mencoba memajukan cabang Anda saat ini ke komit tempat cabang yang direferensikan aktif (dengan kata lain kedua nama cabang menunjuk ke komit yang sama.) Skenario ini adalah yang termudah untuk git untuk berurusan, karena tidak ada komitmen baru. Pikirkan tentang master yang melompat ke lilipad yang sedang ditumbuhi cabang Anda. Adalah mungkin untuk mengatur flag --no-ff, di mana git akan membuat komit baru terlepas dari apakah ada konflik kode.

Dalam situasi di mana ada konflik kode antara dua cabang yang Anda coba gabungkan (biasanya dua cabang yang sejarah komitnya memiliki komit yang sama di masa lalu), fast forward tidak akan berfungsi. git mungkin masih dapat menggabungkan file secara otomatis, selama baris yang sama tidak diubah oleh kedua cabang dalam file yang saling bertentangan. dalam hal ini, git akan menggabungkan file yang bertentangan untuk Anda DAN secara otomatis mengkomitnya. Anda dapat melihat pratinjau bagaimana git melakukannya dengan melakukan $ git diff --cached. Atau Anda bisa meneruskan flag --no-commit ke perintah penggabungan, yang akan meninggalkan file yang dimodifikasi dalam indeks Anda yang harus Anda tambahkan dan komit. Tetapi Anda dapat $ git mengubah file-file ini untuk meninjau perubahan yang akan digabung.

Skenario ketiga adalah ketika ada konflik, git tidak dapat secara otomatis menyelesaikannya. Dalam hal ini Anda harus menggabungkannya secara manual. Menurut pendapat saya ini paling mudah dilakukan dengan menggabungkan mengambil, seperti araxis menggabungkan atau p4merge (gratis). Either way, Anda harus melakukan setiap file satu per satu. Jika penggabungan tersebut tampaknya macet, gunakan $ git merge --continue, untuk menyikutinya. Git harus memberi tahu Anda jika itu tidak dapat dilanjutkan, dan jika demikian mengapa tidak. Jika Anda merasa telah meningkatkan penggabungan di beberapa titik, Anda dapat melakukan $ git merge --abort, dan penggabungan apa pun akan dibatalkan dan Anda dapat memulai dari awal. Setelah selesai, setiap file yang Anda gabungkan akan menjadi file yang dimodifikasi yang perlu ditambahkan dan dikomit. Anda dapat memverifikasi di mana file-file itu dengan status $ git. Jika Anda belum melakukan file yang digabungkan. Anda perlu melakukan itu untuk menyelesaikan penggabungan.


0

Mungkin terlambat. Ini Terjadi karena KEPALA git Anda tidak diperbarui. pujian ini akan menyelesaikannya git reset HEAD.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.