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