Kısa cevap
Git merge çakışması, iki dalın aynı dosyanın aynı bölümünü değiştirmesi durumunda ortaya çıkar. Çakışma işaretlerini içeren dosyaları açarak, değişiklikleri elle seçerek veya birleştirerek, kaydederek, `git add` çalıştırarak ve `git commit` veya `git merge --continue` ile bitirerek çözülür. Kafanız karışırsa, `git merge --abort` her şeyi birleştirme öncesi duruma döndürür.
Sorun nasıl anlaşılır
- Terminalde `CONFLICT (content): Merge conflict in ...` mesajı
- Dosyalarda `<<<<<<<`, `=======`, `>>>>>>>` işaretleri bulunması
- `git status` komutunun "Unmerged paths" altında dosyaları göstermesi
- Birleştirmenin başlatılmış ancak tamamlanmamış olması, `git log` yeni bir commit göstermemesi
- Düzenleyici veya IDE'nin çakışma olan satırlarda kırmızı işaretçiler göstermesi
En yaygın nedenler
İki dalda aynı dosya bölümünün değiştirilmesi
İki dal aynı kod satırlarını veya aynı metin bloğunu değiştirdi, bu nedenle Git hangi sürümün doğru olduğuna otomatik olarak karar veremiyor.
Bir dalda dosyanın silinmesi veya taşınması
Dosya bir dalda silinmiş, diğerinde değiştirilmişse, Git modify/delete çakışması bildirir.
Aynı dal üzerinde eşzamanlı çalışma
İki geliştirici en son değişiklikleri çekmeden aynı dosyayı değiştirdi, bu nedenle birleştirme sırasında çakışma tespit edilir.
Özelleştirilmiş birleştirme ayarları
`.gitattributes` veya özel birleştirme sürücüleri, Git'in değişiklikleri nasıl ele aldığını ve çakışmayı ne zaman bildireceğini etkileyebilir.
Adım adım çözüm
- 1
Depo durumunu kontrol edin
git statuskomutunu çalıştırın. Çakışma olan dosyalar "Unmerged paths" altında listelenecektir. Bunları not edin veya proje kök dizininde bir terminal açın. Ne yapmak istediğinize karar verene kadar birleştirmeyi iptal etmeyin. - 2
Çakışma olan dosyayı açın
Listedeki her dosyayı düzenleyicide açın.
<<<<<<< HEAD,=======ve>>>>>>> dal-adiişaretlerini arayın. Varsayılan stilde,<<<<<<<ile=======arasındaki bölüm mevcut dalınızdır,=======ile>>>>>>>arasındaki bölüm ise birleştirilen daldan gelir.diff3stili kullanıyorsanız,|||||||ile=======arasında ortak ata bölümü de bulunur. - 3
Değişiklikleri elle birleştirin
Tüm çakışma işaretlerini silin ve yalnızca istediğiniz kodu bırakın. Bir tarafı, diğerini veya her ikisini birleştirebilirsiniz. Parantezlere, virgüllere ve girintilere dikkat edin. Emin değilseniz, dosya geçmişini (
git log -- dosya) açarak kimin neyi değiştirdiğini görün. - 4
İncelemek için düzenleyici veya IDE kullanın
VS Code "Accept Current Change", "Accept Incoming Change" ve "Accept Both Changes" seçenekleri sunar; diğer düzenleyicilerde de benzer seçenekler vardır. Bu daha hızlıdır, ancak sonucu her zaman gözden geçirin. Kod mantığı çakışıyorsa her iki tarafı körü körüne kabul etmeyin.
- 5
Kaydedin ve çözüldü olarak işaretleyin
Dosyayı bitirdiğinizde kaydedin ve
git add dosya-adikomutunu çalıştırın. Listedeki tüm dosyalar için bunu tekrarlayın.git statusartık "All conflicts fixed but you are still merging" göstermelidir. - 6
Birleştirmeyi tamamlayın
git commit(mesajı düzenlemek istiyorsanız-molmadan) veyagit merge --continuekomutunu çalıştırın. Bu, birleştirme commit'i oluşturur. Birleştirmenin kaydedildiğini görmek içingit log --oneline -3komutunu kontrol edin. - 7
Push öncesi test edin
Derlemeyi ve testleri çalıştırın (
npm test,mvn testveya projenin kullandığı komut). Çakışma, yalnızca çalıştırma sırasında görülen bir hatayı gizleyebilir. Testler geçtikten sonragit pushyapın. - 8
Vazgeçmek isterseniz
git merge --abortkomutu çalışma dizinini birleştirme başlamadan önceki duruma döndürür. Önce değişiklikleri çekmenin veya bir meslektaşınıza danışmanın daha iyi olacağını düşünüyorsanız bunu kullanın. Kaydedilmemiş değişiklikleriniz varsagit reset --hardkullanmayın.
Çakışma çok büyük olduğunda
Dosyada onlarca çakışma bloğu varsa veya kodu anlamıyorsanız, rastgele taraf seçmeyin. Birleştirme öncesi durumu korumak istiyorsanız, birleştirmeye başlamadan önce yedek bir dal oluşturun (git branch yedegim); bu, çalışma dizinindeki kaydedilmemiş değişiklikleri korumaz. Birleştirmeye baştan başlıyorsanız, hedef dalda commit öncesi değişiklikleri incelemek için git merge --no-commit kullanabilirsiniz. Büyük çakışmalar için git config merge.conflictstyle diff3 ayarını etkinleştirmek faydalıdır; bu, ortak atayı da göstererek anlamayı kolaylaştırır. Çakışma ikili dosyaları içeriyorsa, Git bunları birleştiremez; bu durumda bir sürümü elle seçmeniz gerekir (git checkout --ours dosya veya --theirs), ardından git add dosya komutunu çalıştırın.
Tekrarlanmaması için
- Büyük bir işe başlamadan önce ana daldan sık sık değişiklik çekin (`git pull --rebase`).
- Değişiklikleri küçük ve tek bir göreve odaklı tutun; daha sık commit yapın.
- Ekipte kimin hangi dosyaları ve kod bölümlerini değiştireceğini kararlaştırın.
- Çakışmaları daha kolay anlamak için `git config merge.conflictstyle diff3` ayarını etkinleştirin.
Ne zaman uzmana başvurmalı
Çakışma onlarca dosyayı, ikili dosyaları içeriyorsa veya değişiklikleri güvenle birleştiremeyeceğiniz kadar kodu anlamıyorsanız, çakışmayı birlikte çözmek ve geçmişi korumak için IT desteğini veya daha deneyimli bir meslektaşınızı arayın.
Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVPSık sorulan sorular
`<<<<<<<`, `=======` ve `>>>>>>>` işaretleri ne anlama gelir?
`<<<<<<< HEAD` mevcut dalınızın başlangıcını, `=======` iki sürümü ayırır ve `>>>>>>> dal-adi` birleştirilen daldan gelen bölümün sonunu belirtir. Dosyayı çözüldü olarak işaretlemeden önce tüm çakışma işaretleri silinmelidir.
`git add` çalıştırdıktan sonra birleştirmeyi geri alabilir miyim?
Evet, birleştirme commit'ini tamamlamadığınız sürece `git merge --abort` çalışır. Birleştirme commit'ini zaten oluşturduysanız ve push yapmadıysanız, `git reset --hard HEAD~1` ile geri alabilirsiniz, ancak önce yedek bir dal veya depo kopyası oluşturun. Commit zaten push edildiyse, `git revert -m 1 <hash>` kullanın.
İkili dosyadaki çakışmayı nasıl çözerim?
Git ikili dosyaları otomatik olarak birleştiremez. Hangi sürümün doğru olduğuna karar verin ve `git checkout --ours dosya` (sizin dalınız) veya `git checkout --theirs dosya` (diğer dal) komutunu çalıştırın, ardından `git add dosya` yapın.