GIT
Commit ve Push’dan Bir Adım Ötesi...
İbrahim Gündüz
Markafoni Brown Bag @ 2015
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 ?
GIT - Temel Kavramlar
git fetch
git merge
git rebase
git pull
git pull --rebase
GIT - git fetch
● Uzak uçtaki referansları transfer eder.
● Kaynak kodu güncellemez.
Söz Dizimi:
git fetch <repository>
Örnek:
git fetch origin
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
GIT - git merge
Önce Sonra
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
GIT - git rebase
Önce
Sonra
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
?
git pull --rebase
git pull --rebase
=
git fetch + git rebase
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.
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
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ı.
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.
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
● 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
Sorular
?
Teşekkürler

Git commit ve push’dan bir adım ötesi...

  • 1.
    GIT Commit ve Push’danBir Adım Ötesi... İbrahim Gündüz Markafoni Brown Bag @ 2015
  • 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 - TemelKavramlar git fetch git merge git rebase git pull git pull --rebase
  • 4.
    GIT - gitfetch ● Uzak uçtaki referansları transfer eder. ● Kaynak kodu güncellemez. Söz Dizimi: git fetch <repository> Örnek: git fetch origin
  • 5.
    GIT - gitmerge ● 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
  • 6.
    GIT - gitmerge Önce Sonra
  • 7.
    GIT - gitrebase ● 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
  • 8.
    GIT - gitrebase Önce Sonra
  • 9.
    GIT - gitpull ● 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
  • 10.
  • 11.
    git pull --rebase = gitfetch + git rebase
  • 12.
    GIT - NedenMerge 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-1vs. 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 - AGeliş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ındaoluş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
  • 18.
  • 19.