Git Docs
Git Eğitimi - Zafer Çakmak (15.07.2016)
git config --global user.name "user nanme"
git config --global user.email "email"
ssh key oluşturulması
ssh-keygen -t rsa -b 4096 -C "email"
olusturulan ssh-key hom dizininde id_rsa.pub dosyasında
Create a repo
$ git init
Note git reposunu kaldırmak için .git dosyasını silebiliriz.
rm -rf .git
Clone a repo
git clone URL
bu komuttan sonra git reposundaki config dosyasında
[core]
...
[remote "origin"]
...
[branch "master"]
...
gibi bilgiler geliyor.
Git pull
- uzak repodaki değişiklikleri almak iççin kullanıyoruz.
- yerel değişiklikler varsa otomatik merge yapar
- conflictler varsa onları söyler.
- commitlenmemiş değişiklikler pull işlemini engelleyebilir.
Localdeki git reposunu github ya da başka bit yere pushlayabilmek için remote origin eklememiz gerekiyor
git remote add origin https://github.com/username/reponame.git
lokaldeki git reposunu puşlamak için
git push -u origin master
-u
git config ‘e tanımı ekliyor. her seferinde origin master dememiz gerekmiyor bu sayede
elimizdeki repoda commitlenmemiş değişiklikler varsa, ve uzak repodaki değişiklikleri git pull ile çekmeye çalıştığımızda, ya commitle ya da stash yap ki değişiklikleri alabileyim diye hata veriyor.
commit yapılursa git pull komutu ile gerekli olduğu durumda otomatik merge işlemi yapılır.
git reset HEADcdosyaAdi
dosyadaki değişiklikleri commitlemeden geri alır.
## Git Add
git add dosyaAdi
dosyadaki değişiklikleri commit için hazır hale getirir.
git add -p
partial add işlemi yapabilmek için
bazı değişiklikleri commit için gite ekleyebiliriz. bazılarını da ignore edebiliriz.
## Git Commit değişiklikleri kendi localimize commitler.
## Git status kendi repomuzdaki değişiklikleri gösterir.
## Git branch
git branch
branch’leri gösterir.
git branch -a
remote branch’leri de gösterir.
git branch branc_adi
branch_adi isminde bir branch olusturur.
git branch -d
branch’leri siler.
branch değiştirmek için git checkout branchnanme
komutunu kullanıyoruz.
## Git merge
git merge branch_adi
mevcut branchimizi branch_adi ile merge eder. sonuçta mevcut branchimize branch_adi ismindeki branchin değişiklikleri eklenir.
örnek master branch’ine branch_adi branchini merge etmek için
git checkout master # master branch'e geciyoruz
git merge branch_adi # merge
Git reset
git reset dosyaAdi
komutu git add
yapılmış olan dosyayı unstaged yapıyor.
commitlenmiş olan dosyayı en son haline almak için
git checkout -- dosyaAdi
buradaki – dosyalarla çalışacağım, o isimde branch varsa onu alma dememk.
Git Reset
2 şekilde yapılır
- soft reset: dosya sistemindeki değişiklikler kalır, soft deyinde git add comutu yapılmış hali ile dosya kalıyor.
- hard reset: hem takibi siler hem localdeki dosyayı repositorydeki haline geri alır.
git reset commitNumarası
yapınca repository’yi o commit sürümüne alıyor.
Git revert
bir commiti revert etmek için kullanılıyor. git reset’te commitleri kaybediyoruz. ancak revert yapınca kaybetmiyoruz.
reset yerine revert kullanılırsa daha uygun.
Git Stash
git stash
workspace’teki değişiklikleri geçici bir yede saklar.
stash pop ile stash’e attığımız değişiklikleri geri alabiliriz.
önce kendimiz değişklik yaptık. sonra bunları stsh’leyip, bulunduğumuz branchi en son committeki haline alıyor.
sonra git pull
ile repodaki değişiklikleri alıyoruz.
ve kendi değişikliklerimizi git stash
ile kendi değişikliklerimizi alıyoruz.
Git Rebase
commit geçmişimizi tarih sırasına göre yeniden yazıyor.
örnek olarak master’dan branch alıp 2 commit yaptık. o arada masterda da 2 commit yapıldı.
önce branch’e master’i merge ediyoruz.
branch’te git rebase yapınca branch’teki değişiklikleri merge edilmiş olan sürüme ekliyor.
git rebase master
burası araştırılacak
Git Squash
birden fazla commiti tek komite indirmemize yarıyor.
Git fetch
git fetch
merge işlemi yapmıyor
git pull demek
git fetch
git merge
işlemini yapmak demek
Git flow
master branchi production çıkılmış sürümdür. geliştirmeleri burda yapmayın. master’dan development branchini alın. development branchi her zaman stable olan branchtir.
development branchi günün herhangi bir saatinde kurulabilen ve çalıştığından emin olunan branchtir.
geliştirmeler development branchinden alınan feature branchi üstünde yapılıyor.
release branchi development brancchinin en son halinden branch alınması ile oluşturuluyor. release branchinde bug fix dışında giç geliştirme yapılmıyor. release branchi master’a mergeleyip tagliyoruz.
master’da yapılan hotfix’ler ve release’de yapılan bug fix’ler development branchine merge ediliyor.
Git Flow Demo
git clone url
git checkout develop
yeni branch oluşturmak istiyoruz.
git checkout -b issueKey
değişiklikler yapıp
git add *
git commit -m "message"
git push
ile remota gönderdik
başkassı değişiklik yapıp commit ve push yapıyor.
biz de localde değişiklik yaptık. push yapmaya çalıştığımızda “önce pull yapın” diye hata verdi.
git merrgetool
komutu ile kdiff3 uygulamasında farkları görüp, merge yaptık.
git add .
git push
yeni pull request oluşturduk, github’tan sonra bu requeste birini assign ettik.
github “merge problemi yok “ şeklinde mesaj verdi. sonra merge ettik.
sonra branchi github üzerinden sildik.
sonra terminalden
git pull
dedik.
git checkout develop
git branch -d branchKey
git push ordigin :branchKey
dersek olmayan bir branchi remote’tai branch’in üstüne yaz diyoruz. böylece remote’tan branch silinmiş oluyor.
diğer issue için de pull request geldi. bunu merge edemediği için manuel olarak merge etmemiz gerekiyor.
git pull #deyip develop branchiniupdate aldık
git checkout emove-2
git merge develop #deyip merge ettik.
git status #ile kontrol ettik
git merrgetool #ile merge ettik
git add index.html
git push
pull requestimize geri döndük. otomatik olarak güncellenebilir duruma geldi. sonra branchi sildik (github’tan).
yeni release çıkarmak istiyoruz elimizdeki develop branchinden yeni bir pull request yapıyoruz. base’i release compare’i develop olarak seçtik.
pull request’te squash etmeden merge ediyoruz.
branch’lere baktığımızda release branchi merge’ten dolayı 1 commit ilerde görünüyor.
bugfix için yeni bir önce
git pull
git checkout release
git checkout -b bugfix-1
git add * #değişiklikleri yaptıktan sonra,
git push origin bugfix-1
release branchine bir pull request oluşturduk, çünkü oraya merge edeceğiz bugfixi bugfix’i release’e merge ediyoruz. github’tan silmeden development’a da merge etmemiz gerekiyor. new pull reqquest deyip develop’a ekliyoruz. sonrasında bu bugfix branchini silebiliriz.
release bitti bugfixi de yaptık master’a gönderecez
release’a new pull request deyip base’i master, compare’i release yapıp merge ediyoruz.
tag’leme işlemi github’tan create new release diyoruz.
Hotfix
git checkout master
git checkout -b hotfix-1
git add *
git commit -m
git push --set-upstream origin hotfix-1
github’tan yeni pull request ekledik ilk combo master, ikinci combo hotfix.
sonra yeni bir release oluşturuyoruz. master değiştiği için
hotfix’i develop’a da merge ediyoruz.
sonra hotfix’i sildik
git fetch --all
yeni dosya oluşturup add,commit ve push yaptık (develop)
develop’dan pull equest alıp release’e merge ediyoruz
release developun önünde, master geride kaldı
release pull request yapıp master’a merge ediyoruz.
master’dan versiyon tag aldık
0.1.1 sürümü için hotfix çıkartmak gerekti
Eski sürümler
eski sürümler için support/0.1.x şeklinde branch alıp hotfix’i onlar üstünde yapıyoruz. bu hotfix’ler sürüm zaten eski olduğu için yeni sürümlere bugfix olarak alınmayabilir.
git checkout -b hotfix-for-older-version
#make changes
git add *
git commit -m "hotfix old version"
git push --set-upstream origin hotfix-for-older-version
bu hotfix için yeni bir pull request ile support’a alıyoruz. sonra yeni bir release oluşturuyoruz.