git push
Polecenie git push
służy do przekazywania zawartości repozytorium lokalnego do zdalnego repozytorium. Wypychanie umożliwia przesłanie commitów z repozytorium lokalnego do zdalnego. Jest to odpowiednik polecenia git fetch
, ale pobieranie importuje commity do gałęzi lokalnych, a wypychanie eksportuje commity do gałęzi zdalnych. Do konfiguracji gałęzi zdalnych służy polecenie git remote
. Wypychanie może potencjalnie spowodować zastąpienie zmian, dlatego podczas tego procesu należy zachować ostrożność. Te kwestie opisano poniżej.
Git push — użycie
git push <remote> <branch>
Wypycha określoną gałąź do elementu
git push <remote> --force
Działa tak samo jak polecenie powyżej, ale wymusza wypychanie, nawet jeżeli powoduje to scalenie bez przewijania. Nie należy używać flagi --force
, nie mając pewności co do podejmowanych działań.
git push <remote> --all
Umożliwia wypychanie wszystkich gałęzi lokalnych do określonego zdalnego repozytorium.
git push <remote> --tags
W przypadku wypychania gałęzi lub użycia opcji --all
tagi nie są wypychane automatycznie. Flaga --tags
umożliwia wysłanie wszystkich tagów lokalnych do repozytorium zdalnego.
Git push — dyskusja
Polecenie git push
jest najczęściej używane do publikowania i przekazywania zmian lokalnych do repozytorium centralnego. Po zmodyfikowaniu repozytorium lokalnego wykonywane jest wypychanie w celu udostępnienia modyfikacji członkom zespołu zdalnego.
Na powyższym diagramie pokazano, co się dzieje, gdy postęp lokalnej gałęzi głównej
jest większy niż postęp gałęzi głównej
repozytorium centralnego, a zmiany są publikowane poprzez wykonanie polecenia git push origin main
. Należy zauważyć, że polecenie git push
daje zasadniczo taki sam rezultat jak polecenie git merge main
wykonane z poziomu repozytorium zdalnego.
Wypychanie i synchronizacja Git
Polecenie git push
to jeden z wielu komponentów używanych w całym procesie „synchronizacji” systemu Git. Polecenia synchronizacji działają na gałęziach zdalnych skonfigurowanych za pomocą polecenia git remote
. Polecenie git push
można uznać za polecenie „przekazywania”, natomiast polecenia git fetch
i git pull
, za polecenia „pobierania”. Po przeniesieniu zestawów zmian za pomocą funkcji pobierania lub przekazywania można użyć polecenia git merge
w miejscu docelowym w celu integracji zmian.
Wypychanie do repozytoriów początkowych
Często spotykaną współczesną praktyką Git jest posiadanie zdalnie hostowanego repozytorium --bare
, które pełni funkcję centralnego repozytorium źródłowego. To repozytorium źródłowe jest często hostowane poza siedzibą u zaufanej firmy zewnętrznej, na przykład Bitbucket. Ponieważ wypychanie wpływa na strukturę gałęzi zdalnych, najbezpieczniejszym i najczęściej stosowanym rozwiązaniem jest wypychanie do repozytoriów utworzonych z flagą --bare
. Repozytoria podstawowe (bare) nie mają katalogu roboczego, dlatego wypychanie nie zmieni zawartości katalogu roboczego, nad którą trwają prace. Więcej informacji na temat tworzenia repozytorium podstawowego zawiera opis polecenia git init
.
Wymuszanie wypychania
Git zapobiega nadpisaniu historii w repozytorium centralnym, odrzucając żądania wypychania, gdy powodują scalanie bez przyspieszenia. Jeżeli więc historia zdalna różni się od lokalnej, należy ściągnąć gałąź zdalną i scalić ją z lokalną, a następnie ponownie spróbować wypychania. Przypomina to konieczność synchronizacji SVN z repozytorium centralnym za pomocą polecenia svn update
przed zatwierdzeniem zestawu zmian.
Flaga --force
unieważnia to zachowanie i powoduje dopasowanie gałęzi repozytorium zdalnego do lokalnego przez usunięcie zmian nadrzędnych, które mogły nastąpić od ostatniego ściągania. Jedynym przypadkiem, w którym konieczne stanie się wymuszenie wypychania, jest sytuacja, w której okaże się, że właśnie udostępnione commity nie były całkiem prawidłowe i naprawiono je za pomocą polecenia git commit --amend
lub interaktywnej zmiany bazy. Przed użyciem opcji the --force
należy jednak upewnić się całkowicie, że inne osoby nie ściągnęły tych commitów.
Przykłady
Domyślne polecenie git push
W poniższym przykładzie opisano jedną ze standardowych metod publikowania lokalnych wyników prac w repozytorium centralnym. Najpierw należy się upewnić, że lokalna gałąź główna jest aktualna, pobierając kopię repozytorium centralnego i przeprowadzając operację zmiany bazy w celu uwzględnienia najnowszych zmian. Interaktywna zmiana bazy to także dobra możliwość do wyczyszczenia commitów przed ich udostępnieniem. Następnie użycie polecenia git push
powoduje wysłanie wszystkich commitów z lokalnej gałęzi głównej do repozytorium centralnego.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
Ponieważ upewniliśmy się już, że lokalna gałąź główna jest aktualna, powinno to spowodować scalenie z przewinięciem, a polecenie git push
nie powinno zgłosić żadnego z omówionych powyżej problemów uniemożliwiających scalenie z przewijaniem.
Zmienione wypychanie wymuszone
Polecenia git commit
można użyć z opcją --amend
, co spowoduje aktualizację poprzedniego commita. Commit jest często poprawiany w celu aktualizacji komunikatu dotyczącego commita lub dodania nowych zmian. Po poprawieniu commita wykonanie polecenia git push
nie powiedzie się, ponieważ w Git poprawiony commit oraz zdalny commit będą interpretowane jako różniąca się zawartość. W celu wypchnięcia poprawionego commita należy użyć opcji --force
.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin main
Powyższy przykład zakłada wykonanie polecenia w istniejącym repozytorium z historią commitów. Polecenie git commit --amend
umożliwia aktualizację poprzedniego commita. Poprawiony commit jest następnie wypychany z wymuszeniem za pomocą opcji --force
.
Usuwanie gałęzi zdalnej lub znacznika
Czasami gałęzie wymagają oczyszczenia ze względów księgowych lub organizacyjnych. Aby całkowicie usunąć gałąź, należy usunąć ją lokalnie oraz zdalnie.
git branch -D branch_name
git push origin :branch_name
Powyższe polecenie spowoduje usunięcie gałęzi zdalnej o nazwie branch_name. Przekazanie nazwy gałęzi poprzedzonej dwukropkiem do polecenia git push
spowoduje usunięcie gałęzi zdalnej.