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.



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! Ayrıca aşağıdaki komutlar içinde geçen "Summary of actions" notlarına dikkat edin.


Senaryo


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.


Hazırlık


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.


Adım 1


Aktif branch olarak develop'u seçin.


$ git branch
* develop
master

Adım 2


Tüm yenilikleri alın.


$ git remote update
Fetching origin

Adım 3


Yerel develop branchı yenileyin.


$ git pull origin develop
From github.com:inanzzz/manual
* branch develop -> FETCH_HEAD
Already up-to-date.

Adım 4


Aktif branch olarak master'ı seçin.


$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

Adım 5


Yerel master branchı yenileyin.


$ git pull origin master
From github.com:inanzzz/manual
* branch master -> FETCH_HEAD
Already up-to-date.

Hotfix branch yaratma


Adım 1


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 af6ea41 [origin/develop] Feature hello-mars commit
* master 8aa2add [origin/master] I merged release 0.1.0
remotes/origin/develop af6ea41 Feature hello-mars commit
remotes/origin/master 8aa2add I merged release 0.1.0


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.


Adım 2


Hotfix branchı başlat.


$ git flow hotfix start 0.1.1
Switched to a new branch 'hotfix/0.1.1'

Summary of actions:
- A new branch 'hotfix/0.1.1' was created, based on 'master'
- You are now on branch 'hotfix/0.1.1'

Follow-up actions:
- Start committing your hot fixes
- Bump the version number now!
- When done, run:

git flow hotfix finish '0.1.1'

Aşağıda da gördüğümüz gibi hotfix branch ana olarak master branchtan türemiş durumda.


$ git branch -avv
develop af6ea41 [origin/develop] Feature hello-mars commit
* hotfix/0.1.1 8aa2add I merged release 0.1.0
master 8aa2add [origin/master] I merged release 0.1.0
remotes/origin/develop af6ea41 Feature hello-mars commit
remotes/origin/master 8aa2add I merged release 0.1.0

Adım 3


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 2a0bb96] I just fixed a bug
1 file changed, 1 insertion(+), 1 deletion(-)

$ cat one.txt 
feature/hello-inanzzz

Adım 4


Bir "pull request" yaratmak için yayınlayın.


$ git flow hotfix publish 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), 316 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/gitflow.git
* [new branch] hotfix/0.1.1 -> hotfix/0.1.1
Branch hotfix/0.1.1 set up to track remote branch hotfix/0.1.1 from origin.
Already on 'hotfix/0.1.1'
Your branch is up-to-date with 'origin/hotfix/0.1.1'.

Summary of actions:
- The remote branch 'hotfix/0.1.1' was created or updated
- The local branch 'hotfix/0.1.1' was configured to track the remote branch
- You are now on branch 'hotfix/0.1.1'

Adım 5


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.




Adım 6


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.


$ git branch -avv
develop af6ea41 [origin/develop] Feature hello-mars commit
* hotfix/0.1.1 2a0bb96 [origin/hotfix/0.1.1] I just fixed a bug
master 8aa2add [origin/master] I merged release 0.1.0
remotes/origin/develop af6ea41 Feature hello-mars commit
remotes/origin/hotfix/0.1.1 2a0bb96 I just fixed a bug
remotes/origin/master 8aa2add I merged release 0.1.0

Adım 7


Hotfix branchı sonlandırın.


$ git flow hotfix finish 0.1.1
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Merge made by the 'recursive' strategy.
one.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
Merge made by the 'recursive' strategy.
one.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
To git@github.com:inanzzz/gitflow.git
- [deleted] hotfix/0.1.1
Deleted branch hotfix/0.1.1 (was 2a0bb96).

Summary of actions:
- Hotfix branch 'hotfix/0.1.1' has been merged into 'master'
- The hotfix was tagged '0.1.1'
- Hotfix tag '0.1.1' has been back-merged into 'develop'
- Hotfix branch 'hotfix/0.1.1' has been locally deleted; it has been remotely deleted from 'origin'
- You are now on branch 'develop'

Aşağıda gördüğümüz gibi, yerel branchlar uzak branchlardan daha ileride bu nedenler bir sonraki adımlarda yerel branchları yayınlayacağız.


$ git branch -avv
* develop 4ef055f [origin/develop: ahead 3] I merged hotfix 0.1.1
master 158948f [origin/master: ahead 2] I merged hotfix 0.1.1
remotes/origin/develop af6ea41 Feature hello-mars commit
remotes/origin/master 8aa2add I merged release 0.1.0

Adım 8


Yerel develop branchı yayınlayın.


$ git push origin develop
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 695 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:inanzzz/gitflow.git
af6ea41..4ef055f develop -> develop

Adım 9


Yerel master branchı yayınlayın.


$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:inanzzz/gitflow.git
8aa2add..158948f master -> master


Adım 10


Etiketi kontrol edin.


$ git tag
0.1.0
0.1.1

Adım 11


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/gitflow.git
* [new tag] 0.1.1 -> 0.1.1


Adım 12


Mevcut olan git durumunu kontrol et. Herşey yolunda gitmiş gibi görünüyor!


$ git branch -avv
* develop 4ef055f [origin/develop] I merged hotfix 0.1.1
master 158948f [origin/master] I merged hotfix 0.1.1
remotes/origin/develop 4ef055f I merged hotfix 0.1.1
remotes/origin/master 158948f I merged hotfix 0.1.1

Adım 13


Eğer GitHub'a giderseniz, aşağıdaki ifadelerin gerçekleştiğini göreceksiniz.



Yayınlama


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

Özet


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 master
git flow hotfix start 0.1.1

# 7. Did some fixes and committed to it

# 8. Published hotfix branch to remote repository
git flow hotfix publish 0.1.1

# 9. Opened a "pull request" in GitHub for team to verify the hotfix

# 10. Finished hotfix branch
git flow hotfix finish 0.1.1

# 11. Push develop branch
git push origin develop

# 12. Push master branch
git push origin master

# 13. Pushed the tags to remote repository
git push origin --tags