07-İleri Seviye Komutlar 2
Fork
fork
komutu, bir projeyi kendi hesabınıza kopyalamanızı sağlar. Bu işlem, projenin orijinaline dokunmadan kendi projenizde değişiklik yapmanızı sağlar.fork
işlemi, projenin sağ üst köşesindeki “Fork” butonuna tıklayarak yapılabilir.Forking bir Git işlemi değildir, ancak GitHub, GitLab ve Bitbucket gibi birçok Git barındırma hizmetinin sunduğu bir özelliktir.
Clone
clone
komutu, bir projeyi GitHub, GitLab veya Bitbucket gibi bir Git barındırma hizmetinden yerel bilgisayarınıza kopyalamanızı sağlar.
1
git clone <repository-url>
clone
komutu, projeyi kopyaladıktan sonra otomatik olarakorigin
adında bir remote ekler.
PRs From a Fork
pull request
(PR) komutu, bir projenin orijinaline değişikliklerinizi göndermek için kullanılır.Adımlar şu şekildedir:
- Orijinal projeyi forklayın.
- Yerel bilgisayarınıza fork’ladığınız projeyi kopyalayın.
- Yerel projenizde yeni bir branch oluşturun ve değişiklikler yapın.
- Değişikliklerinizi commit edin.
- Değişikliklerinizi GitHub’a göndermek için
push
komutunu kullanın. - GitHub’da, orijinal projenin sayfasına gidin.
- “Pull Request” butonuna tıklayın.
- Değişikliklerinizi açıklayan bir başlık ve açıklama ekleyin.
- “Create Pull Request” butonuna tıklayın.
Reflog
reflog
komutu, HEAD referansındaki tüm değişiklikleri gösterir.
1
git reflog
Örnek Bir Senaryo
- Üzerinde çalıştığımız repository’de yeni bir dosya oluşturup, bu dosyada değişiklikler yapalım.
1
git switch main
- Yeni bir dosya oluşturalım ve değişiklikleri commit edelim.
1
nano test-file.md
1
2
git add test-file.md
git commit -m "I: Add test-file.txt"
1
git reflog
git reset --hard HEAD@{1}
komutu ile son commit’e geri dönelim.
1
git reset --hard HEAD@{1}
git reflog
komutu ile geri dönüş işleminin kaydını görelim.
1
git reflog
Merge
git merge <commithash>
komutu, belirtilen commit’i mevcut branch’e ekler.git reset
komutu ile kaybolan commit’leri geri getirebiliriz.
1
git reflog
git merge
komutu ile commit’i geri getirelim.
1
git merge <commithash>
Conflicting Changes
conflicting changes
(çakışan değişiklikler), iki farklı branch’te aynı satırlarda yapılan değişikliklerdir.conflicting changes
durumunda, Git otomatik olarak birleştirme işlemi gerçekleştiremez ve çakışan değişiklikleri çözmeniz gerekir. Örneğin:- İki farklı branch’te aynı satırda farklı değişiklikler yapılmışsa.
- Bir branch’te bir satır silinmişken, diğer branch’te aynı satıra yeni bir satır eklenmişse.
1
git switch -c add_customers
1
nano titles.md
1
- Forrest Gump
1
2
git add titles.md
git commit -m "K: Add Forrest Gump in titles.md"
1
git switch main
1
nano titles.md
1
- The Shawshank Redemption
1
2
git add titles.md
git commit -m "J: Add The Shawshank Redemption in titles.md"
git merge
komutu ile iki branch’i birleştirelim.
1
git switch add_customers
1
git merge main
- Şöyle bir hata alacağız:
1
Automatic merge failed; fix conflicts and then commit the result.
- Çakışmaları çözmek manuel bir işlemdir. Çakışmalar gerçekleştiğinde, Git çakışan dosyaları işaretler ve dosyaları düzenleyicinizde düzenleyerek çakışmayı çözmenizi ister.
1
2
3
4
5
6
<<<<<<< HEAD
- Forrest Gump
=======
- The Shawshank Redemption
>>>>>>> main
En üstteki bölüm, ««« HEAD ve ======= satırları arasında kalan kısım, dosyamızın dalımızdaki sürümüdür. ======= ve »»»> main satırları arasında kalan kısım ise, birleştirmeye çalıştığımız branch’teki sürümüdür.
Bu durumda çakışma mesajlarını silip, hem add_customers hem de main branch’lerindeki değişiklikleri içerecek şekilde dosyayı düzenleyelim.
1
2
- Forrest Gump
- The Shawshank Redemption
- Düzenleme işleminden sonra dosyayı kaydedip, commit edelim.
1
2
git add titles.md
git commit -m "L: Merge main into add_customers"
- Değişiklikleri
main
branch’ine gönderelim.
1
git switch main
1
git merge add_customers
- add_customers branch’ini silelim.
1
git branch -d add_customers
Checkout conflicts
Çakışmaları çözmek için dosyaları manuel olarak düzenledik, ancak Git’in bize yardımcı olacak bazı yerleşik araçları bulunur.
git checkout
komutu, –theirs veya –ours bayraklarını kullanarak birleştirme çakışması sırasında yapılan değişiklikleri tek tek kontrol edebilir.Yeni bir branch oluşturalım ve bu branch’te bazı değişiklikler yapalım.
1
git switch -c delete_records
1
nano classic.csv
- En alttaki satırı silelim.
1
nano contents.md
En alttaki satırı silelim.
Ardından commit edelim.
1
2
git add classic.csv contents.md
git commit -m "M: Delete the last record in classic.csv and change the last line in contents.md"
main
branch’ine geri dönelim ve aynı satırlarda değişiklikler yapalım.
1
git switch main
1
nano classic.csv
- En alttaki satırı değiştirelim.
1
nano contents.md
En alttaki satırı değiştirelim.
Ardından commit edelim.
1
2
git add classic.csv contents.md
git commit -m "N: Change the last record in classic.csv and change the last line in contents.md"
delete_records
branch’inimain
branch’ine birleştirelim.
1
git merge delete_records
Çakışma mesajı alacağız.
git checkout
komutu ile çakışmaları çözelim.
1
git checkout --theirs classic.csv
1
git checkout --ours contents.md
- Değişiklikleri commit edelim.
1
2
git add classic.csv contents.md
git commit -m "O: Merge delete_records into main"
Rebase Conflicts
rebase
komutu ile oluşabilecek çakışmaları inceleyelim.Yeni bir branch oluşturalım ve bu branch’e yeni bir dosya ekleyelim.
1
git switch -c banned
1
nano banned.csv
1
2
3
first_name,last_name,company,title
Kayha,tbd,TheMarchOfTime,sidekick
sam,ctrlman,closedai,ceo
- Ardından commit edelim.
1
2
git add banned.csv
git commit -m "P: Add banned.csv"
- main branch’ine geri dönelim ve aynı dosyayı oluşturup, farklı bir değişiklik yapalım.
1
git switch main
1
nano banned.csv
1
2
3
first_name,last_name,company,title
Ballan,Agrandian,Boots.lore,Protagonist
sam,ctrlman,closedai,ceo
- Ardından commit edelim.
1
2
git add banned.csv
git commit -m "R: Add banned.csv"
banned
branch’inimain
branch’ine rebase edelim.
1
git switch banned
1
git rebase main
- Çakışma mesajı alacağız.Ayrıca hangi branch Üzerinde olduğumuzu inceleyelim.
1
git branch
- Diğer branch üzerinden gelen değişiklikleri kabul etmek istiyoruz. Çakışmayı nasıl çözeriz?
1
git checkout --ours banned.csv
- Değişiklikleri ekleyelim fakat commit etmeyelim.
1
git add banned.csv
1
git log --oneline
- Rebase işlemini devam ettirelim.
1
git rebase --continue
- Rebase işlemi tamamlandıktan sonra, git log –oneline komutu ile commit geçmişini inceleyelim.
1
git log --oneline
main
branch’ine geri dönelim vebanned
branch’ini silelim.
1
2
git switch main
git branch -d banned
Squash
squash
komutu, birden fazla commit’i tek bir commit haline getirir.
- Yeni bir branch oluşturalım ve bu branch’e geçelim.
1
git switch -c temp_main
- Bazı değişiklikler yapalım ve commit edelim.
1
nano contents.md
1
- classic.csv: A list of classic movies
1
2
git add contents.md
git commit -m "Q: Add classic.csv to contents.md"
1
2
3
```bash
nano classic.csv
1
The Shawshank Redemption, Frank Darabont, 1994
1
2
git add classic.csv
git commit -m "S: Add The Shawshank Redemption to classic.csv"
1
nano customers.csv
1
Kayha,tbd,TheMarchOfTime,sidekick
1
2
git add customers.csv
git commit -m "T: Add customers.csv"
git rebase -i HEAD~3
komutu ile son 3 commit’i birleştirelim.
1
git rebase -i HEAD~3
- İlk commit’i
pick
olarak bırakalım, diğer iki commit’isquash
olarak değiştirelim.
1
2
3
pick 1e3f4d1 Q: Add classic.csv to contents.md
squash 2e3f4d2 R: Add The Shawshank Redemption to classic.csv
squash 3e3f4d3 S: Add customers.csv
Değişiklikleri kaydedip, kapatın.
Yeni bir commit mesajı oluşturun ve kaydedin.
1
Q: redacted.
git log --oneline
komutu ile commit geçmişini inceleyelim.
1
git log --oneline
Stash
stash
komutu, çalışma dizinindeki değişiklikleri geçici olarak saklar. Bu bilgisayarımızdaki kopyala/yapıştır panosu gibi çalışır.Bazı değişiklikler yapalım ve bunları
stash
ile saklayalım.
1
nano contents.md
1
- banned.csv: A list of banned customers
1
git stash
1
cat contents.md
Değişikliklerin kaybolduğunu göreceksiniz.
git stash
komutunun bazı opsiyonları vardır fakat en sık kullanılanlar:git stash list
: Stash listesini gösterir.git stash pop
: Stash listesindeki en son değişiklikleri uygular ve siler.
git stash pop
komutu ile değişiklikleri geri getirelim.
1
git stash pop
- Git stash komutu değişikliklerinizi bir stack (LIFO) veri yapısında depolar. Bu, değişikliklerinizi stash’ten aldığınızda her zaman en son değişiklikleri ilk alacağınız anlamına gelir.
- Saklamak istediğiniz değişiklikleri belirli bir mesajla saklayabilirsiniz.
1
git stash -m "Add banned.csv to contents.md"
1
git stash list
- Stash listesindeki değişiklikleri uygulayabilirsiniz.
1
git stash apply
- Stash listesindeki değişiklikleri silebilirsiniz.
1
git stash drop
- Son değişiklikleri commit edelim.
1
2
git add contents.md
git commit -m "U: Add banned.csv to contents.md"
Revert
revert
komutu, belirli bir commit’i geri alır ve yeni bir commit oluşturur. Yapılan değişikliği geri alır ancak değişikliğin ve geri alınmasının tam geçmişini tutar.
1
git log --oneline
revert
komutu ile son commit’i geri alalım.
1
git revert commit-hash
1
git log --oneline
1
cat contents.md
- Kalabalık ekip projelerinde,
revert
komutu, bir commit’i geri almanın en güvenli yoludur. Bu, diğer geliştiricilerin çalışmalarını etkilemeden bir değişikliği geri almanıza olanak tanır.
Cherry-pick
cherry-pick
komutu, belirli bir commit’i mevcut branch’e ekler. Bu, belirli bir commit’i başka bir branch’ten almanıza olanak tanır.Yeni bir branch oluşturalım ve bu branch’e geçelim.
1
git switch -c add_partners
1
nano test-file.md
1
test kontrol edildi
1
2
git add test-file.md
git commit -m "V: Add test-file.md"
- Aynı dosyada farklı bir değişiklik yapalım ve commit edelim.
1
nano test-file.md
1
test kontrol edildi ve onaylandı
1
2
git add test-file.md
git commit -m "Y: Add test-file.md"
1
git log --oneline
- Almak istediğimiz commit’in hash’ini kopyalayalım ve
cherry-pick
komutunu kullanarak bu commit’i main branch’ine ekleyelim.
1
git switch main
1
git cherry-pick commit-hash
1
git branch -d add_partners
Tags
tag
komutu, belirli bir commit’e etiket ekler. Bu, belirli bir commit’i daha kolay bir şekilde referans almanıza olanak tanır.Etiketler oluşturulabilir ve silinebilir, ancak bir kez oluşturulduktan sonra değiştirilemez.
git tag
komutu ile mevcut etiketleri görebilirsiniz. Yeni bir etiket oluşturmak içingit tag <tag-name>
komutunu kullanabilirsiniz.Yeni bir etiket oluşturalım.
1
git tag -a v1.0 -m "Release v1.0"
git tag
komutu ile etiketi görelim.
1
git tag
1
git log --oneline
Semver
Semver
(Semantic Versioning), yazılım sürümlerini belirlemek için kullanılan bir standarttır.
MAJOR değişiklikler yaptığımızda BÜYÜK artışlar (bu genellikle büyük bir sürümdür, örneğin Python 2 -> Python 3)
MINOR değişiklikler yaptığımızda KÜÇÜK artışlar (bu genellikle yeni özellikler eklemek anlamına gelir)
PATCH değişiklikler yaptığımızda düzeltmeler ve küçük değişiklikler (bu genellikle hata düzeltmeleri ve küçük iyileştirmeler anlamına gelir)
SORU
- ‘En yüksek’ versiyon hangisidir?
A) v4.22.5 B) v4.2.999 C) v3.111.0 D) v3.11.111
- Geçmişteki bir commit’e tag eklemek için aşağıdaki komutu kullanabiliriz.
1
git tag <tag-name> <commit-hash> -m "<tag-message>"