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

Używanie polecenia git push do publikowania zmian

The above diagram shows what happens when your local main has progressed past the central repository’s main and you publish changes by running git push origin main. Notice how git push is essentially the same as running git merge main from inside the remote repository.

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

The following example describes one of the standard methods for publishing local contributions to the central repository. First, it makes sure your local main is up-to-date by fetching the central repository’s copy and rebasing your changes on top of them. The interactive rebase is also a good opportunity to clean up your commits before sharing them. Then, the git push command sends all of the commits on your local main to the central repository.

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

Since we already made sure the local main was up-to-date, this should result in a fast-forward merge, and git push should not complain about any of the non-fast-forward issues discussed above.

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.