Lebih
Cara mengatasi menggabungkan konflik di Git
Bagaimana cara mengatasi menggabungkan konflik di Git?
4577
35
Bagaimana cara mengatasi menggabungkan konflik di Git?
Coba:
git mergetool
Terbuka GUI yang langkah anda melalui setiap konflik, dan anda bisa memilih bagaimana untuk menggabungkan. Kadang-kadang hal ini membutuhkan sedikit tangan editing setelah itu, tapi biasanya itu's cukup dengan sendirinya. Hal ini jauh lebih baik daripada melakukan semuanya dengan tangan tentunya.
Sebagai per @JoshGlover komentar:
Perintah doesn't selalu membuka GUI kecuali jika anda menginstal satu. Menjalankan git mergetool
untuk saya menghasilkan
vimdiffyang digunakan. Anda dapat menginstal salah satu dari alat-alat berikut untuk menggunakannya bukan:
berbaur,
opendiff,
kdiff3,
tkdiff,
xxdiff,
tortoisemerge,
gvimdiff,
meredakan,
socius,
p4merge,
araxis,
vimdiff,
muncul`.Di bawah ini adalah contoh prosedur untuk menggunakan
vimdiff
untuk menyelesaikan menggabungkan konflik. Berbasis di link iniLangkah 1: Jalankan perintah berikut di terminal anda
Ini akan mengatur vimdiff sebagai default merge.
Langkah 2: Jalankan perintah berikut di terminal
Langkah 3: Anda akan melihat vimdiff tampilan dalam format berikut
Ini 4 views
Anda dapat menavigasi di antara pandangan-pandangan ini menggunakan pilih+w. Anda dapat langsung mencapai DIGABUNG lihat menggunakan pilih+w diikuti oleh j.
Info lebih lanjut tentang vimdiff navigasi di sini dan di sini
Langkah 4. Anda bisa mengedit DIGABUNG melihat cara berikut
Jika anda ingin mendapatkan perubahan dari jarak JAUH
Jika anda ingin mendapatkan perubahan dari BASIS
Jika anda ingin mendapatkan perubahan dari LOKAL
Langkah 5. Save, Exit, dan Melakukan bersih-Bersih
:wqa
simpan dan keluar dari vigit commit-m "pesan"`
git
bersih
Menghapus file-file tambahan (misalnya *.orig) yang dibuat oleh diff alat.Berikut ini's kemungkinan-kasus penggunaan, dari atas:
Anda'kembali akan melakukan beberapa perubahan, tapi oops, anda're tidak up to date:
Jadi anda mendapatkan up-to-date dan mencoba lagi, tapi memiliki konflik:
Jadi anda memutuskan untuk mengambil melihat perubahan:
Oh my, oh my, hulu mengubah beberapa hal, tetapi hanya menggunakan perubahan saya...tidak...mereka berubah...
Dan kemudian kami mencoba akhir waktu
Ta-da!
Saya menemukan menggabungkan alat-alat yang jarang membantu saya memahami konflik atau resolusi. I'm biasanya lebih sukses melihat konflik spidol di editor teks dan menggunakan git log sebagai suplemen.
Berikut ini adalah beberapa tips:
Tip Satu
Hal terbaik yang saya telah menemukan adalah dengan menggunakan "diff3" konflik gabungan gaya:
git config bergabung.conflictstyle diff3
Hal ini menghasilkan konflik penanda seperti ini:
Bagian tengah adalah apa yang nenek moyang tampak seperti. Hal ini berguna karena anda bisa membandingkannya dengan bagian atas dan bawah versi untuk mendapatkan rasa yang lebih baik dari apa yang berubah pada masing-masing cabang, yang memberi anda ide yang lebih baik untuk apa tujuan dari masing-masing perubahan itu.
Jika konflik ini hanya beberapa baris, ini umumnya membuat konflik yang sangat jelas. (Mengetahui bagaimana untuk memperbaiki konflik sangat berbeda; anda perlu menyadari apa yang orang lain kerjakan. Jika anda're bingung, it's mungkin yang terbaik untuk hanya memanggil orang itu ke kamar anda sehingga mereka dapat melihat apa yang anda're melihat.)
Jika konflik lagi, maka saya akan cut dan paste masing-masing dari tiga bagian menjadi tiga berkas terpisah, seperti "saya", "biasa" dan "mereka".
Kemudian saya dapat menjalankan perintah berikut untuk melihat dua diff bakhil yang menyebabkan konflik:
Ini tidak sama dengan menggunakan gabungan alat, karena menggabungkan alat ini akan mencakup semua dari non-konflik diff bakhil terlalu. Saya menemukan bahwa untuk menjadi mengganggu.
Tip Dua
Seseorang yang sudah disebutkan ini, tetapi memahami maksud di balik setiap diff cowok umumnya sangat membantu untuk memahami di mana konflik datang dari dan bagaimana untuk menangani hal itu.
Mengidentifikasi file yang konflik (Git harus memberitahu anda ini).
Buka masing-masing file dan memeriksa bedanya; Git demarcates mereka. Mudah-mudahan itu akan menjadi jelas versi mana dari masing-masing blok untuk menjaga. Anda mungkin perlu untuk membicarakan hal ini dengan rekan-rekan pengembang yang berkomitmen kode.
Setelah anda've diselesaikan konflik dalam sebuah file
git add the_file
.Setelah anda've diselesaikan semua konflik, melakukan
git rebase --melanjutkan
atau apapun perintah Git kata yang harus dilakukan ketika anda selesai.Memeriksa jawaban di Stack Overflow pertanyaan Batal gabungan di Git, terutama Charles Bailey's jawaban yang menunjukkan bagaimana untuk melihat versi yang berbeda dari file dengan masalah, misalnya,
Gabungan konflik terjadi ketika perubahan yang dibuat ke file pada waktu yang sama. Berikut adalah cara untuk memecahkan itu.
git
CLIBerikut ini adalah langkah-langkah sederhana apa yang harus dilakukan ketika anda mendapatkan dalam keadaan konflik:
git status
(di bawahUnmerged jalan
bagian).Menggunakan GUI untuk memecahkan konflik:
git mergetool
(cara termudah).Untuk menerima remote/versi lain, menggunakan:
git checkout --mereka path/file
. Ini akan menolak setiap perubahan lokal anda lakukan untuk file itu.Untuk menerima lokal/versi kami, menggunakan:
git checkout --kita path/file
Namun anda've untuk berhati-hati, seperti remote perubahan yang konflik dilakukan untuk beberapa alasan.
Terkait: https://stackoverflow.com/q/25576415/55075
Edit file yang konflik secara manual dan mencari kode blok antara
<<<<<
/>>>>>
kemudian pilih versi kedua dari atas atau bawah=====
. Lihat: Bagaimana konflik yang disajikan.Path dan nama file konflik dapat diselesaikan dengan
git add
/git rm
.git status
.Jika anda masih memiliki file-file di bawah
Unmerged jalan
, dan kau berhasil memecahkan konflik secara manual, kemudian biarkan Git tahu bahwa anda dipecahkan oleh:git add path/file
.git commit-a
dan push ke remote seperti biasa.Lihat juga: Penyelesaian konflik gabungan dari command line di GitHub
Untuk tutorial praktis, cek: Skenario 5 - Memperbaiki Gabungan Konflik dengan Katacoda.
DiffMerge
I've berhasil digunakan DiffMerge yang secara visual dapat membandingkan dan menggabungkan file pada Windows, macOS dan Linux/Unix.
Secara grafis dapat menunjukkan perubahan antara 3 file dan memungkinkan penggabungan otomatis (jika aman untuk melakukannya) dan kontrol penuh atas mengedit file yang dihasilkan.
sumber Gambar: DiffMerge (Linux screenshot)
Hanya men-download dan menjalankan di repo sebagai:
macOS
Pada macOS dapat anda instal melalui:
Dan mungkin (jika tidak tersedia), anda perlu tambahan berikut pembungkus sederhana ditempatkan di JALAN anda (misalnya
/usr/bin
):Kemudian anda dapat menggunakan pintasan keyboard berikut:
Atau anda dapat menggunakan opendiff (bagian dari Xcode alat-Alat) yang memungkinkan anda menggabungkan dua file atau direktori yang sama untuk membuat ketiga file atau direktori.
Jika anda're membuat kecil sering melakukan, kemudian mulai dengan melihat melakukan komentar dengan
git log --gabungan
. Kemudiangit diff
akan menunjukkan konflik.Untuk konflik yang melibatkan lebih dari beberapa baris, it's mudah untuk melihat apa yang's terjadi di eksternal GUI tool. Saya suka opendiff -- Git juga mendukung vimdiff, gvimdiff, kdiff3, tkdiff, berbaur, xxdiff, muncul keluar dari kotak dan anda dapat menginstal lain:
git config bergabung.alat "anda.alat"
akan mengatur alat pilihan anda dan kemudiangit mergetool
setelah gagal bergabung akan menunjukkan bedanya dalam konteks.Setiap kali anda mengedit file untuk menyelesaikan konflik,
git add file
akan memperbarui indeks dan anda diff tidak akan lagi menunjukkan hal itu. Ketika semua konflik yang ditangani dan file mereka telahgit add
-ed,git commit
akan menyelesaikan anda bergabung.Melihat Bagaimana Konflik Presented atau, dalam Git, yang
git merge
dokumentasi untuk memahami apa yang menggabungkan konflik spidol.Juga, Cara untuk Menyelesaikan Konflik bagian ini menjelaskan cara mengatasi konflik:
Anda juga dapat membaca tentang konflik gabungan spidol dan cara mengatasinya di Pro Git bagian buku Dasar Menggabungkan Konflik.
Untuk Emacs pengguna yang ingin menyelesaikan menggabungkan konflik semi-manual:
menunjukkan semua file yang memerlukan resolusi konflik.
Buka masing-masing file satu per satu atau semua sekaligus dengan:
Ketika mengunjungi sebuah penyangga yang membutuhkan suntingan dalam Emacs, jenis
Ini akan membuka tiga buffer (saya, mereka, dan output buffer). Menavigasi dengan menekan 'n' (berikutnya wilayah), 'p' (ramalan wilayah). Tekan 'a' dan 'b' untuk salinan tambang atau wilayah mereka ke output buffer, masing-masing. Dan/atau mengedit output buffer ini diatas.
Ketika selesai: Tekan 't'. Emacs meminta anda jika anda ingin menyimpan buffer ini: ya. Setelah menyelesaikan penyangga menandainya sebagai diselesaikan dengan menjalankan dari teriminal:
Setelah selesai dengan semua jenis buffer
untuk menyelesaikan penggabungan.
Aku juga ingin saya atau versi mereka secara penuh, atau ingin meninjau perubahan individu dan memutuskan untuk masing-masing dari mereka.
Sepenuhnya menerima saya atau mereka version:
Menerima versi saya (lokal, kita):
Menerima versi mereka (remote, mereka):
Jika anda ingin melakukan untuk semua konflik file jalankan:
atau
Review semua perubahan dan menerima mereka secara individual
git mergetool
git add <file>
git commit-m "digabung bla bla"
Default
mergetool
bekerja di command line. Bagaimana menggunakan baris perintah mergetool harus terpisah pertanyaan.Anda juga dapat menginstal alat bantu visual untuk hal ini, misalnya
berbaur
dan menjalankanIni akan membuka versi lokal (milik kita), "tempat" atau "merger" versi (saat ini hasil dari penggabungan) dan remote (versi mereka). Menyimpan digabung versi ketika anda selesai, jalankan
git mergetool -t berbaur
lagi sampai anda mendapatkan "Tidak ada file yang perlu penggabungan", kemudian pergi ke Langkah 3. dan 4.Hanya, jika anda tahu dengan baik bahwa perubahan pada salah satu repositori yang tidak penting, dan ingin menyelesaikan semua perubahan dalam mendukung yang lain, gunakan:
untuk mengatasi perubahan dalam mendukung repositori anda, atau
untuk mengatasi perubahan dalam mendukung lain atau repositori utama.
Atau yang lain anda akan memiliki untuk menggunakan GUI merge untuk langkah melalui file satu per satu, mengatakan penggabungan alat
p4merge
, atau menulis satu's nama anda've sudah diinstaldan setelah menyelesaikan sebuah file, anda akan memiliki untuk menyimpan dan menutup, sehingga berikutnya akan terbuka.
Silakan ikuti langkah-langkah berikut untuk memperbaiki gabungan konflik di Git:
Periksa Git status: git status
Mendapatkan patchset: git fetch (checkout hak patch dari Git commit)
Checkout cabang lokal (temp1 dalam contoh saya di sini): git checkout -b temp1
Tarik beberapa isi dari master: git pull --rebase asal master
Mulai mergetool dan memeriksa konflik dan memperbaikinya...dan memeriksa perubahan dalam cabang terpencil dengan anda saat ini cabang: git mergetool
Memeriksa status lagi: git status
Menghapus file yang tidak diinginkan secara lokal dibuat oleh mergetool, biasanya mergetool menciptakan tambahan file dengan *.orig ekstensi. Silahkan hapus file yang duplikat dan memperbaiki perubahan secara lokal dan menambahkan versi yang benar dari file anda. git add #your_changed_correct_files
Memeriksa status lagi: git status
Melakukan perubahan untuk commit sama id (hal ini untuk menghindari baru yang terpisah patch set): git commit-mengubah
Mendorong untuk menguasai cabang: git push (ke repositori Git)
Bonus:
Dalam berbicara tarik/ambil/gabung di atas jawaban ini, saya ingin berbagi aplikasi yang menarik dan produktif trik,
git pull --rebase
Ini perintah di atas adalah yang paling berguna perintah di git kehidupan yang menyimpan banyak waktu.
Sebelum mendorong anda baru saja melakukan perubahan ke remote server, coba
git pull --rebase
agakgit pull
manualmenggabungkan
dan secara otomatis akan sync terbaru server remote perubahan (dengan mengambil + merge) dan akan menempatkan anda lokal terbaru komit di atas dalam git log. Tidak perlu khawatir tentang manual pull/merge.Dalam kasus konflik, hanya menggunakan
Menemukan rincian di: http://gitolite.com/git-pull--rebase
Ada 3 langkah:
git status
<<<<<<<<head blablabla
git add solved_conflicts_files git commit-m 'menggabungkan msg'
Anda bisa memperbaiki gabungan konflik dalam sejumlah cara lain yang telah rinci.
Saya pikir kuncinya adalah mengetahui bagaimana perubahan aliran dengan lokal dan remote repositori. Kunci untuk ini adalah pemahaman pelacakan cabang. Saya telah menemukan bahwa saya pikir pelacakan cabang sebagai 'bagian yang hilang di tengah' antara aku lokal saya, sebenarnya file dan direktori remote didefinisikan sebagai asal.
I've pribadi masuk ke kebiasaan dari 2 hal untuk membantu menghindari hal ini.
Bukannya:
Yang memiliki dua kelemahan -
a) Semua baru/mengubah file yang ditambahkan dan yang mungkin mencakup beberapa perubahan yang tidak diinginkan. b) Anda don't mendapatkan ulasan daftar file pertama.
Jadi, bukannya saya lakukan:
Dengan cara ini anda lebih disengaja tentang file yang akan ditambahkan dan anda juga bisa meninjau daftar dan berpikir sedikit lebih banyak saat menggunakan editor pesan. Saya menemukan hal ini juga meningkatkan saya melakukan pesan ketika saya menggunakan editor layar penuh daripada
-m
pilihan.[Update - seperti waktu telah berlalu aku've beralih lebih ke:
]
Juga (dan lebih relevan untuk situasi anda), saya mencoba untuk menghindari:
atau
karena tarik menyiratkan gabungan dan jika anda memiliki perubahan lokal yang anda didn't ingin bergabung, anda dapat dengan mudah berakhir dengan bergabung kode dan/atau gabungan konflik untuk kode yang seharusnya't telah bergabung.
Bukannya saya mencoba untuk melakukan
Anda juga dapat menemukan ini berguna:
https://stackoverflow.com/questions/3329943/git-branch-fork-fetch-merge-rebase-and-clone-what-are-the-differences/9204499#9204499
CoolAJ86's jawaban meringkas segala sesuatu cukup banyak. Dalam kasus anda memiliki perubahan di kedua cabang-cabang di bagian yang sama dari kode yang anda akan memiliki untuk melakukan manual gabungan. Membuka file dalam konflik di editor teks apapun dan anda harus melihat struktur berikut.
Tampaknya tidak selalu bekerja untuk saya dan biasanya berakhir menampilkan setiap melakukan yang berbeda antara dua cabang, hal ini terjadi bahkan ketika menggunakan
--
untuk memisahkan path dari perintah.Apa yang saya lakukan untuk mengatasi masalah ini adalah membuka dua baris perintah dan dalam satu run
dan di lain
Mengganti
$MERGED_IN_BRANCH
dengan cabang saya bergabung di[path]
dengan file yang saling bertentangan. Perintah ini akan mencatat semua komit, dalam bentuk patch, antara (..
) dua komit. Jika anda meninggalkan satu sisi kosong seperti pada perintah di atas git secara otomatis akan menggunakanKEPALA
(cabang anda adalah penggabungan ke dalam kasus ini).Ini akan memungkinkan anda untuk melihat apa yang berkomitmen pergi ke file dalam dua cabang setelah mereka menyimpang. Hal ini biasanya membuat lebih mudah untuk menyelesaikan konflik.
Pada tanggal 12 desember 2016, anda dapat menggabungkan cabang dan menyelesaikan konflik di github.com
Dengan demikian, jika anda don't ingin menggunakan command-line atau pihak ke-3 alat-alat yang ditawarkan di sini lebih tua dari jawaban, pergi dengan GitHub's asli alat.
Posting blog ini menjelaskan secara detail, tapi dasar-dasar yang pada 'penggabungan' dua cabang melalui UI, sekarang anda akan melihat 'menyelesaikan konflik' opsi yang akan membawa anda ke sebuah editor yang memungkinkan anda untuk berurusan dengan ini menggabungkan konflik.
Menggunakan
kesabaran
I'm terkejut tidak ada orang lain yang berbicara tentang penyelesaian konflik menggunakan
kesabaran
dengan menggabungkan rekursif strategi. Untuk menggabungkan konflik, menggunakankesabaran
memberikan hasil yang baik bagi saya. Idenya adalah bahwa ia akan mencoba untuk mencocokkan blok daripada garis individu.Jika anda mengubah indentasi dari program anda misalnya, default Git merge strategi kadang-kadang pertandingan tunggal kurawal
{
yang termasuk fungsi yang berbeda. Hal ini dihindari dengankesabaran
:Dari dokumentasi:
Dibandingkan dengan nenek moyang yang sama
Jika anda memiliki konflik gabungan dan ingin melihat apa yang orang lain miliki dalam pikiran ketika memodifikasi cabang, it's kadang-kadang lebih mudah untuk membandingkan cabang mereka langsung dengan nenek moyang yang sama (bukan cabang kami). Untuk itu anda dapat menggunakan
menggabungkan basis
:Biasanya, anda hanya ingin melihat perubahan untuk file tertentu:
Saya selalu ikuti langkah-langkah berikut untuk menghindari konflik.
Sekarang anda bisa melakukan hal yang sama dan memiliki banyak cabang lokal anda inginkan dan bekerja secara simultan saya hanya melakukan git checkout ke cabang anda ketika pernah diperlukan.