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!


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
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

Adım 3


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

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 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.


Adım 2


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

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 8ed4ad7] 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 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

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.


Adım 7


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

Adım 8


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(-)

Adım 9


Hotfix anını etiketleyin.


$ git tag -a 0.1.1 -m 'Create hotfix tag 0.1.1'

Adım 10


Etiketi kontrol edin.


$ git tag
0.1.0
0.1.1


Adım 11


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

Adım 12


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


Adım 13


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

Adım 14


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

Adım 15


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

Adım 16


Yerel hotfix branchı silin.


$ git branch -D hotfix/0.1.1
Deleted branch hotfix/0.1.1 (was 8ed4ad7).

$ git branch
* develop
master

Adım 17


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


Adım 18


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 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