Bagaimana cara menggabungkan konflik Git di Emacs

84

Penggabungan Git saya baru-baru ini telah menghasilkan sejumlah besar konflik. Pendekatan saya saat ini adalah untuk mencari kemunculan berikutnya dari '<<<' dan kemudian melakukan penggabungan dengan pengeditan teks standar.

Pertanyaan : adakah cara Emacs dapat mendukung penggabungan dengan menggunakan informasi yang tersedia di Git tentang versi saya, versi mereka, dan versi dasar file?


Sunting: Pertanyaan ini memiliki cakupan yang berbeda dari pertanyaan terkait ini , karena tidak terbatas pada pemanggilan ediff.

Pemula
sumber
7
Jika Anda menggunakan Magit, Anda bisa memuat buffer status dan kemudian tekan epada file yang ditampilkan sebagai bertentangan. Magit akan memulai ediffuntuk melakukan penggabungan dan meminta Anda setelah itu untuk mengonfirmasi perubahan Anda, lalu Anda bisa membuat file gabungan.
wvxvw
@ Pemula: 3 orang lain berpikir itu adalah duplikat, dan saya adalah suara terakhir. Mengapa: utas lain yang dikutip memberikan jawaban yang sama ( smergedan vc-resolve-conflict, juga satu di ediff) dan telah ada lebih lama. Saya setuju bahwa utas pertama dapat menggunakan judul yang lebih baik.
Dan
@Dan saya tidak setuju: ini adalah pertanyaan yang berbeda dan jawabannya sama tidak mengubah itu.
Pemula
1
@IqbalAnsari: Saya pikir utas lainnya membutuhkan judul yang lebih baik sehingga orang dapat menemukannya dengan lebih mudah. Bahkan, saya pikir judul utas Pemula akan bagus untuk itu. Namun, mari kita tunggu sebentar untuk melihat apakah orang ingin membuka kembali utas ini. Jika tidak, saya akan memilih untuk mengganti nama utas pertama dengan judul Beginner.
Dan
1
Dan untuk apa nilainya, saya pikir ini adalah pertanyaan yang bagus dengan jawaban yang bagus. Hanya saja saya juga berpikir itu adalah duplikat - tetapi orang lain mungkin tidak membagikan pendapat itu (tentang duplikasi itu, yaitu).
Dan

Jawaban:

86

Anda mungkin ingin mencoba smerge-modehanya membuka file yang konflik dan lakukan M-xsmerge-modeRET. Ini akan menyoroti semua wilayah yang konflik. Ia juga menambahkan ikatan kunci untuk menyelesaikan konflik dengan mudah, berkonsultasi dengan dokumentasinya C-hfsmerge-modeRETuntuk mengetahuinya.

Awalan default

Saya menemukan awalan default untuk smerge-mode C-c^rumit jadi saya telah mengubahnya menjadi C-cv

(setq smerge-command-prefix "\C-cv")

Ikatan kunci penting

Bagi saya ikatan yang paling penting adalah:

smerge-nextterikat untuk smerge-command-prefixnpindah ke konflik berikutnya.

smerge-previousterikat untuk smerge-command-prefixppindah ke konflik sebelumnya.

smerge-keep-currentterikat untuk smerge-command-prefixRETmenjaga versi kursor aktif.

smerge-keep-mineterikat untuk smerge-command-prefixmmenyimpan perubahan Anda.

smerge-keep-otherterikat untuk smerge-command-prefixomenyimpan perubahan lainnya.

smerge-ediffterikat untuk smerge-command-prefixEmemulai sesi tepi untuk menggabungkan konflik. Ini sama dengan vc-resolve-conflicts(terima kasih @phils dan @Malabarba untuk menunjukkan ini).

Mengaktifkan mode smerge secara otomatis

UPDATE: Berikut ini hanya relevan pada versi Emacs sebelumnya 25.1, berikut ini dapat menyebabkan masalah pada versi selanjutnya, lihat https://github.com/magit/magit/issues/3897

Selain itu, Anda mungkin tertarik untuk mengaktifkan secara otomatis smerge-modesaat mengunjungi file / buffer dengan penanda konflik, Anda dapat menggunakan sesuatu seperti berikut untuk mencapai ini

(defun my-enable-smerge-maybe ()
  (when (and buffer-file-name (vc-backend buffer-file-name))
    (save-excursion
      (goto-char (point-min))
      (when (re-search-forward "^<<<<<<< " nil t)
        (smerge-mode +1)))))

(add-hook 'buffer-list-update-hook #'my-enable-smerge-maybe)

Perhatikan bahwa saya menggunakan buffer-list-update-hookdan bukan find-file-hookkarena sebagian besar waktu saya mendapatkan konflik dalam buffer yang sudah terbuka di emacs dalam hal find-file-hookini tidak ada gunanya.

Periksa juga metode lain yang disebutkan dalam jawaban ini

