Saya baru-baru belajar bahwa ketika menggabungkan dua cabang di git, jika ada perubahan pada dua baris yang berdekatan git menyatakan ini sebagai konflik. Misalnya, jika file test.txt
memiliki konten ini:
Line 1: A
Line 2: B
Line 3: C
Line 4: D
dan di cabang master
kita ubah ini menjadi
Line 1: A
Line 2: B1
Line 3: C
Line 4: D
sementara di cabang testing
kita ubah ini menjadi
Line 1: A
Line 2: B
Line 3: C1
Line 4: D
dan kemudian mencoba untuk menggabung testing
ke dalam master
, git menyatakan gabungan konflik. Harapan naif saya adalah bahwa merger akan terjadi tanpa konflik dan menghasilkan ini:
Line 1: A
Line 2: B1
Line 3: C1
Line 4: D
Saya yakin ada alasan bagus mengapa git tidak bergabung dengan cara ini. Adakah yang bisa menjelaskan alasan ini?
Jawaban:
Dengan asumsi bahwa potongan kode ini
telah diubah dalam satu cabang menjadi ini
dan di cabang lain ke dalam ini
maka saya tidak ingin git menggabungkannya dengan ini
tanpa membuatku khawatir.
Untuk menghindari menyebabkan masalah seperti itu, git biasanya menolak untuk secara otomatis menggabungkan perubahan menyentuh garis terdekat. Ini memberi Anda kesempatan untuk memverifikasi apakah logika program akan rusak atau tidak.
Contoh ini sepele, tetapi ketika menggabungkan cabang besar risiko konflik "logis" serupa jauh lebih besar. Kadang-kadang saya bahkan ingin konteksnya menjadi lebih besar daripada saat ini.
sumber
Apakah ini hanya perilaku git?
Setelah berdiskusi dengan seorang kolega, saya baru mencoba, dan SVN menanganinya tanpa masalah: Anda mendapatkan 2 baris yang dimodifikasi.
Kemampuan gabungan dari beberapa VCS diuji di sini untuk bazaar, darcs, git, dan lincah : https://github.com/mndrix/merge-this
Tampaknya hanya darcs yang berhasil menggabungkan kasus "garis yang berbatasan".
Menerapkan perubahan yang berdekatan ke file bukanlah masalah yang sulit. Saya benar-benar berpikir perilaku ini telah dipilih dengan sengaja.
Mengapa seseorang memutuskan bahwa memodifikasi garis yang berdekatan menghasilkan konflik?
Saya akan berpikir ini untuk memaksa Anda melihatnya .
Modif nomor 1, pada master:
Modif nomor 2, digabung dari cabang:
Setelah bergabung, Anda tidak menginginkan itu:
Melihat perilaku ini sebagai fitur
Anda dapat mengubah perilaku penggabungan git menjadi keuntungan. Ketika Anda perlu menjaga 2 baris konsisten tetapi Anda tidak dapat mendeteksinya (pada waktu kompilasi, di awal tes Anda atau yang lain), Anda dapat mencoba untuk bergabung dengannya.
Tulis ulang ini ...:
...untuk ini:
Jadi ketika Anda menggabungkan Modif 1 ...:
... dengan Modif 2 ...:
..., git akan menghasilkan konflik, dan Anda akan memaksa Anda untuk melihatnya.
sumber
Aku kebanyakan menebak, tapi saya pikir itu ada hubungannya dengan baris 2 digunakan sebagai konteks untuk baris 3 perubahan.
Git tidak bisa hanya mengatakan bahwa "Baris dengan C menjadi garis dengan C1" karena mungkin ada baris lain dengan "C", jadi ia mengatakan "Baris dengan C, itu tepat setelah awal file, baris dengan A, dan garis dengan B, sekarang C1 "
Jika "baris dengan B" tidak ada lagi di sana, maka beberapa konteksnya hilang, dan git hanya dapat mengetahui secara kasar ke mana baris baru harus pergi.
sumber
Jawaban yang lain di sini adalah semua tentang hal, tetapi bagi saya ini selalu tampak seperti pembatasan yang tidak perlu.
Seperti orang lain berkata, dalam kasus ini Anda pasti akan tidak ingin Git menggabungkan garis tanpa peringatan.
Tetapi saya masih menginginkan opsi untuk melakukannya secara otomatis, setelah diperingatkan. Jadi saya menulis sopir gabungan git kustom yang bisa menggabungkan konflik pada yang berdekatan (atau individu) garis interaktif:
Ini menghemat banyak waktu, karena saya mengelola proyek di mana orang sering mengerjakan file yang sama dan refactoring banyak kode.
Skrip tersedia di GitHub di bawah lisensi GPLv3 +. Mungkin Anda akan merasakan manfaatnya:
https://github.com/paulaltin/git-subline-merge
sumber