git remote repository - ghdrako/doc_snipets GitHub Wiki

Zdalne gałęzie są referencjami (wskaźnikami) na stan gałęzi znajdujący się w zdalnym repozytorium - zakładki przypominające w jakim stanie była gałąź przed ostatnim kontakcie z serwerem. Pomagają zrozumieć różnicę między pracą lokalną a dostępną publicznie.

Zdalne gałęzie mają specjalną właściwość. Kiedy je checkoutujesz, Git wprowadza cię w tryb odłączonego HEADa. Robi to celowo, ponieważ nie możesz pracować bezpośrednio na tych gałęziach; Zdalna gałąź zaktualizuje się tylko przy aktualizacji zdalnego repozytorium.

Zapisujemy w formacie:

(zdalny_serwer)/(gałąź)
<remote name>/<branch name>

origin/master

Origin - nie ma w gicie szczególnego znaczenia - to domyślna nazwa zdalnego serwera nadawana kiedy używamy git clone

git clone -o moj_serwer  # domyślna nazwa serwera będzie moj_serwer

Do pobierania zmian ze zdalnych repozytoriów służy polecenie git fetch - aktualizuje stan naszych zdalnych gałęzi.

git fetch wykonuje dwie rzeczy:

  • pobiera commity, które są w zdalnym repozytorium, ale których brakuje w naszym lokalnym repozytorium i...
  • aktualizuje miejsca, które wskazują nasze zdalne gałęzie (na przykład origin/main)

git fetch zasadniczo synchronizuje lokalną reprezentację zdalnego repozytorium z tym, jak w rzeczywistości zdalne repozytorium wygląda (w danej chwili) natomiast nie zmienia naszych lokalnych gałęzi. Ściąga wszystkie commity i potem możemy je użyć do aktualizacji lokalnych.

Istnieje wiele sposobów, aby to zrobić - kiedy masz już nowe commity dostępne lokalnie, możesz je dołączyć tak, jakby były zwykłymi commitami na innych gałęziach. Oznacza to, że możesz wykonywać polecenia takie jak:

  • git cherry-pick o/main
  • git rebase o/main
  • git merge o/main
git fetch origin foo

Git przejdzie do gałęzi foo w zdalnym repozytorium, weźmie wszystkie commity, których brakuje lokalnie, i zrzuci je nam na lokalną gałąź o/foo.

Za pomocą git pull można na raz wykonać pobieraniu zdalnych zmian (fetch), a następnie łączenie ich lokalnie (merge)

Przeciwieństwem git pull jest git push. Wypycha nasze zmiany na zdalne repozytorium ale tez aktualizuje stan zdalnej galezi lokalnie np origin/main Zachowanie git push bez argumentów różni się w zależności od jednego z ustawień Git o nazwie push.default. Domyślna wartość tego ustawienia zależy od wersji Git np możne być upstream

Wypchniecie zmian do zdalnego repozytorium moze sie nie udac gdy od ostatniego pobrania git fetch zaszly w nim zmiany. W tym przypadku musimy pobrać lokalnie te zmiany i scalic je z naszymi lokalnymi. Mozna to zrobic na 2 sposoby:

  • rebase
git fetch
git rebase origin/main
git push

lub w skrócie

git pull --rebase
git push
  • merge
git fetch
git merge origin/main
git push

lub w skrocie

git pull
git push

Create a Remote Git Branch

# create new branch locally
git checkout -b <branch-name>

# push local branch to remote server and create remote branch
git push -u <remote-name> <branch-name>
# or If you want to have a different name for the remote branch than the local one
git push -u <remote-name> <local-branch-name>:<remote-branch-name>

Flags:

  • -u flag (or --set-upstream), the local branch will track the remote branch.

Checkout a Remote Git Branch

# git 2.23+
git fetch
git switch remote_branch_name
# git 1.6.6+
git fetch
git checkout remote_branch_name

These commands will create the branch locally if it doesn't exist already and set the upstream to the remote-tracking branch "origin/remote_branch_name".

Please note that this is different from git checkout remote_name/branch_name. Using that command would result in a detached HEAD (unnamed branch).

