Versi file git mana yang akhirnya akan digunakan: LOCAL, BASE atau REMOTE?


174

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?

Jawaban:


142

Ini adalah salah satu di tengah: BASE.

Sebenarnya, BASEbukan leluhur yang sama, tetapi penggabungan setengah jadi di mana konflik ditandai dengan >>>>dan <<<<.

Anda dapat melihat nama file di bagian atas jendela edit berbaur.

Lihat tangkapan layar di sini

basis berbaur

Anda dapat mengedit BASEfile seperti yang Anda inginkan dengan atau tanpa menggunakan perintah berbaur.
Anda juga dapat menghilangkan berbaur dan hanya mengedit file dengan editor teks favorit Anda.

  • Kode antara <<<< HEADdan =====penanda adalah salah satu file lokal Anda sebelum penggabungan.
  • Kode antara ====dan >>>> <branch name>merupakan salah satu file jarak jauh.

3
Beberapa orang mendapatkan pemahaman yang lebih baik tentang potongan yang saling bertentangan dalam file yang gagal penggabungan otomatis jika mereka memiliki merge.conflictstyleopsi konfigurasi yang disetel diff3sebagai ganti default merge.
kostix

3
Saya sebenarnya tidak melihat KEPALA, <<< dan === bernyanyi. Jika Anda menyediakan jendela tengah akan kosong. Tapi itu hanya catatan untuk yang lain, terima kasih untuk jawaban Anda.
tsusanka

Jika Anda tidak melihat 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"
Fabien Quatravaux

10
Ketika saya melakukan penggabungan dengan Meld, saya juga tidak melihat <<<<<<, ======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 adalah X.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.
Teemu Leisti

3
BASE sebenarnya adalah nenek moyang yang sama, MERGED adalah nama file dengan informasi penggabungan parsial di dalamnya. Silakan lihat pertanyaan dan jawaban saya Menyiapkan dan menggunakan Meld sebagai git difftool dan mergetool Anda yang menjelaskan dengan tepat cara kerjanya. HTH.
mattst

107

Meld memiliki fitur penggabungan 3-arah tersembunyi yang diaktifkan dengan mengirimkan parameter ke-4:

meld $LOCAL $BASE $REMOTE $MERGED

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:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

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:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @ lumbric, tampaknya versi baru dari berbaur menggunakan bendera --outputuntuk hasil $ MERGED. Saya menemukan ini sambil melihat skrip peluncuran berbarengan
Johann

1
@umbric Saya yakin, untuk Meld 1.7.x + dengan --output option. Lihat baris ini di skrip peluncuran:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
Dalam perpaduan terbaru (versi> 1.8.4), kita harus menggunakan opsi --auto-merge. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE --output $
MERGED

7
Saya memiliki masalah yang sama dengan @pingpongboss menggunakan Meld 1.8.4: Meld membuka berbagai hal di panel terpisah, alih-alih membuka tab ke-3. Perintah denda akhirnya bekerja adalah: 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.
farmir

2
Sintaks untuk output mungkin --output=<file>atau -o <file>, lihatmeld --help
levsa

57

Ada 4 file yang terlibat:

  1. $LOCALFile di cabang tempat Anda bergabung; tidak tersentuh oleh proses penggabungan saat ditunjukkan kepada Anda

  2. $REMOTEFile di cabang tempat Anda bergabung; tidak tersentuh oleh proses penggabungan saat ditunjukkan kepada Anda

  3. $BASENenek 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

  4. $MERGEDFile yang sebagian digabungkan, dengan konflik; ini adalah satu-satunya file yang disentuh oleh proses penggabungan dan, sebenarnya, tidak pernah ditampilkan kepada Anda dimeld


The $MERGEDberkas 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 $MERGEDfile, meskipun ini dilewatkan sebagai parameter tersembunyi melduntuk menulis hasil edit di sana.

Dengan kata lain, dalam meld, Anda mengedit file di tengah, $BASEfile, 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 $BASEfile, tetapi dalam parameter tersembunyi keempat meld, yaitu $MERGEDfile (yang bahkan tidak Anda lihat). The $BASEFile tidak tidak mengandung konflik atau gabungan berhasil parsial karena itu bukan $MERGEDberkas .

Dalam pengeditan visual, saat menyajikan kepada Anda $BASEfile (bukan $MERGEDfile) gitpada 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 $MERGEDfile).

