Polecenie git push służy do przekazywania zawartości repozytorium do repozytorium zdalnego. Wypychanie umożliwia przesyłanie zatwierdzeń z repozytorium lokalnego do zdalnego. Jest to odpowiednik polecenia git fetch, ale pobieranie importuje zatwierdzenia do gałęzi lokalnych, a wypychanie do gałęzi lokalnych. Do konfigurowania gałęzi zdalnych służy polecenie git remote. Wypychanie może potencjalnie spowodować nadpisanie zmian, dlatego należy używać go ostrożnie. Kwestie te opisano poniżej.

Git push — użycie

git push <remote> <branch>

Wypycha określoną gałąź do elementu <remote> wraz ze wszystkimi wymaganymi zatwierdzeniami i obiektami wewnętrznymi. Powoduje to utworzenie gałęzi lokalnej w repozytorium docelowym. Aby zapobiec nadpisaniu zatwierdzeń, Środowisko Git nie pozwoli na wypychanie, jeżeli przyczyni się do scalenia w repozytorium docelowym bez przyspieszenia.

git push <remote> --force

Działa tak samo jak polecenie powyżej, ale wymusza wypychanie, nawet jeżeli powoduje to scalenie bez przyspieszenia. 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 znaczniki nie są automatycznie wypychane. Flaga --tags umożliwia wysłanie wszystkich znacznikó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.

Używanie polecenia git push do publikowania zmian

Na powyższym schemacie pokazano, co się dzieje, gdy postęp lokalnego elementu głównego jest większy niż w przypadku elementu głównego repozytorium centralnego, a zmiany są publikowane poprzez wykonanie polecenia git push origin master. Należy zauważyć, że polecenie git push ma zasadniczo ten sam efekt, co polecenie git merge master wewnątrz repozytorium zdalnego.

Wypychanie i synchronizacja Git

Polecenie git push to jeden z wielu komponentów używanych w całym procesie „synchronizacji” środowiska 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 poleceniagit 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ą w środowisku Git jest utworzenie zdalnie hostowanego repozytorium --bare będącego centralnym repozytorium źródłowym. To repozytorium źródłowe jest często hostowane poza siedzibą firmy u zaufanego partnera zewnętrznego, 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 za pomocą flagi --bare. Repozytoria początkowe nie mają katalogu roboczego, dlatego wypychanie nie zmieni zawartości katalogu roboczego, nad którą trwają prace. Więcej informacji na temat tworzenia repozytorium początkowego zawiera opis polecenia git init.

Wymuszanie wypychania

Środowisko 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 pobrać gałąź zdalną i scalić ją z lokalną, a następnie ponownie użyć wypychania. Przypomina to konieczność synchronizacji SVN z repozytorium centralnym za pomocą polecenia svn update przed zatwierdzeniem zestawu zmian.

Flaga --force zastępuje to zachowanie i powoduje dopasowanie gałęzi repozytorium zdalnego do lokalnego przez usunięcie zmian na wyższym poziomie, które mogły nastąpić od ostatniego wykonania polecenia pull. Jedynym przypadkiem, w którym konieczne stanie się wymuszenie wypychania, jest sytuacja, w której okaże się, że właśnie udostępnione zatwierdzenia nie były prawidłowe i naprawiono je za pomocą polecenia git commit --amend lub interaktywnej zmiany bazy. Przed użyciem opcji the --force należy jednak mieć całkowitą pewność, że inne osoby nie pobrały tych zatwierdzeń.

Przykłady

Domyślne polecenie git push

W poniższym przykładzie opisano jedną ze standardowych metod publikowania lokalnych udziałów w repozytorium centralnym. Najpierw należy się upewnić, że lokalne repozytorium główne jest aktualne, pobierając kopię repozytorium centralnego i zmieniając bazę najnowszych zmian. Interaktywna zmiana bazy to także dobra możliwość do wyczyszczenia zatwierdzeń przed ich udostępnieniem. Następnie użycie polecenia git push powoduje wysłanie wszystkich zatwierdzeń w lokalnym repozytorium głównym do repozytorium centralnego.

git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master

Ponieważ sprawdziliśmy już, że lokalne repozytorium główne jest aktualne, powinno to spowodować scalenie z przyspieszeniem, a wykonanie polecenia git push nie powinno spowodować żadnych z wymienionych powyżej zgłoszeń bez przyspieszenia.

Zmienione wypychanie wymuszone

Polecenia git commit można użyć z opcją --amend, co spowoduje aktualizację poprzedniego zatwierdzenia. Zatwierdzenie jest często zmieniane w celu aktualizacji komunikatu zatwierdzenia lub dodania nowych zmian. Po zmianie zatwierdzenia wykonanie polecenia git push nie powiedzie się, ponieważ w środowisku Git zmienione zatwierdzenie oraz zdalne zatwierdzenie będą określane jako różniąca się zawartość. W celu wypchnięcia zmienionego zatwierdzenia 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 master

Powyższy przykład zakłada wykonanie polecenia w istniejącym repozytorium z historią zatwierdzania. Polecenie git commit --amend umożliwia aktualizację poprzedniego zatwierdzenia. Zmienione zatwierdzenie jest następnie wypychane 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.