You may, alternatively, also use either set of the following commands (especially when you want to name the local branch differently):

git fetch remote_name
git switch -c local_branch_name --track remote_name/remote_branch_name
git fetch remote_name
git checkout -b local_branch_name --track remote_name/remote_branch_name

Checkout a Remote Git Branch when exist multiple remotes

# git 2.23+
git fetch remote_name
git switch -c local_branch_name remote_name/remote_branch_name
git fetch remote_name
git checkout -b local_branch_name remote_name/remote_branch_name

Either of the commands mentioned above will create the local branch called "local_branch_name" and set the upstream to the remote-tracking branch "remote_name/remote_branch_name".

If your local branch and remote branch names are the same, then you may use either of the following shortcuts:

# git 2.23+
git fetch remote_name
git switch --track remote_name/remote_branch_name
# git 1.6.1+
git fetch remote_name
git checkout --track remote_name/remote_branch_name

Ustawienie galezi sledzacej o innej nazwie -

  • Sposób 1 - checkout nowej gałęzi wykorzystujący zdalną gałąź jako określoną referencję. Polecenie
git checkout -b totallyNotMain origin/main

tworzy nową gałąź o nazwie totallyNotMain i każe jej śledzić o/main.

  • Sposób 2 - Inny sposób na ustawienie remote tracking na branchu to po prostu użycie opcji git branch -u. Polecenie
git branch -u o/main foo

spowoduje, że gałąź foo będzie śledzić o/main. Jeśli aktualnie wybraną gałęzią jest foo, to możesz nawet pominąć jej nazwę:

git branch -u o/main

Synchronizacja lokalnej galezi ze zdalna

git fetch origin  
git remote add moj_serwer2
git fetch moj_serwer2

Wypychanie zmian

Before using "git push", make sure the correct local branch is checked out. Then, to perform the push, simply specify which remote branch you want to push to:

git checkout develop
git push origin develop
git push origin moja_galaz
git push origin master
git push <remote> <place>
git push origin main

Przejdź do gałęzi o nazwie "main" w moim repozytorium, weź wszystkie commity, a potem idź do gałęzi "main" na zdalnym repozytorium, które nazywa się "origin". Umieść na tej gałęzi wszystkie commity, których tam jeszcze nie ma, i daj znać, jak skończysz.

Wpisując main w miejscu argumentu "place" (miejsce), powiedzieliśmy Gitowi, skąd ma wziąć commity i gdzie je umieścić. To w zasadzie właśnie "miejsce", czyli "lokalizacja" do zsynchronizowania na obu repozytoriach.

Pamiętaj, że skoro powiedzieliśmy Gitowi wszystko, co musi wiedzieć (podając oba argumenty), będzie kompletnie ignorować, jakie miejsce mamy aktualnie wybrane!

By określić zarówno źródło, jak i cel dla , po prostu połącz je dwukropkiem:

git push origin <source>:<destination>
git push origin foo:bar # wypychanie zmian z lokalnej galezi foo do zdalnej bar
git push origin foo^:main # wypchniecie rodzica foo do zdalnego jako main

To nic innego jak refspec z dwukropkiem. Refspec to tylko wymyślny termin oznaczający lokalizację, którą Git potrafi zidentyfikować (na przykład gałąź foo albo po prostu HEAD~1).

Wypychanie brancha pierwszy raz

Use option -u to makes sure that a tracking connection between the local and the newly created remote branch is established

git push -u origin master

After having set up such a tracking connection, you can perform future pushes without providing additional options - since the tracking connection provides default values for the push command:

git push

Utworzenie lokalnej gałezi na podstawie zdalnej

git checkout -b moj_branch origin/moj_branch

Wyświetlanie listy zdalnych repozytoriów

git clone <url>
cd <repo>
git remote     # jeśli repo zostało sklonowane to zwróci **origin** ponieważ Git domyślnie w ten sposób nazywa wszystkie klonowane repozytoria
git remote -v  # zwróci dodatkowo adresy URL dla repozytoriów zdalnych. Każde ma domyślnie 2 adresy dla odczytu i zapisu

Gałęzie śledzące Tracking branch

