Hotfix Branch — to typ gałęzi w Git, przeznaczony do awaryjnego naprawiania krytycznych błędów w środowisku produkcyjnym. W przeciwieństwie do zwykłych gałęzi, hotfix jest tworzony bezpośrednio z gałęzi głównej (main/master) i po naprawie scalany jednocześnie z main i develop. Według danych Atlassian, 2025, model Git Flow z gałęziami hotfix jest używany w 67% zespołów pracujących według ścisłego harmonogramu wydań.
Najważniejsze
Hotfix Branch — to tymczasowa gałąź w Git, która jest tworzona w celu szybkiego naprawiania krytycznych defektów w działającym środowisku produkcyjnym. W przeciwieństwie do gałęzi feature, które odgałęziają się od develop i żyją kilka dni lub tygodni, hotfix jest tworzony z main/master i istnieje dokładnie tak długo, jak potrzeba do naprawienia błędu.
Głównym zadaniem hotfix jest minimalizacja czasu między wykryciem krytycznego błędu a jego naprawą na produkcji. Zespół nie czeka na zakończenie bieżącego sprintu lub cyklu wydawniczego, tylko wypuszcza poprawkę natychmiast. Jest to szczególnie ważne w przypadku aplikacji mobilnych, gdzie krytyczny błąd może zablokować użytkowników i doprowadzić do odpływu.
Według danych Google Play Console, średni czas moderacji aktualizacji w Google Play wynosi od 2 do 24 godzin. Dla App Store ekspresowy przegląd może zająć od 1 do 4 godzin. Gałęzie hotfix pozwalają przygotować poprawkę jeszcze przed zakończeniem moderacji i wdrożyć ją natychmiast po zatwierdzeniu.
Proces hotfix składa się z trzech kroków: utworzenie gałęzi z main, wprowadzenie poprawki i scalenie z powrotem do main i develop. Kluczowa różnica w stosunku do zwykłej naprawy — hotfix jest zawsze scalany z obiema gałęziami, aby poprawka nie została utracona przy następnym wydaniu.
Zespół nie powinien dodawać do hotfix nowej funkcjonalności ani refaktoryzować. Tylko konkretna poprawka, minimalnie niezbędna do usunięcia krytycznego problemu. Każde odstępstwo od tej zasady zwiększa ryzyko regresji i wydłuża czas wypuszczenia poprawki.
Hotfix jest niezbędny w trzech scenariuszach: krytyczny błąd blokuje użytkowników (crash, utrata danych), luka w zabezpieczeniach wymaga natychmiastowego zamknięcia lub zepsuta jest krytyczna logika biznesowa (płatności, autoryzacja). Jeśli błąd nie jest krytyczny — można go naprawić w ramach zwykłego cyklu wydawniczego przez develop.
Dla aplikacji mobilnych hotfix może również obejmować zmiany serwerowe, jeśli architektura pozwala na zdalne przełączanie funkcji (feature flags). W takim przypadku gałąź hotfix może być minimalna lub w ogóle niepotrzebna, jeśli poprawka jest wykonywana po stronie serwera.
Nie wszystkie modele rozgałęzień obsługują gałęzie hotfix. Tradycyjny Git Flow przewiduje hotfix jako pełnoprawny typ gałęzi, a nowocześniejsze podejścia (GitHub Flow, Trunk-based) rozwiązują zadanie awaryjnych napraw inaczej.
Git Flow — to jedyny model, w którym hotfix jest wbudowanym typem gałęzi obok feature i release. W Git Flow hotfix jest tworzony z main, a po zakończeniu scalany zarówno z main (z tagiem wersji), jak i z develop. Gwarantuje to, że poprawka nie zostanie utracona w następnym wydaniu.
| Cecha | Hotfix w Git Flow | Feature w Git Flow |
|---|---|---|
| Z której gałęzi | main | develop |
| Dokąd scalany | main + develop | develop |
| Czas życia | godziny | dni / tygodnie |
| Zawartość | tylko naprawa błędu | nowa funkcjonalność |
GitHub Flow nie używa oddzielnego typu gałęzi dla hotfix. Zamiast tego programista tworzy zwykłą gałąź feature z main, wprowadza poprawkę i otwiera Pull Request. Po przeglądzie i testach CI gałąź jest scalana z main i natychmiast wdrażana. Zaletą jest prostota, wadą — brak oddzielnego kanału dla pilnych napraw.
Trunk-based rozwiązuje zadanie hotfix przez bezpośrednie commity do main (w krytycznych przypadkach) z obowiązkowym przeglądem post factum. To podejście wymaga wysokiej dyscypliny zespołu i niezawodnych automatycznych testów, ponieważ zmiany trafiają do produkcji natychmiast.
Tworzenie hotfix zaczyna się od przełączenia się na główną gałąź i utworzenia nowej gałęzi z prefiksem hotfix/. Rozważmy proces krok po kroku na przykładzie naprawy krytycznego błędu w aplikacji mobilnej.
Pierwszy krok — przełącz się na main i upewnij się, że gałąź jest aktualna. Następnie utwórz gałąź hotfix z czytelną nazwą odzwierciedlającą istotę naprawy.
# Przełącz się na main i pobierz najnowsze zmiany
git checkout main
git pull origin main
# Utwórz gałąź hotfix
git checkout -b hotfix/crash-on-login
Po utworzeniu gałęzi można wprowadzić poprawkę. Ważne: hotfix powinien zawierać minimalną liczbę zmian. Nie należy refaktoryzować kodu ani dodawać nowych możliwości — tylko konkretna poprawka, która usuwa problem.
Commit w hotfix powinien mieć informacyjną wiadomość, która jednoznacznie opisuje problem i jego rozwiązanie. Format: typ(obszar): krótki opis + link do zadania w trackerze.
# Dodaj zmodyfikowane pliki
git add src/ui/login/LoginActivity.kt
# Utwórz commit z opisem
git commit -m "fix(login): handle null intent on activity resume
Fixes CRASH-142: NullPointerException when LoginActivity
receives onNewIntent after being destroyed by system"
Wiadomość commita powinna zawierać opis problemu i link do zadania. Upraszcza to wyszukiwanie w historii i pomaga współpracownikom zrozumieć, co zostało naprawione i dlaczego. W projektach mobilnych zwykle podaje się również wersję aplikacji, w której wykryto błąd.
Ostatni krok — scal hotfix z powrotem z main (z tagiem nowej wersji łatki) i z develop (aby poprawka została zachowana w następnym wydaniu). Najpierw tworzone jest scalenie z main z tagiem, następnie scalenie z develop.
# Scal do main i utwórz tag
git checkout main
git merge --no-ff hotfix/crash-on-login
git tag -a v2.3.1 -m "Hotfix: crash on login"
# Scal do develop
git checkout develop
git merge --no-ff hotfix/crash-on-login
# Wyślij zmiany na serwer
git push origin main --tags
git push origin develop
Flaga --no-ff gwarantuje utworzenie commita scalenia, nawet jeśli hotfix można by zastosować przez fast-forward. Zachowuje to informację o tym, że wykonano awaryjną naprawę, i upraszcza analizę historii w przyszłości.
Hotfix zasadniczo różni się od gałęzi feature i release pod względem celu, czasu życia i zasad scalania. Zrozumienie tych różnic jest kluczowe dla prawidłowej organizacji procesów Git w zespole.
Gałąź feature jest przeznaczona do nowej funkcjonalności. Żyje od kilku dni do kilku tygodni, tworzona jest z develop i scalana z powrotem do develop. Feature może zawierać wiele commitów, w tym eksperymentalnych, które później są ściskane przez squash lub rebase.
Gałąź release przygotowuje wydanie do publikacji. Tworzona jest z develop, w niej naprawiane są błędy znalezione podczas stabilizacji i nie przyjmuje nowej funkcjonalności. Po zakończeniu release jest scalana z main (z tagiem) i develop.
Hotfix natomiast jest tworzony i scalany bezpośrednio z main, z pominięciem develop (choć po naprawie synchronizuje się również z develop). Zawiera minimalną liczbę zmian i istnieje minimalny czas. Jeśli feature lub release można odłożyć do następnego cyklu, hotfix — nie.
Dla rozwoju aplikacji mobilnych to rozróżnienie jest szczególnie ważne: App Store i Google Play pozwalają wypuszczać wersje łatki oddzielnie od głównych wydań. Gałąź hotfix zapewnia proces, w którym wydanie łatki nie miesza się z niedokończonymi funkcjami.
Błędy przy pracy z hotfix mogą zniweczyć zalety awaryjnej naprawy. Rozważmy pięć najczęstszych problemów, które występują w zespołach używających Git Flow.
Każdy z tych błędów prowadzi do opóźnienia wydania łatki lub do pojawienia się nowych problemów w produkcji. Zespoły powinny ustalić zasady pracy z hotfix w CONTRIBUTING.md i zautomatyzować je przez kontrole CI/CD.
Często zadawane pytania
Hotfix naprawia krytyczny błąd w produkcji i jest tworzony z main, podczas gdy zwykła naprawa błędu naprawia błąd w develop i zostanie włączona do następnego planowego wydania. Hotfix wymaga natychmiastowego wypuszczenia wersji łatki.
Tak, hotfix można utworzyć w dowolnym modelu rozgałęzień. W GitHub Flow używa się do tego zwykłej gałęzi feature z main z następującym Merge przez Pull Request. W Trunk-based — bezpośredni commit do main z obowiązkowym przeglądem post factum.
Wskazane, ale dopuszczalne jest przyspieszone review. W przypadku krytycznych błędów można użyć mechanizmu „approve after merge” — hotfix jest najpierw scalany, a review przeprowadzane jest post factum. Najważniejsze to ustalić taką procedurę w zasadach zespołu.
Format: hotfix/krótki-opis-problemu. Na przykład: hotfix/null-pointer-auth, hotfix/crash-on-payment. Nazwa powinna być zrozumiała dla wszystkich członków zespołu i najlepiej zawierać numer zadania w trackerze.
Rozwiązać konflikt przy scalaniu z develop tak samo, jak przy zwykłym merge. Jeśli konflikt jest znaczący — możliwe, że w develop były zmiany dotyczące tego samego obszaru. W takim przypadku ważne jest upewnienie się, że poprawka działa poprawnie z nowym kodem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również