Koreksi manual dari konflik dilakukan pada $MERGEDkarena git tidak memiliki berarti untuk hadir Anda tiga file, sehingga squashes informasi dari tiga file ( $LOCAL, $BASE, $REMOTE) dalam $MERGEDberkas.

Tapi alat visual memiliki sarana untuk menunjukkan tiga file: mereka menunjukkan $LOCAL, $BASE, $REMOTEfile. Anda memilih perubahan dari $LOCALdan $REMOTEfile dan Anda membawa itu ke dalam $BASEfile, benar-benar membangun kembali dan bahkan menimpa upaya gagal untuk menggabungkan itu adalah $MERGEDfile.


Saya hanya ingin ada alat-alat (misalnya yang tidak bisa dibandingkan) yang menampilkan semua 4 file
yoniLavi

@yoniYalovitsky: ya, atau p4merge
user1284631

Saya dulu menggunakan alat gabungan dari paket ClearCase
mishmashru

@ yoniLavi - alat ini menunjukkan 4 panel , tetapi tidak harus keempat file seperti yang dijelaskan dalam jawaban ini. Secara khusus, Anda dapat mengatur alat-alat 4-panel menunjukkan $LOCAL, $REMOTE, $BASEdan output awalnya sama untuk $BASE, tetapi yang berbeda dari $MERGEDdalam 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.
BeeOnRope

16

Solusi Cosmin berfungsi, tetapi file $ BASE diperbarui - bukan $ MERGED . Ini akan memperbarui file $ MERGED :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

Saya dapat mengkonfirmasi ini. Solusi Saad bekerja untuk saya di Ubuntu. Sejauh pertanyaan awal, ini adalah jawaban yang benar saat ini.
cosmin

3
Dalam versi saya berbaur - 3,11, perintah ini berfungsi dengan baik:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

mengapa Anda perlu --diff $BASE $LOCAL --diff $BASE $REMOTEpada 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
farmir

1
@armir: Tidak perlu. Ini membuka dua tab lagi dalam berbaur sehingga Anda dapat melihat LOCAL dan REMOTE dibandingkan dengan BASE secara individual.
Sam Kauffman

1
Tidak peduli urutan apa yang saya coba dengan argumen itu, tab tiga arah selalu merupakan tab ketiga, sedangkan tab pertama selalu dipilih secara default. Apakah ada cara untuk membuat tab tiga arah dipilih secara default?
Sam Kauffman

13

Dengan Meld 1.7 , Solusi oleh Tomek Bury tidak berfungsi lagi.

The pengaturan default tidak memuaskan saya:

Pengaturan default

Alih-alih untuk Meld> = 1,7, saya menyarankan salah satu dari dua solusi lain.

Solusi pertama :

 meld $LOCAL $BASE $REMOTE --auto-merge

solusi pertama

Solusi kedua :

 meld $LOCAL $MERGED $REMOTE

solusi kedua

.gitconfig

Salin & tempel ini di .gitconfigfile Anda untuk mendapatkan solusi seperti yang dijelaskan di atas:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Salin & rekatkan ini dalam .gitconfig.localfile untuk mengatur meld17 atau meld16 hanya untuk mesin ini jika Anda menggunakan .gitconfig pada beberapa mesin:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

Ini tidak berfungsi di Meld 1.8.4. Jika Anda menjalankan cmd = meld $LOCAL $BASE $REMOTE --auto-merge, panel tengah akan menjadi $ DASAR, dan bukan $ MERGE yang sebenarnya digunakan sebagai output dari resolusi konflik.
farmir

1
@farmir Anda memilih $ BASE sebagai tab kedua.
Alex78191

11

Saya menemukan bahwa tidak ada file default yang ditampilkan disimpan. berbaur ditampilkan $LOCAL, $REMOTEdan $BASEsecara default. Untuk membuatnya bekerja, saya harus membuat pertunjukkan yang berbaur $MERGEDbukan $BASE. Menempatkan ini di ~/.gitconfigfix saya untuk saya:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Saya menggunakan Arch, dengan:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

Maaf, apakah konfigurasi ini tidak kompatibel?
MadMad666

2

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.


Saya menemukan jawaban yang berguna dari @lumbric stackoverflow.com/a/22911793/641892
wnasich

2

Silakan lihat jawaban Saad untuk jawaban yang benar.

Dengan berbaur 1.8.1 di Ubuntu saya mendapatkan

jumlah argumen salah yang diberikan ke --diff

dan menambahkan --output sebelum $ MERGED memperbaikinya untuk saya:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
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.