16/04/2016 - GIT
Hotfix branch daha önceden release ile yayınlanan ve hatalı çalışan programları veya özellikleri düzeltmek için yaratılırlar. Hotfix ve release branch arasındaki ana fark, hotfix master
branchtan türer ve develop
branch içindeki herşeyi göz ardı eder (yeni özellikler, yeni dosyalar, kaldırılan zellikler vs). Hotfix işlemi bittince, yapılan düzeltmeler hem develop
hem de master
brancha yansıtılır. Aşağıda bunu göreceğiz.
master
branchtan türerler.develop
hem de master
branch ile birleşirler.hotfix/x-x-x
kullanılır. Format x[major release]-x[release]-x[hot-fix]
hotfix etiketini temsil eder. Örnek: Eğer mevcut olan hotfix etiketi "0.1.4" ise bir sonraki "0.1.5" olur. Sadece sondaki rakam "1" arttırılır, kısacası yeni hotfix ismi hotfix/0.1.5
olur. Bir sonrakisi ise hotfix/0.1.6
olur.Hotfix branch ile çalışırken, diğer takım üyelerininde yapılan işi gözden geçirebilmeleri için, GitHub içinde "pull request" oluşturulur. Bu işin aslıda budur!
Release brancha ait olan 0.1.0
etiketini yayınladıktan sonra, bir kaç gün sonra develop
branchta bir takım değişiklikler yaptık. Bu şu ana kadar normal. Aniden 'one.txt' ismindeki dosyada yanlışlık olduğunu farkettim ve bunu acilen düzeltmem lazım.
Yerel branchların eski olma olasılığı yüksek olduğu için, çalışmaya başlamadan önce bu adımların atılması mecburidir.
Aktif branch olarak develop
'u seçin.
$ git branch
* develop
master
Tüm yenilikleri alın.
$ git remote update
Fetching origin
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From github.com:inanzzz/manual
7d173b0..53353d6 develop -> origin/develop
Yerel develop
branchı yenileyin.
$ git pull origin develop
From github.com:inanzzz/manual
* branch develop -> FETCH_HEAD
Updating 7d173b0..53353d6
Fast-forward
one.txt | 2 ++
two.txt | 1 +
2 files changed, 3 insertions(+)
create mode 100644 two.txt
Aktif branch olarak master
'ı seçin.
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Yerel master
branchı yenileyin.
$ git pull origin master
From github.com:inanzzz/manual
* branch master -> FETCH_HEAD
Already up-to-date.
Mevcut olan git durumunu kontrol et. Aşağıda gördüğümüz gibi master
branch develop
brancha nazaran daha eski.
$ git branch -avv
develop 53353d6 [origin/develop] Merge pull request #3 from inanzzz/feature/hello-mars
* master 7d173b0 [origin/master] Merge pull request #1 from inanzzz/feature/hello-world
remotes/origin/develop 53353d6 Merge pull request #3 from inanzzz/feature/hello-mars
remotes/origin/feature/hello-mars 46fbd1b New feature updates
remotes/origin/feature/hello-world 6a26393 Feature hello-world commit
remotes/origin/master 7d173b0 Merge pull request #1 from inanzzz/feature/hello-world
Yukarıda gördüğümüz gibi, release etiketi 0.1.0*
'dan hemen sonra bir takım işlemler yapıldığını görebiliyoruz. Bu daha sonra develop
branch ile birleştirilmiş ama hotfix bunu kaale almayacak.
Yerel master
branchtan türeyen ve uzak origin/master
branchı takip eden hotfix branch yaratın.
$ git checkout -b hotfix/0.1.1 origin/master
Branch hotfix/0.1.1 set up to track remote branch master from origin.
Switched to a new branch 'hotfix/0.1.1'
$ git branch
develop
* hotfix/0.1.1
master
Hataları düzeltip commit işlemi gerçekleştirin.
$ cat one.txt
feature/hello-world
$ echo 'feature/hello-inanzzz' > one.txt
$ git add --all
$ git commit -m 'I just fixed a bug'
[hotfix/0.1.1 8ed4ad7] I just fixed a bug
1 file changed, 1 insertion(+), 1 deletion(-)
$ cat one.txt
feature/hello-inanzzz
Bir "pull request" yaratmak için yayınlayın.
$ git push origin hotfix/0.1.1
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 312 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/manual.git
7d173b0..8ed4ad7 hotfix/0.1.1 -> hotfix/0.1.1
GitHub'a gittiğinizde, yayıladığınız hotfix branch için bir tane "pull request" açmanızı isteyen ibare göreceksiniz. Açmak işlemi sırasında, karşılaştırılacak olan branchı master
olarak seçin ve daha sonra başlık ve açıklamayı yazarak işlemi sonlandırın.
Bu aşamada diğer takım üyeleri yapılan işi gözden geçirmek için "pull request" ile ilgilenirler. Eğer herkes yaptığınız işten memnun ise, endişelenecek bir durum olmaz. Eğer aksi bir durum söz konusu olursa, gerekli düzeltmeleri yapmak zorunda kalırsınız.
Aktif branch olarak master
'ı seçin.
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch
develop
* master
hotfix/0.1.1
Yerel hotfix branch ile master
branchı birleştirin. Birleştirme sırasında --no-ff
seçeneğini kullanmayın çünkü "fast-forward" yerine "recursive" stratejisi kullanılır. Bu da master
branchı yayınladığımızda, GitHub içinde karşımıza gereksiz olan bir "pull request" açma ibaresi çıkmasına neden olur.
$ git merge hotfix/0.1.1
Updating 7d173b0..8ed4ad7
Fast-forward
one.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Hotfix anını etiketleyin.
$ git tag -a 0.1.1 -m 'Create hotfix tag 0.1.1'
Etiketi kontrol edin.
$ git tag
0.1.0
0.1.1
Yerel master
branchı yayınlayın. Bu işlem sonucunda GitHub içinde hotfix branchı master
branch ile birleşir, "pull request" kapatılır ama silinmez. Ayrıca yayıladığınız hotfix branch için bir tane "pull request" açmanızı isteyen ibare göreceksiniz ama onu şu an için önemsemeyin. Daha sonradan yerel develop
branch yayınlandığında, o ibare kaybolacak.
$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/manual.git
7d173b0..8ed4ad7 master -> master
Etiketi yayınlayın. Eğer GitHub'a giderseniz, "Release" tab altında etiketi göreceksiniz.
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/manual.git
* [new tag] 0.1.1 -> 0.1.1
Aktif branch olarak develop
'u seçin.
$ git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
$ git branch
* develop
master
hotfix/0.1.1
Hotfix branch ile develop
branchı birleştirin. Elimizdeki 'one.txt' ismindeki dosyada develop
branch içindeyken bir takım değişiklikler yapmıştık bu nedenle eski olan master
branchtaki kopya ile çakışmalar oluştu. Bunları düzeltip commit işlemini yapalım.
$ git merge hotfix/0.1.1
Auto-merging one.txt
CONFLICT (content): Merge conflict in one.txt
Automatic merge failed; fix conflicts and then commit the result.
# Conflict
$ cat one.txt
<<<<<<< HEAD
feature/hello-world # In the Step 3 above where hotfix took place, we changed this line with 'feature/hello-inanzzz'
feature/hello-mars
feature/hello-jupiter
=======
feature/hello-inanzzz
>>>>>>> hotfix/0.1.1
# Resolved
$ cat one.txt
feature/hello-inanzzz
feature/hello-mars
feature/hello-jupiter
Yerel develop
branchı yayınlayın.
$ git push origin develop
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 389 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/manual.git
53353d6..a2a8dba develop -> develop
Yerel hotfix branchı silin.
$ git branch -D hotfix/0.1.1
Deleted branch hotfix/0.1.1 (was 8ed4ad7).
$ git branch
* develop
master
Uzak hotfix branchı silin.
$ git push origin :hotfix/0.1.1
To git@github.com:inanzzz/manual.git
- [deleted] hotfix/0.1.1
Mevcut olan git durumunu kontrol et. Aşağıda gördüğümüz gibi master
branch develop
branch ile aynı değil.
$ git branch -avv
* develop a2a8dba [origin/develop] Resolved conflicts
master 8ed4ad7 [origin/master] I just fixed a bug
remotes/origin/develop a2a8dba Resolved conflicts
remotes/origin/feature/hello-mars 46fbd1b New feature updates
remotes/origin/feature/hello-world 6a26393 Feature hello-world commit
remotes/origin/master 8ed4ad7 I just fixed a bug
Eğer GitHub'a giderseniz, aşağıdaki ifadelerin gerçekleştiğini göreceksiniz.
master
ve develop
branchlar birbirleriyle aynı değil.Yayınlama işlemi yaparken, aktif branch olarak etiketi seçip, onu yayınlamalısınız.
$ git remote update
$ git checkout 0.1.1
$ git pull origin 0.1.1
$ cap production deploy
Yukarıda yapılanların kısa özetine bakalım.
# 1. Checked out into develop branch
git checkout develop
# 2. Fetched all remote updates
git remote update
# 3. Update local develop branch with remote copy
git pull origin develop
# 4. Checked out into master branch
git checkout master
# 5. Update local master branch with remote copy
git pull origin master
# 6. Created a hotfix branch that tracks origin/master
git checkout -b hotfix/0.1.1 origin/master
# 7. Did some fixes and committed to it
# 8. Pushed hotfix branch to remote repository
git push origin hotfix/0.1.1
# 9. Opened a "pull request" in GitHub for team to verify the hotfix
# 10. Checkout into master branch
git checkout master
# 11. Merged hotfix branch into master branch
git merge hotfix/0.1.1
# 12. Tagged the hotfix point by creating a new tag
git tag -a 0.1.1 -m 'Create hotfix tag 0.1.1'
# 13. Pushed master branch to remote repository
git push origin master
# 14. Pushed the tags to remote repository
git push origin --tags
# 15. Checkout into develop branch
git checkout develop
# 16. Merged hotfix branch into develop branch
git merge hotfix/0.1.1
# 17. Pushed develop branch to remote repository
git push origin develop
# 18. Removed hotfix branch from the local repository
git branch -D hotfix/0.1.1
# 19. Removed hotfix branch from the remote repository
git push origin :hotfix/0.1.1