-
1. Başlangıç
- 1.1 Sürüm Denetimi
- 1.2 Git’in Kısa Tarihçesi
- 1.3 Git Nedir?
- 1.4 Komut Satırı
- 1.5 Git’i Yüklemek
- 1.6 Git’i İlk Defa Kurmak
- 1.7 Yardım Almak
- 1.8 Özet
-
2. Git Temelleri
-
3. Git Dalları
- 3.1 Dallar
- 3.2 Kısaca Dallandırma ve Birleştirme Temelleri
- 3.3 Dal Yönetimi
- 3.4 İş Akışı Dallandırması
- 3.5 Uzak Dallar
- 3.6 Yeniden Temelleme (rebase)
- 3.7 Özet
-
4. Bir Sunucuda Git Kurma
- 4.1 İletişim Kuralları (Protocols)
- 4.2 Bir Sunucuda Git Kurma
- 4.3 SSH Ortak Anahtarınızı Oluşturma
- 4.4 Sunucu Kurma
- 4.5 Git Cini (Daemon)
- 4.6 Akıllı HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Üçüncü Taraf Barındırma (Hosting) Seçenekleri
- 4.10 Özet
-
5. Dağıtık Git
- 5.1 Dağıtık İş Akışları
- 5.2 Projenin Gelişiminde Rol Almak
- 5.3 Bir Projeyi Yürütme
- 5.4 Özet
-
6. GitHub
- 6.1 Bir Projeye Katkıda Bulunmak
- 6.2 Proje Bakımı
- 6.3 Kurumsal Yönetim
- 6.4 GitHub’ı otomatikleştirme
- 6.5 Özet
-
7. Git Araçları
- 7.1 Düzeltme Seçimi
- 7.2 Etkileşimli İzlemleme (Staging)
- 7.3 Saklama ve Silme
- 7.4 Çalışmanızı İmzalama
- 7.5 Arama
- 7.6 Geçmişi Yeniden Yazma
- 7.7 Reset Komutunun Gizemleri
- 7.8 İleri Seviye Birleştirme
- 7.9 Rerere
- 7.10 Git’le Hata Ayıklama
- 7.11 Alt Modüller
- 7.12 Demetleme (Bundling)
- 7.13 Git Nesnesini Değiştirme
- 7.14 Kimlik Bilgisi Depolama
- 7.15 Özet
-
8. Git’i Özelleştirmek
- 8.1 Git Yapılandırması
- 8.2 Git Nitelikleri
- 8.3 Git Kancaları (Hooks)
- 8.4 Bir Örnek: Mecburi Git Politikası
- 8.5 Özet
-
9. Git ve Diğer Sistemler
- 9.1 İstemci Olarak Git
- 9.2 Git’e Geçiş
- 9.3 Özet
-
10. Dahili Git Ögeleri
- 10.1 Tesisat ve Döşeme (Plumbing ve Porcelain)
- 10.2 Git Nesneleri
- 10.3 Git Referansları
- 10.4 Packfiles
- 10.5 Refspec
- 10.6 Transfer Protokolleri
- 10.7 Bakım ve Veri Kurtarma
- 10.8 Ortam Değişkenleri
- 10.9 Özet
-
A1. Ek bölüm A: Diğer Ortamlarda Git
- A1.1 Görsel Arayüzler
- A1.2 Visual Studio ile Git
- A1.3 Visual Studio Code ile Git
- A1.4 Eclipse ile Git
- A1.5 Sublime Text ile Git
- A1.6 Bash ile Git
- A1.7 Zsh ile Git
- A1.8 PowerShell ile Git
- A1.9 Özet
-
A2. Ek bölüm B: Git’i Uygulamalarınıza Gömmek
- A2.1 Git Komut Satırı
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Ek bölüm C: Git Komutları
- A3.1 Kurulum ve Yapılandırma Komutları
- A3.2 Proje Oluşturma Komutları
- A3.3 Kısaca Poz (Snapshot) Alma
- A3.4 Dallandırma ve Birleştirme Komutları
- A3.5 Projeleri Paylaşma ve Güncelleme Komutları
- A3.6 İnceleme ve Karşılaştırma Komutları
- A3.7 Hata Ayıklama (Debugging) Komutları
- A3.8 Yamalama (Patching)
- A3.9 E-Posta Komutları
- A3.10 Harici Sistemler
- A3.11 Yönetim
- A3.12 Tesisat (Plumbing) Komutları
3.2 Git Dalları - Kısaca Dallandırma ve Birleştirme Temelleri
Kısaca Dallandırma ve Birleştirme Temelleri
Şimdi gerçek dünyada kullanabileceğiniz bir iş akışıyla basit bir dallandırma ve birleştirme örneğini inceleyelim. Bu adımları takip edeceksiniz:
-
Bir web projesi üzerinde birşeyleri değiştirin.
-
Üzerinde çalıştığınız iş paketi (user story) için yeni bir dal oluşturun.
-
Bu dal üzerinde çalışın.
Diyelim ki bu aşamada, başka bir sorunun daha kritik olduğuna ve acilen düzeltmeniz (hotfix) gerektiğine dair bir çağrı aldınız. Şunları yapmanız gerekiyor:
-
Üretim (production) dalına geçin (Bu sizin canlı yayındaki dalınızdır, genellikle master veya main olarak adlandırılır).
-
Onarım amaçlı yeni bir dal oluşturun.
-
Düzgün çalıştığını test ettikten sonra onarım dalını üretim dalıyla birleştirin ve üretime itin.
-
Asıl iş paketinize geri dönün ve çalışmaya devam edin.
Dallandırma
İlk olarak, projeniz üzerinde çalışıyorsunuz ve master
dalında halihazırda birkaç katkınız var diyelim.
#53 numaralı sorun (Ya da şirketinizin kullandığı iş takip sisteminde nasıl gösteriliyorsa) üzerinde çalışmaya karar verdiniz.
Yeni bir dal oluşturup aynı zamanda bu dala geçmek için git checkout
komutunu -b
(branch) bayrağı ile çalıştırabilirsiniz:
$ git checkout -b iss53
Switched to a new branch "iss53"
Bu komut şunun kısa yoludur:
$ git branch iss53
$ git checkout iss53
Web siteniz üzerinde çalışıyor ve bazı bazı katkılar işliyorsunuz.
Bu dala geçiş yapmış olduğunuz için (yani, HEAD
artık onu işaret ediyor) katkı işlemek iss53
dalını ileri taşır:
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
iss53
dalı siz çalıştıkça ilerlerŞimdi, web sitesinde bir sorun olduğu ve bunu derhal düzeltmeniz gerektiğine dair bir çağrı alıyorsunuz.
Git’te, ne yapmış olduğunuz iss53
değişiklikleri ve onarımınızı birlikte yükleme zorunluluğunuz var, ne de bu değişiklikleri üretime uygulamadan önce geri almak için büyük çaba sarf etmenize.
Yapmanız gereken tek şey, master
dalınıza geri dönmektir.
Ancak bunu yapmadan önce, çalışma dizininiz veya izlemde (stage) henüz katkılanmamış değişiklikler varsa ve bu değişiklikler, geçiş yapmak istediğiniz dal ile çakışıyorsa, Git’in sizin dal değiştirmenize izin vermeyeceğini bilmeniz lazım.
Dallar arasında geçiş yaparken temiz bir çalışma durumuna sahip olmak en iyisidir.
Bu sorunun etrafından dolaşmanın tabi ki belli (stashing
ve commit amending
gibi) yolları var ama bunları Saklama ve Silme bölümünde ele alacağız.
Şu anda, tüm değişikliklerinizi katkıladığınızı varsayalım, böylece master
dalına geri dönebilirsiniz:
$ git checkout master
Switched to branch 'master'
Bu aşamada, projenizin çalışma dizini, #53 sorunu üzerinde çalışmaya başlamadan önceki haline tam olarak geri dönmüş durumda ve şimdi onarımınıza odaklanabilirsiniz. Çok önemli bir hatırlatma!: Dallar arasında geçiş yaptığınızda, Git çalışma dizininizi o dala en son katkı işlediğiniz anda olduğu gibi ayarlar. Çalışma kopyanızı, dal üzerindeki son katkıladığınız gibi görünmesi için otomatik olarak dosya ekler, kaldırır ve değiştirir.
Şimdi, bir onarım yapmanız gerekiyor.
Sorunu düzeltene kadar üzerinde değişiklikler yapabileceğimiz hotfix
adında bir dal oluşturalım:
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)
master
üzerinden oluşturulmuş hotfix
dalıTestlerinizi çalıştırabilir, düzeltmenin istediğiniz gibi çalıştığından emin olabilir ve son olarak hotfix
dalınızı master
dalınıza birleştirerek üretime alabilirsiniz.
Bunu git merge
komutuyla yaparsınız:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
Bu birleştirmede ``fast-forward`` ifadesini fark edeceksiniz.
Çünkü birleştirdiğiniz hotfix
dalını işaret eden C4
katkısı, üzerinde bulunduğunuz C2
katkısından doğrudan ilerideydi, Git sadece işaretçiyi ileri taşıdı.
Başka bir deyişle, bir katkıyı, katkı geçmişini takip ederek ulaşılabilen bir katkıyla birleştirmeye çalıştığınızda, birleştirilecek ayrı çalışma olmadığından, Git işaretçiyi doğrudan ileri taşıyarak işleri basitleştirir.
Buna ``fast-forward`` (ileri sarma) denir.
Artık değişikliğiniz, master
dalının işaret ettiği katkı anlık görüntüsünde bulunuyor ve düzeltmeyi artık yükleyebilirsiniz.
master
, `hotfix`e doğru ileri sarıldıBu süper önemli düzeltmeniz yüklendikten sonra, kesintiye uğradığınız çalışmaya geri dönmeye hazırsınız.
Neticede master
dalı da aynı yere işaret ettiği için, artık ihtiyacınız olmayan, hotfix
dalını sileceksiniz.
Bu dalı git branch
komutunun -d
(delete) seçeneği ile silebilirsiniz:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
Şimdi #53 sorunu üzerindeki bekleyen işinize geri dönebilir ve çalışmaya devam edebilirsiniz.
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
iss53
üzerinde devam eden işBurada hotfix
dalında yaptığınız çalışmanın iss53
dalındaki dosyalarda bulunmadığını unutmayın.
Eğer onu çekmeniz gerekiyorsa, git merge master
komutunu çalıştırarak master
dalını iss53
dalına kaynaştırabilirsiniz, veya bu değişiklikleri birleştirmek için iss53
dalını daha sonra master
dalına çekmeye karar verene kadar bekleyebilirsiniz.
Birleştirme
Diyelimk ki #53 sorunu üzerindeki çalışmanızın tamamlandığına ve master
dalına birleştirilmeye hazır olduğuna karar verdiniz.
Bunu yapmak için, aynı hotfix
dalınızı daha önce birleştirdiğiniz gibi, iss53
dalınızı da master
dalına birleştireceksiniz.
Yapmanız gereken tek şey, birleştirmek istediğiniz dala geçmek ve ardından git merge
komutunu çalıştırmaktır:
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
Bu, önceki yaptığınız "hotfix" birleştirmesinden biraz farklı görünüyor. Mevcut durumda, geliştirme geçmişiniz eski bir katkıdan itibaren ayrılmış durumda. Çünkü üzerinde bulunduğunuz dalın son katkısı, birleştirmeye çalıştığınız dalın doğrudan önceli değilse, Git bazı işlemleri gerçekleştirmek zorundadır. Yukarıdaki senaryoda, Git bu iki dalın ortak öncelini ve her iki dal ucu tarafından işaret edilen iki farklı anlık görüntüyü kullanarak, üç yollu bir birleştirme yapar.
Sadece dal işaretçisini ileri taşımak yerine, Git, bu üç yollu birleştirmenin sonucu olan yeni bir poz oluşturur ve otomatik olarak ona işaret eden yeni bir katkı oluşturur. Buna birleştirme katkısı denir ve birden fazla üst dala sahip olması bakımından özeldir.
Şimdi çalışmanız birleştirildiğine göre iss53
dalına artık ihtiyacınız yok.
İş takip sisteminizdeki biletinizi (ticket) kapatabilir ve dalı silebilirsiniz:
$ git branch -d iss53
Birleştirme Çakışması (merge conflict)
Bazen birleştirme süreci sorunsuz tamamlanamayabilir.
Eğer bir dosyanın aynı kısmını, iki farklı dalda iki farklı şekilde değiştirdiyseniz, Git bu değişimlerden hangisini birleştirmeye katacağını bilemeyeceği için, temiz bir birleştirme işlemi yapamaz.
Eğer #53 sorunu için yaptığınız düzeltme, hotfix
dalının aynı dosyasının aynı bölümünü değiştirmişse, aşağıdakine benzer bir çakışma uyarısı (merge conflict) alacaksınız:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git otomatik olarak yeni bir birleştirme katkısı oluşturmadı.
Siz çakışmayı çözene kadar süreci duraklattı.
Eğer çakışma uyarısı aldıktan sonra hangi dosyaların birleştirilmediğini görmek istiyorsanız, git status
komutunu çalıştırabilirsiniz:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Çakışmaları çözülmemiş olan her şey "unmerged" (birleştirilmemiş) olarak listelenir. Git, çakışmaları olan dosyalara "standart çakışma çözüm işaretçilerini" ekler, böylece bunları manuel olarak açabilir ve çakışmaları çözebilirsiniz. Dosyanız, aşağıdakine benzer bir bölüm içerir:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
Bunun anlamı: =======
işaretinin üstündeki her şey HEAD
(merge
komutunu çalıştırdığınızda üzerinde bulunduğunuz dal yani bu senaryoda master
dalı) içindeki sürümü gösterirken, işaretin altındaki kısımların ise iss53
dalı içindeki sürümü gösterdiğidir.
Çakışmayı çözmek için ya bir tarafı ya da diğerini seçmek yahut da içeriği kendiniz birleştirmek zorundasınız.
Örneğin, bu çakışmayı aşağıdaki gibi tüm bloğu değiştirerek çözebilirsiniz:
<div id="footer">
please contact us at email.support@github.com
</div>
Bu çözüm, her iki bölümün birazını içerir ve <<<<<<<
, =======
ve >>>>>>>
satırları tamamen kaldırılmıştır.
Her bir çakışmış dosyanın her bir çakışmasını çözdükten sonra, her bir dosya üzerinde git add
komutunu çalıştırarak onu çözülmüş olarak işaretleyin.
Dosyayı izleme almak, Git’te çözülmüş olarak işaretler.
Bu sorunları çözmek için görsel bir araç kullanmak istiyorsanız, git mergetool
komutunu çalıştırabilirsiniz. Bu, uygun bir görsel birleştirme aracını başlatır ve çakışmaları çözme sürecinde sizi yönlendirir:
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
Eğer varsayılan birleştirme aracı dışında bir birleştirme aracı kullanmak istiyorsanız (Eğer komutu Mac işletim sisteminde çalıştırıyorsanaz Git kendisi opendiff
aracını seçecektir), "one of the following tools" ifadesinin hemen altında desteklenen tüm araçların listesini görebilirsiniz.
Kullanmayı tercih ettiğiniz aracın adını yazmanız yeterlidir.
Not
|
Karmaşık birleştirme çatışmalarını çözmek için daha gelişmiş araçlara ihtiyacınız varsa, daha fazlasını |
Birleştirme aracından çıktıktan sonra, Git size birleştirmenin başarılı olup olmadığını sorar.
Eğer başarılı olduysa, dosyayı çatışması çözüldü olarak işaretlemek üzere izleme gönderir.
Tüm çakışmaların çözüldüğünü doğrulamak için tekrar git status
komutunu çalıştırabilirsiniz:
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
Eğer bu durumdan memnunsanız ve çakışmaları olan her şeyin aşamalandırıldığını doğruladıysanız, birleştirme işlemini sonuca ulaştırmak için git commit
komutunu yazabilirsiniz.
Varsayılan olarak, katkı mesajı şu şekilde görünür:
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
Eğer bu açıklamalar yeterli değilse ve gelecekte bu birleşmeyi inceleyecek diğer kullanıcılara yardımcı olabileceğini düşünüyorsanız; bu katkı mesajını çakışmayı nasıl çözdüğünüz ve yaptığınız değişiklikleri neden yaptığınızı açıklayacak şekilde değiştirebilirsiniz.