İçeriğe geç

Git merge çakışması: nasıl hızlıca çözülür ve çalışmaya devam edilir

Orta 15 dk Güncellendi:

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. 1

    Depo durumunu kontrol edin

    git status komutunu ç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. 2

    Çakışma olan dosyayı açın

    Listedeki her dosyayı düzenleyicide açın. <<<<<<< HEAD, ======= ve >>>>>>> dal-adi iş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. diff3 stili kullanıyorsanız, ||||||| ile ======= arasında ortak ata bölümü de bulunur.

  3. 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. 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. 5

    Kaydedin ve çözüldü olarak işaretleyin

    Dosyayı bitirdiğinizde kaydedin ve git add dosya-adi komutunu çalıştırın. Listedeki tüm dosyalar için bunu tekrarlayın. git status artık "All conflicts fixed but you are still merging" göstermelidir.

  6. 6

    Birleştirmeyi tamamlayın

    git commit (mesajı düzenlemek istiyorsanız -m olmadan) veya git merge --continue komutunu çalıştırın. Bu, birleştirme commit'i oluşturur. Birleştirmenin kaydedildiğini görmek için git log --oneline -3 komutunu kontrol edin.

  7. 7

    Push öncesi test edin

    Derlemeyi ve testleri çalıştırın (npm test, mvn test veya projenin kullandığı komut). Çakışma, yalnızca çalıştırma sırasında görülen bir hatayı gizleyebilir. Testler geçtikten sonra git push yapın.

  8. 8

    Vazgeçmek isterseniz

    git merge --abort komutu ç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 varsa git reset --hard kullanmayı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 MVP

Sı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.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun