Geliştirme ortamınızda GIT kullanarak yaptığınız değişiklikleri commit edip uzak uca push ile göndermeyi biliyorsunuz. Ancak birlikte çaşlışırken sıklıkla conflict(çakışma) ile karşılaşıyor ve fetch, merge, rebase kavramları kafanızı mı karıştırıyor ? O zaman doğru adrestesiniz.
2. Ajanda
● Temel Kavramlar
○ fetch
○ merge
○ rebase
○ pull
○ pull --rebase
● Neden Merge Değil Rebase ?
● AB-1 vs origin/AB-1
● Sapma (Diverge) Nedir ? Nasıl Olur ? Ne Yapmalı ?
● Çakışma (Conflict) Nedir ? Nasıl Oluşur ? Ne Yapmalı ?
● A Geliştiricisi İle B Geliştiricisinin AB-1 dalında Birlikte Çalışması
● Lüzumsuz Commitler ve Rebase Zulmü Arasındaki İlişki
● Sorular ?
3. GIT - Temel Kavramlar
git fetch
git merge
git rebase
git pull
git pull --rebase
4. GIT - git fetch
● Uzak uçtaki referansları transfer eder.
● Kaynak kodu güncellemez.
Söz Dizimi:
git fetch <repository>
Örnek:
git fetch origin
5. GIT - git merge
● Belirli bir GIT dalını, geçerli dalla birleştirir.
● Yalnızca daha önce uzak uçtan aktarılmış referanslar veya yerel depodaki
dallarla birleştirme gerçekleştirilir.
● Değişiklikler, tarihsel sıraya göre uygulanır.
Söz Dizimi:
git merge <ref>
Örnek:
$ git merge AB-1
$ git merge origin/AB-1
7. GIT - git rebase
● Belirli bir GIT dalını, geçerli dalla birleştirir.
● Yalnızca daha önce uzak uçtan aktarılmış referansları birleştirir.
● Değişiklikler, geçerli dalın ana daldan ayrıldığı noktadan itibaren
gerçekleştirilen geliştirmelerin birleştirme sonrasında en sona taşınması
şeklinde uygulanır.
Söz Dizimi:
git rebase <base_ref>
Örnek:
$ git rebase master
$ git rebase origin/master
9. GIT - git pull
● git pull == git fetch + git merge
● Yalnızca parametre olarak belirtilen dal için senkronizasyon işlemi
gerçekleştirir.
● Birleştirme işlemini kronolojik olarak gerçekleştirir.
● Geçerli dal ile parametre olarak belirtilen dalı birleştirmez.
Söz Dizimi:
git pull <repository> <ref>
Örnek:
$ git pull origin ab-1
12. GIT - Neden Merge Değil Rebase ?
git merge git rebase
● Birleştirme yapılan dalda herhangibir zamanda oluşturulan commit lerin
birleşen daldaki commitlerin arasına karışarak dalda sapma (Diverge)
meydana gelmemesi
● Geliştirmelerin birbirinden keskin şekilde ayrılması
● Hangi dalda hangi değişikliğin yapıldığının net olarak anlaşılması
● Geri dönüş sırasında karşılaşılacak sorunların önüne geçmek.
13. GIT - AB-1 vs. origin/AB-1
AB-1: GIT dalı.
origin/AB-1: Referans.
origin/AB-1 Ne Zaman Kullanılabilir ?
Merge ve rebase öncesinde:
● Uzak Uç Log Kontrolü
$ git log origin/AB-1
● Uzak Uç ile Yerel Ortam Karşılaştırması
$ git diff AB-1 origin/AB-1
● Merge/Rebase İşlemlerinin Güvenli Olarak Gerçekleştirilmesi
$ git rebase origin/master
● Referans belirterek dal çıkmak
$ git checkout -b AB-2 -t origin/master
14. GIT - Sapma (Diverge) Nedir ? Nasıl Olur ? Ne
Yapmalı ?
Nedir ?
Uzak uç ile yerel ortam arasındaki
commit diziliminin belirli bir sıralama
sonrasında araya giren farklı commitler
nedeniyle bozulmasıdır.
Nasıl Olur ?
● İki veya daha fazla dalın bir dalda
birleştirilmesiyle iki commit
arasına giren yeni commitlerin
uzak uçla yerel ortam arasında
farklılık yaratması.
● Feature dalın rebase edilmesi.
Ne Yapmalı ?
Uzak uçdaki dal git push --force ile
ezilmeden önce;
● Birleştirilen dalların güncelliğinden
emin olunmalı.
● rebase edilen dal ve taban dalın
güncelliğinden emin olunmalı.
15. GIT - Çakışma (Conflict) Nedir ? Nasıl Oluşur ?
Ne Yapmalı ?
Nedir ?
Aynı yerde yapılan değişikliklerin üst üste gelmesi
durumudur.
Nasıl Oluşur ?
Birleştirilen dallar aynı dosyanın farklı versiyonlarını
içermesi durumunda
Ne Yapmalı ?
● Sürümde yeralması gereken değişikliğin hangisi
olduğuna karar verilerek diğer version kaynak
koddan kaldırılmalı.
● Conflictler çözüldükten sonra ilgili dosya git add ile
staging e alınmalı.
● Conflict merge sırasında oluşmuşsa;
○ Tüm conflictler çözülmüşse yeni bir commit
oluşturularak sürüme gönderilmeli.
○ git rebase --continue komutu çalıştırılarak
sonraki commitlerin dalla birleştirilmesi
sağlanmalıdır.
16. GIT - A Geliştiricisi İle B Geliştiricisinin AB-1
dalında Birlikte Çalışması
● Birlikte çalışılan işlerde feature branch ler
sıklıkla değişikliğe uğrar.
● Dallarda sapma (Diverge) meydana
gelmemesi için en son yapılan değişiklikler
dalın her zaman en sonunda tutulmalıdır.
● Doğru çalışılmış daldaki commit dizilimi düz
bir çizgiyi şeklindedir, herhangibir sapma
oluşmaz.
Ne Yapmalı ?
git pull --rebase origin AB-1
Ne Yapmamalı ?
git pull origin AB-1
Neden ?
● git pull, ucak uçtaki değişiklikleri kronolojik
olarak yerel ortamdaki dalla birleştirir.
● Kronolojik olarak birleşen branch, zamana
bağlı olarak araya giren farklı commitler
nedeniyle uzak uçtan sapar.
Hatalı Feature Branch
Başarılı Feature Branch
17. ● Geliştirme sonrasında oluşturulan hata
veya stil düzeltme commit leri logun
gereksiz uzamasına ve okuma
güçlüğüne neden olur.
● Çok sayıda commit içeren dalların
rebase edilmesi sırasında oluşan
çakışmalar tekrar tekrar fix edilmek
durumunda kalınabilir.
$ git rebase --continue
$ git rebase --continue
$ git rebase --continue
…
$ git rebase --continue
Ne Yapmalı ?
Lüzumusz commitler Interactive rebase ile
birleştirilmelidir.
$ git rebase -i HEAD~2
GIT - Lüzumsuz Commitler ve Rebase Zulmü
Arasındaki İlişki
Gereksiz commitler (Son 2 Commit)
Interactive Rebase
Son iki commit birleştiriliyor
Başarılı Feature Branch