Iqbal Ansari
sumber
1
(1) Jangan lupa smerge-ediff. (2) Versi Emacs apa yang Anda pakai? Pada cabang master emacs saat ini, smerge menyala secara otomatis. (3) Mengapa Anda menggunakan buffer-list-update-hookbukan find-file-hook?
Malabarba
Untuk klarifikasi tambahan, perhatikan itu smerge-ediffdan vc-resolve-conflictsadalah hal yang sama.
phils
@ Malabarba 1) Saya memang menyebutkan bahwa smerge-modekeybindings didokumentasikan, dokumentasinya. Mungkin saya bisa mengutip manual di sini untuk kelengkapan. Terima kasih untuk umpan baliknya. 2) Saya menggunakan v24.5, meskipun terkadang saya mencoba cabang master, saya tidak ingat smerge dibalik secara otomatis (apakah ini perubahan terbaru?). 3) Itu karena sebagian besar kali saya mendapatkan konflik di buffer sudah terbuka, dalam hal ini saya akan perlu secara eksplisit mengaktifkansmerge-mode
Iqbal Ansari
@IqbalAnsari apakah ada alasan untuk tidak smerge-modemengaktifkannya sepanjang waktu? Mungkin itu tidak berbuat banyak sampai dipanggil.
PythonNut
@PythonNut Pertanyaan bagus, sayangnya saya tidak punya jawaban karena saya tidak pernah mencoba membuatnya tetap aktif sepanjang waktu, nilainya untuk dicoba
Iqbal Ansari
32

Sunting: karena jawaban ini mendapat lebih banyak suara daripada yang saya harapkan, saya sedikit mengembangkannya.

Untuk melengkapi jawaban oleh @IqbalAnsari, Anda juga dapat menggunakan vc-resolve-conflicts(seperti yang disebutkan oleh orang lain, ini adalah alias untuk smerge-ediff). Ini akan memulai ediffantarmuka. Di sebelah kiri akan menjadi orang tua gabungan pertama, dan orang tua gabungan kedua di sebelah kanan. Mereka diberi label pada modeline dengan MINEdan OTHERmasing - masing. Buffer gabungan ditampilkan di bawah (lihat tangkapan layar).

Tangkapan layar antarmuka <code> ediff </code>

Pengikat kunci

  • Menavigasi melalui konflik dengan ndan p.
  • Terima versi dengan aatau b.
  • Lihatlah leluhur bersama /!
  • Keluar dari sesi ediff dengan q.

Anda juga dapat menavigasi ke buffer yang digabungkan dengan other-windowdan mengedit tangan jika menyelesaikan konflik lebih rumit daripada menerima versi. Setelah selesai, Anda dapat menyimpan buffer dan keluar dari Emacs seperti biasa. Untuk bantuan lebih lanjut, cukup gunakan ?selama ediffsesi, ada sejumlah besar perintah yang sangat berguna di sana. Saya masih tidak tahu apa yang dilakukan setengah dari mereka!

suvayu
sumber
2
Ini adalah metode IMO terbaik. Saya memilikinya terikat C-x v <, meskipun dalam praktiknya saya lebih cenderung memohon dengan Magit (sesuai komentar wvxvw).
phils
1
Karena tahun 2000 vc-resolve-conflictadalah alias untuk smerge-ediff, yang seperti namanya memulai sesi Ediff, bukan sesi Emerge. Omong-omong, tajuk pustaka pengaruh ediff.elmengakui emerge.eldan kemudian melanjutkan dengan mengatakan "Versi sekarang dari Ediff menggantikan Emerge. Ini menyediakan antarmuka pengguna yang unggul dan memiliki banyak fitur utama yang tidak ditemukan di Emerge. Secara khusus, ia dapat melakukan penambalan, dan Operasi perbandingan 2-arah dan 3-arah, penggabungan, dan operasi direktori. "
tarsius
6
Juga perhatikan bahwa magit-ediff-resolve( Ematau epada file dengan konflik) menggunakan smerge-ediffinternal. Namun itu mengesampingkan ediff-quit-hookuntuk memberikan pengalaman penyelesaian sesi yang sedikit lebih baik. Alih-alih memberi tahu Anda bahwa Anda dapat menyimpan "buffer" (ada beberapa buffer), ia meminta Anda apakah Anda ingin menyimpan buffer (sambil menunjukkan namanya).
tarsius
Apakah ada cara untuk menampilkan 4 jendela (kita, orang tua, milik mereka, ruang kerja) seperti vimdiff?
user1133275
9

Jika Anda menggunakan Spacemacs, saya sarankan untuk mengaktifkan "smerge-transient-mode", yang memunculkan menu hydra dengan semua perintah smerge yang mungkin.

Untuk melakukan itu, cukup panggil Mx spacemacs/smerge-transient-state/body, yang ditentukan per default SPC-g-r.

Berikut screenshotnya:

masukkan deskripsi gambar di sini

Mengedit file Anda harus intuitif:

  1. Tekan nuntuk pergi ke cowok berikutnya.
  2. Pilih tindakan gabungan .
  3. Ulangi sampai selesai.
dangom
sumber