Squash Merge
Geçtiğimiz bölümler sonucunda 2 merge commit'li bir history'miz oluştu.
$ git log --graph --all --oneline
* eb02546 (HEAD -> dal-A) Merge branch 'dal-B' into dal-A
|\
| * 2c6d144 (dal-B) test.txt dal-B icin degistirdim
* | 8cd6f22 test.txt dal-A icin degistirdim
|/
* cef4e44 (main) dal-B icin degisiklik yaptim
* b5b6c09 Merge branch 'yeni-branch'
|\
| * dc2243f (yeni-branch-2, yeni-branch) yeni-branch icin ilk commitimi atiyorum
* | 9a63d64 test-2.txt dosyasini ekledim
|/
* 777f68a Dosyaya Merhaba Dunya ekledim
* 95e7356 Ilk commit
Fakat bu çok boyutlu veya çok parent'lı yapı bazen repository'i yönetmemizi zorlaştırabiliyor. Örneğin bazen repository'mizde main branch'inin tek boyutlu kalmasını isteyebiliriz. Böylece gelecekte main branch'in takip edilmesini ve yönetilmesinin kolaylaşmasını sağlamak istiyoruz. Fakat farklı bir branch açarak deneysel çalışmalar yapmaya ihtiyacımız da olabiliyor.
Kendimize A isminde yeni bir branch oluşturduğumuzu ve bunun üzerinde deneysel çalışmalar yapıp çok sayıda commit attığımızı varsayalım. Bu branch'te attığımız commit'lerin hepsi anlamlı commit'ler olmayabilir ve o commit'lerin çoğunun sadece o branch'te kalmasını istiyoruz. main branch'e A branch'ini merge etmek istiyoruz ama A branch'inde meydana gelen bütün geliştirme sürecinden ziyade sadece A branch'inin sonucunu almak istiyoruz. Böylece main branch'inin de dal yapısının tek boyutta kalmasını sağlamak istiyoruz.
Bu senaryoda gerçekleştirmek istediğimiz eylemi squash merge olarak adlandırabiliriz. Aslında yapmak istediğimiz şey A branch'indeki bütün commit'leri sıkıştırıp yeni bir commit olarak main branch'e eklemek olarak sadeleştirilebilir. Bunu gerçekleştirmek için merge esnasında --squash bayrağını kullanmamız yeterli olacaktır.
Örnek olarak dal-A ve dal-B branch'lerini ele alalım. dal-B branch'ine geçip 2 tane commit atalım. Bu commit'lerden sonra dal-B branch'ini dal-A branch'ine merge etmek isteyeceğiz.
$ git checkout dal-B
Switched to branch 'dal-B'
$ echo "Degisiklik-1" >> test.txt
$ git add test.txt
$ git commit -m "degisiklik-1"
[dal-B 8dd8796] degisiklik-1
1 file changed, 1 insertion(+)
$ echo "Degisiklik-2" >> test.txt
$ git add test.txt
$ git commit -m "degisiklik-2"
[dal-B 5fa6930] degisiklik-2
1 file changed, 1 insertion(+)
$ cat test.txt
dal-B icin Hello world satiri yaziyorum
Merhaba Dunya
yeni-branch icin merhaba-dunya
dal B icin degisiklik
Degisiklik-1
Degisiklik-2
dal-B üzerinde 2 commit atarak test.txt dosyasına 2 değişiklik yaptık. Şimdi ise dal-A branch'ine geçerek squash merge yapmayı deneyelim.
$ git checkout dal-A
Switched to branch 'dal-A'
$ git merge --squash dal-B
Automatic merge went well; stopped before committing as requested
Squash commit -- not updating HEAD
$ git status
On branch dal-A
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
git status komutunun çıktısından da anlaşılacağı üzere çalıştırdığımız merge otomatik olarak bir commit atmadı. Onun yerine dal-B branch'indeki değişiklikleri index'e ekledi. Bu durumda commit'i kendimiz elle tamamlamamız gerekiyor.
$ git commit -m "squash merge dal-B"
[dal-A 7894926] squash merge dal-B
1 file changed, 2 insertions(+)
$ git log --graph --all --oneline
* 7894926 (HEAD -> dal-A) squash merge dal-B
* eb02546 Merge branch 'dal-B' into dal-A
|\
* | 8cd6f22 test.txt dal-A icin degistirdim
| | * 5fa6930 (dal-B) degisiklik-2
| | * 8dd8796 degisiklik-1
| |/
| * 2c6d144 test.txt dal-B icin degistirdim
|/
* cef4e44 (main) dal-B icin degisiklik yaptim
* b5b6c09 Merge branch 'yeni-branch'
|\
| * dc2243f (yeni-branch-2, yeni-branch) yeni-branch icin ilk commitimi atiyorum
* | 9a63d64 test-2.txt dosyasini ekledim
|/
* 777f68a Dosyaya Merhaba Dunya ekledim
* 95e7356 Ilk commit
$ cat test.txt
dal-B icin Hello world satiri yaziyorum
Merhaba Dunya
yeni-branch icin merhaba-dunya
dal B icin degisiklik
Degisiklik-1
Degisiklik-2
Commit'i gerçekleştirdikten sonra log'dan da görebileceğimiz üzere aslında bir merge commit'i oluşmadı. Onun yerine sadece kendisinden önceki commit'e bakan yeni bir commit oluştu ve bu yeni commit ile birlikte dal-B branch'inde test.txt dosyasına yaptığımız değişiklikler artık dal-A branch'inde mevcut hale geldi.