Wypchnąć oznacza wysłanie lokalnych commitów do zdalnego repozytorium Git, udostępniając je innym członkom zespołu. Po pushu zmiany pojawiają się na GitHub, GitLab lub Bitbucket. Według GitHub Octoverse 2024, codziennie na platformę pushowanych jest ponad 10 milionów commitów. Git push to kluczowa czynność synchronizacji pracy w rozproszonym zespole.
Najważniejsze
Git push to polecenie, które przekazuje commity z lokalnego repozytorium do zdalnego. W przeciwieństwie do commitu, który zapisuje zmiany tylko na lokalnym komputerze programisty, push publikuje te zmiany dla całego zespołu. Push to obowiązkowy krok przed utworzeniem Pull Request i wdrożeniem.
Architektura Git zakłada, że każdy programista pracuje we własnym lokalnym repozytorium. Commity są tworzone lokalnie i kumulują się, dopóki programista nie zdecyduje się je wypchnąć. Daje to swobodę: można robić wiele lokalnych commitów, eksperymentować i przepisywać historię bez wpływu na kolegów.
# Push do origin remote, gałąź main
git push origin main
# Push bieżącej gałęzi do remote z upstream
git push -u origin feature/new-dashboard
# Push wszystkich gałęzi z pasującymi nazwami
git push --all origin
# Force push z lease (bezpieczny force push)
git push --force-with-lease
Po pushu zdalne repozytorium aktualizuje refs (referencje do gałęzi) tak, aby wskazywały na nowe commity. Inni programiści mogą pobrać te zmiany za pomocą git pull lub git fetch. To właśnie ta wymiana commitów stanowi podstawę pracy zespołowej.
Polecenie git push porównuje lokalne i zdalne gałęzie i przekazuje tylko brakujące commity. Git nie wysyła wszystkich plików od nowa — przekazuje tylko deltę, co sprawia, że push jest szybki nawet w przypadku dużych repozytoriów. Protocol Git wykorzystuje smart transfer, który minimalizuje ilość przesyłanych danych.
Jeśli zdalna gałąź zawiera commity, których nie ma lokalnie, push zostanie odrzucony. To mechanizm ochronny zapobiegający utracie zmian. W takiej sytuacji programista powinien najpierw wykonać git pull, scalić zmiany, a dopiero potem ponownie wypchnąć. Alternatywą jest force push, który nadpisuje zdalną gałąź, ale należy go używać ostrożnie.
| Polecenie | Działanie | Kiedy używać |
|---|---|---|
| git push | standardowy push do tracked gałęzi | zwykłe wysyłanie zmian |
| git push -u | push z ustawieniem upstream | pierwszy push nowej gałęzi |
| git push --force-with-lease | bezpieczny force push | po rebase własnej gałęzi |
| git push --force | wymuszony push | tylko jeśli jesteś pewien braku kolizji |
| git push --delete | usunięcie zdalnej gałęzi | czyszczenie po mergu gałęzi |
Zrozumienie zdalnych repozytoriów to klucz do prawidłowego pusha. Zwykle używa się origin — domyślnej nazwy zdalnego repozytorium. Polecenie git remote -v pokazuje listę zdalnych repozytoriów i ich adresy URL. Można dodać kilka remote (np. origin dla głównego repozytorium i upstream dla forka).
Podstawowa zasada: pushować należy po każdym logicznie zakończonym etapie pracy. Jeśli programista ukończył zadanie lub jego część — czas wypchnąć. Jednak pushowanie niedokończonej pracy, która psuje build, nie jest zalecane. Niezepsuty build to minimalne wymaganie dla pusha do dowolnej gałęzi.
W programowaniu zespołowym przyjęty jest następujący rytm: rano — git pull, aby pobrać zmiany kolegów, w ciągu dnia — kilka commitów i jeden lub dwa pushe, wieczorem — finalny push wszystkich ukończonych zadań. Im częściej programista pushuje, tym mniejsze ryzyko konfliktów przy scalaniu gałęzi i tym bardziej przejrzysty jest postęp pracy.
Bezpieczny push to zestaw zasad zapobiegających utracie danych i konfliktom w zespole. Pierwsza i najważniejsza zasada: nigdy nie pushować bezpośrednio do gałęzi main lub master, jeśli w projekcie nie skonfigurowano bezpośredniego wdrożenia. W nowoczesnych zespołach ochrona gałęzi main jest konfigurowana na poziomie GitHub branch protection.
Druga zasada: przed pushem zsynchronizować się ze zdalną gałęzią. Wykonać git pull --rebase, aby uniknąć merge commitu przy scalaniu. Upraszcza to historię i czyni ją liniową. Jeśli push został odrzucony — nie używać gołego force push, a najpierw sprawdzić, jakie commity pojawiły się na zdalnej gałęzi.
Trzecia zasada: skonfigurować pre-push hooki, które automatycznie uruchamiają testy i linter przed wysłaniem. Jeśli testy padają — push jest blokowany. Takie hooki konfiguruje się przez Husky lub Git hooks (plik pre-push w .git/hooks).
Czwarta zasada: nie pushować dużych plików binarnych. Git nie jest przeznaczony do przechowywania binarnych artefaktów — rozdymają one repozytorium i spowalniają operacje. Do dużych plików używa się Git LFS (Large File Storage). Jeśli plik binarny został już wypchnięty i trafił do historii, należy go usunąć przez git filter-branch.
Najczęstszą przyczyną nieudanego pusha jest zdalna gałąź zawierająca commity, których nie ma lokalnie. Dzieje się tak, gdy inny programista wypchnął swoje zmiany do tej samej gałęzi. Rozwiązanie: wykonać git pull, rozwiązać ewentualne konflikty i powtórzyć push.
# Push odrzucony — najpierw fetch i rebase
git fetch origin
git rebase origin/main
# Rozwiąż konflikty, następnie:
git push --force-with-lease
# Lub po prostu scal zmiany zdalne
git pull origin main
git push
Drugą przyczyną jest brak praw zapisu do gałęzi. Jeśli gałąź main jest chroniona regułą branch protection, bezpośrednie pushe są zabronione. Rozwiązanie: pushować do gałęzi feature i tworzyć Pull Request. Ustawienia ochrony są zwykle administrowane przez GitHub settings lub GitLab protected branches.
Trzecią przyczyną są problemy z uwierzytelnianiem. Nieaktualne dane logowania, przejście na SSH lub zmiana personal access token. Rozwiązanie: sprawdzić remote URL (git remote -v) i zaktualizować dane logowania. Od 2021 roku GitHub anulował uwierzytelnianie hasłem dla HTTPS — używa się tokena osobistego lub klucza SSH.
Często zadawane pytania
Wypchnąć oznacza wysłanie lokalnych commitów z repozytorium programisty na zdalny serwer (GitHub, GitLab). Po pushu zmiany stają się dostępne dla zespołu, pojawiają się w Pull Request i mogą zostać wdrożone. Push to końcowy etap lokalnej pracy z kodem przed współpracą zespołową.
Commit zapisuje zmiany lokalnie, w repozytorium programisty. Push wysyła te lokalne commity na zdalny serwer. Można zrobić wiele commitów bez pusha, ale aby koledzy zobaczyli zmiany, trzeba wypchnąć. Commit — zapisanie, push — publikacja.
Push jest odrzucany, jeśli zdalna gałąź zawiera commity, których nie ma lokalnie. Rozwiązanie: wykonaj git pull (lub git fetch + git rebase), scalić zmiany i powtórzyć push. Jeśli pracujesz we własnej gałęzi feature i jesteś pewien zmian, użyj git push --force-with-lease.
Tak, ale ostrożnie. Użyj git revert <commit-hash> — tworzy on commit odwracający zmiany. Następnie wypchnij nowy commit. Jeśli chcesz usunąć commity z historii, użyj git reset + git push --force-with-lease, ale tylko we własnej gałęzi feature. git revert to bezpieczny wybór dla wspólnych gałęzi.
Regularny push zapobiega utracie danych przy awarii lokalnego komputera, zmniejsza konflikty przy scalaniu i daje zespołowi wgląd w postęp prac. Jeśli programista nie pushuje przez tydzień, jego zmiany mogą znacznie odbiegać od gałęzi main, co prowadzi do skomplikowanych konfliktów przy mergu.
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ż