Pobranie lokalnej gałęzi na bazie zdalnej automatycznie uruchamia mechanizm nazywany * gałęzią śledząca* tracking branch.

Gałęzią śledząca nazywamy taka gałąź lokalna która ma bezpośrednie powiązanie z gałęzią zdalna. Samo polecenie git push powoduje wypchniecie zmian a Git bedzie wiedział o jaki serwer i jaka gałąź chodzi. Tak samo git pull

Po sklonowaniu repo Git automatycznie tworzy gałąź master która śledzi zdalną gałąź origin/master. Dlatego polecenia git push i git pull mogą działać na niej bez dodatkowych parametrów.

Tworzenie gałęzi śledzącej - dodanie do lokalnego repo galezi zdalnej do sledzenia

git checkout -b [branch] [remote_server]/[branch]

Istnieje specjalny skrót --track

git checkout --track [remote_server]/[branch]

git checkout --track origin/serverfix

Nazwa lokalna brancha możne różnic się od nazwy zdalnego:

git checkout -b sp origin/server_patch # branch sp automatycznie wypycha do origin/server_patch

Można istniejąca lokalna gałąź powiązać ze zdalna opcja -u lub --set-upstream-to

git branch --set-upstream-to origin/my_branch my_local_branch
git branch --set-upstream-to origin/my_branch 
git branch -u origin/my_branch # lokalny aktywny branch zostaje powiazany z origin/my_branch

Lista galezi sledzacych

git branch -vv # stan na moment poprzedniego pobrania


git fetch all
git branch -vv # biezacy stan

Usuwanie zdalnej gałęźi

git push origin --delete server_patch

Dodanie zdalnego repozytorium

git remote # zwraca origin
git remote add pb  <url> # dodanie repo Paula
git remote -v # zwroci origin i pb z url-ami pb 
git fetch pb # pobranie repo Paula lokalnie
# Od teraz galaz master z repozytorium Paula bedzie dostepna lokalnie pod nazwa pb/master

Pobieranie i wypychanie zmian do zdalnego repozytorium

git fetch [nazwa-zdalna]

# Jesli sklonujem repozytorium to automatycznie przydzielona mu jest nazwa origin 
git fetch origin # pobranie zmian ze sklonowanego repozytorium ktore na nim zaszly od czasu klonowania lub poprzedniego fetcha  - nie jest wykonywane automatyczne zlaczenie

# Jesli jakas galez lokalna zostala skonfigurowana tak ze sledzi zdalan galaz za pomoca git pull mozna pobrac zmiany i zlaczyc z lokalna galezia

Wypychanie zmian do zdalnego repozytorium

git push [nazwa-servera] [nazwa-galezi-zdalnej]
# Jeśli chcesz wypchnąć swoja galaz master do serwera o nazwie origin:
git push origin master
# polecenie zadziała jeśli repozytorium zdalne nie było zmieniane od czasu klonowania lub fetch-a/pull-a

Sprawdzanie zdalnego repozytorium

git remote show  [nazwa serwera]
git remote show origin  # wyświetla które zdalne rep są śledzone które lokalne branche są powiązane ze zdalnymi przy git pull/push, których już nie ma w zdalnych i jakie są nowe branche których nie masz lokalnie

Usuwanie zdalnych repozytoriów i zmienianie ich nazwy

git remote rename   # pozwala ustawić nowa nazwę zdalnego serwera
git remote rename pb paul # zmiana z pb na paul
git remote
git remote rm paul # usuniecie z repo informacji o zdalnym repozytorium
git remote

Rename a Local and Remote Git Branch

If you're already on the branch (on your local) that you want to rename (along with its corresponding remote branch), then you can do the following:

# rename the branch
git branch -m new-name

# delete the old remote branch and push the new local branch
git push origin :old-name new-name

# switch to the new branch
git checkout new-name

# reset the upstream for the new local branch
git push origin -u new-name

If you're not already on the branch you wish to rename, then you just need to add the local branch name to the first command like so:

git branch -m old-name new-name

Rest of the commands should work in either case.

⚠️ **GitHub.com Fallback** ⚠️