Git Eğitimi - Zafer Çakmak (15.07.2016)

Git Cheatsheet

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.