Ketika ada collison selama git merge
, saya membuka mergetool bernama Meld . Ini membuka tiga file LOCAL, BASE dan REMOTE. Karena saya sudah membaca LOCAL adalah cabang lokal saya, BASE adalah leluhur umum dan REMOTE adalah cabang yang akan digabung.
Sekarang untuk pertanyaan saya: versi file mana yang akhirnya akan digunakan? Apakah ini REMOTE? Jika demikian, dapatkah saya mengeditnya seperti yang saya inginkan, terlepas dari apa yang ada di cabang BASE misalnya?
merge.conflictstyle
opsi konfigurasi yang diseteldiff3
sebagai ganti defaultmerge
.HEAD
,<<<<<
dan=====
tanda-tanda, itu berarti bahwa tidak ada konflik sama sekali. Dalam hal ini, jendela tengah tidak akan kosong, itu akan menampilkan hasil penggabungan, tetapi tidak akan ada bagian "merah"<<<<<<
,======
atau>>>>>>
spidol di panel tengah (yaitu versi BASE); dan terkadang, panel tengah akan kosong, seperti yang dilaporkan aGr. Mungkin perbedaan ini disebabkan oleh pengaturan yang berbeda. Ketika saya mulai alat Meld, file-file berikut akan ada, dengan asumsi bahwa nama file dalam repositori adalahX.java
:X.java
,X.java.orig
,X.java.BACKUP.#
,X.java.BASE.#
,X.java.LOCAL.#
,X.java.REMOTE.#
, di mana#
beberapa nomor. Memanggil hasil gabungan versi BASE membingungkan; MERGED akan lebih baik.Meld memiliki fitur penggabungan 3-arah tersembunyi yang diaktifkan dengan mengirimkan parameter ke-4:
Panel kanan dan kiri dibuka dalam mode baca-saja, sehingga Anda tidak dapat secara tidak sengaja menggabungkan jalan yang salah. Panel tengah menunjukkan hasil gabungan. Untuk konflik itu menunjukkan versi dasar sehingga Anda dapat melihat semua bit penting: teks asli di tengah, dan modifikasi yang bertentangan di kedua sisi. Akhirnya, ketika Anda menekan tombol "Simpan", file $ MERGED ditulis - persis seperti yang diharapkan oleh git.
File ~ / .gitconfig yang saya gunakan berisi pengaturan berikut:
ini membuka berbaur dengan 3 tab, tab 1 dan 2 berisi diffs sederhana yang saya coba gabungkan, dan tab ke-3, buka secara default, menunjukkan tampilan penggabungan 3-arah.
Sekarang, alasan fitur ini disembunyikan adalah karena itu belum cukup dipoles. Ini sangat berguna seperti sekarang, tetapi Kai Willadsen, penulis berbaur, menunjuk beberapa kerutan yang perlu disetrika. Misalnya tidak ada GUI untuk memulai mode penggabungan 3 arah, sintaks baris perintah agak misterius, dan semacamnya. Jika Anda berbicara python dan punya waktu - Anda tahu apa yang harus dilakukan.
Sunting: Di versi Meld yang lebih baru, synax telah sedikit berubah. Ini ada di komentar, tapi ada di jawabannya.
Perintah berbaur sekarang menggunakan opsi --output, jadi baris terakhir dari potongan di atas seharusnya:
sumber
--output
untuk hasil $ MERGED. Saya menemukan ini sambil melihat skrip peluncuran berbarengan--output option
. Lihat baris ini di skrip peluncuran:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. Jadi, ini membuka 3 tab (cara lama yang baik), penggabungan otomatis penggabungan yang tidak bertentangan ke tengah, di mana bagian tengah adalah $ MERGED, dan akan digunakan sebagai output resolusi konflik.--output=<file>
atau-o <file>
, lihatmeld --help
Ada 4 file yang terlibat:
$LOCAL
File di cabang tempat Anda bergabung; tidak tersentuh oleh proses penggabungan saat ditunjukkan kepada Anda$REMOTE
File di cabang tempat Anda bergabung; tidak tersentuh oleh proses penggabungan saat ditunjukkan kepada Anda$BASE
Nenek moyang yang sama dari $ LOCAL dan $ REMOTE, yaitu. titik di mana kedua cabang mulai mengalihkan file yang dianggap; tidak tersentuh oleh proses penggabungan saat ditunjukkan kepada Anda$MERGED
File yang sebagian digabungkan, dengan konflik; ini adalah satu-satunya file yang disentuh oleh proses penggabungan dan, sebenarnya, tidak pernah ditampilkan kepada Anda dimeld
The
$MERGED
berkas adalah salah satu yang berisi<<<<<<
,>>>>>>
,=====
(dan, mungkin,||||||
) penanda (bahwa konflik membatasi). Ini adalah file yang Anda edit secara manual untuk memperbaiki konflik.Pengeditan konflik manual dan pengeditan konflik visual dilakukan pada file yang berbeda dan menyajikan informasi yang berbeda.
Bila menggunakan mergetool (menganggap
meld
), file yang melihat di dalamnya adalah:$LOCAL
,$BASE
,$REMOTE
. Perhatikan bahwa Anda tidak melihat$MERGED
file, meskipun ini dilewatkan sebagai parameter tersembunyimeld
untuk menulis hasil edit di sana.Dengan kata lain, dalam
meld
, Anda mengedit file di tengah,$BASE
file, dan Anda memilih semua perubahan dari kiri atau dari kanan secara manual . Ini adalah file bersih, tidak tersentuh oleh proses penggabungan. Satu-satunya kesalahan adalah bahwa, ketika Anda menyimpan, Anda tidak menyimpan ke dalam$BASE
file, tetapi dalam parameter tersembunyi keempatmeld
, yaitu$MERGED
file (yang bahkan tidak Anda lihat). The$BASE
File tidak tidak mengandung konflik atau gabungan berhasil parsial karena itu bukan$MERGED
berkas .Dalam pengeditan visual, saat menyajikan kepada Anda
$BASE
file (bukan$MERGED
file)git
pada dasarnya membuang semua upayanya untuk melakukan penggabungan (upaya-upaya itu terlihat, jika Anda mau, dalam file $ MERGED) dan memungkinkan Anda untuk sepenuhnya melakukan penggabungan. dari awal .Intinya adalah bahwa dalam konflik penggabungan manual dan visual Anda tidak melihat file yang sama, tetapi hasil akhirnya ditulis dalam file yang sama (yaitu
$MERGED
file).Koreksi manual dari konflik dilakukan pada
$MERGED
karenagit
tidak memiliki berarti untuk hadir Anda tiga file, sehingga squashes informasi dari tiga file ($LOCAL
,$BASE
,$REMOTE
) dalam$MERGED
berkas.Tapi alat visual memiliki sarana untuk menunjukkan tiga file: mereka menunjukkan
$LOCAL
,$BASE
,$REMOTE
file. Anda memilih perubahan dari$LOCAL
dan$REMOTE
file dan Anda membawa itu ke dalam$BASE
file, benar-benar membangun kembali dan bahkan menimpa upaya gagal untuk menggabungkan itu adalah$MERGED
file.sumber
$LOCAL
,$REMOTE
,$BASE
dan output awalnya sama untuk$BASE
, tetapi yang berbeda dari$MERGED
dalam bahwa ia tidak memiliki upaya git untuk menggabungkan file dan spidol konflik dan sebagainya. Bahkan, itu akan menjadi cara untuk menggunakan alat-alat ini yang paling mirip dengan pendekatan 3-pane dari LOCAL / REMOTE / BASE + OUTPUT, yang tidak menunjukkan penggabungan. Panel 4 hanya memungkinkan Anda untuk memisahkan basis dari output.Solusi Cosmin berfungsi, tetapi file $ BASE diperbarui - bukan $ MERGED . Ini akan memperbarui file $ MERGED :
Meld:
v1.8.4
sumber
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
pada akhirnya? bagi saya pada 1.8.4, ini berfungsi dengan baik (sejauh yang saya bisa lihat):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Dengan Meld 1.7 , Solusi oleh Tomek Bury tidak berfungsi lagi.
The pengaturan default tidak memuaskan saya:
Alih-alih untuk Meld> = 1,7, saya menyarankan salah satu dari dua solusi lain.
Solusi pertama :
Solusi kedua :
.gitconfig
Salin & tempel ini di
.gitconfig
file Anda untuk mendapatkan solusi seperti yang dijelaskan di atas:Salin & rekatkan ini dalam
.gitconfig.local
file untuk mengatur meld17 atau meld16 hanya untuk mesin ini jika Anda menggunakan .gitconfig pada beberapa mesin:sumber
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
, panel tengah akan menjadi $ DASAR, dan bukan $ MERGE yang sebenarnya digunakan sebagai output dari resolusi konflik.Saya menemukan bahwa tidak ada file default yang ditampilkan disimpan. berbaur ditampilkan
$LOCAL
,$REMOTE
dan$BASE
secara default. Untuk membuatnya bekerja, saya harus membuat pertunjukkan yang berbaur$MERGED
bukan$BASE
. Menempatkan ini di~/.gitconfig
fix saya untuk saya:Saya menggunakan Arch, dengan:
sumber
Untuk beberapa alasan, versi terbaru berbaur tidak menampilkan garis penanda yang ditambahkan untuk konflik (<<<<<<<, =======, >>>>>>>). Jika Anda ingin melihat baris-baris itu, Anda harus menginstal meld v 1.3.3 atau sebelumnya.
sumber
Silakan lihat jawaban Saad untuk jawaban yang benar.
Dengan berbaur 1.8.1 di Ubuntu saya mendapatkan
dan menambahkan --output sebelum $ MERGED memperbaikinya untuk saya:
sumber