Git - push i pull (pchnij i ściągnij)

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 751 razy

Tak, tak drogie żuczki i inne stworzenia Boże. Czas na poważną wszakże rozmowę. O pchaniu i ściąganiu informacji do/z repozytorium na GitHub-ie. Tylko żadnych mi kosmatych myśli! To poważny temat dla poważnych ludzi!

To pchnijmy projekt w świetlaną przyszłość dodając nowego branch-a:

git checkout -b someNewBranch
Switched to a new branch 'someNewBranch'

i oczywiście dodając jakiś plik tekstowy np. someNewStuff.txt a następnie dodając i commit-ując:

git add someNewStuff.txt
git commit -m "add someNewStuff.txt"
[someNewBranch ec70df2] add someNewStuff.txt    
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 someNewStuff.txt

Teraz z najdzikszą rozkoszą można się oddać procederowi pchnięcia nowego branch-a do repozytorium:

git push
fatal: The current branch someNewBranch has no upstream branch.
To push the current branch and set the remote as upstream, use 

    git push --set-upstream origin someNewBranch

Ale cóż to? Git zapłakał rzewnymi łzami! Ale spokojna twoja rozczochrana! Albowiem git mądre gacie podpowiada co trzeba zrobić, a nawet i trochę wyjaśnia dlaczego. Oto i rozwiązanie problemu:

git push --set-upstream origin someNewBranch
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 531 bytes | 531.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: This repository moved. Please use the new location:
remote:   https://github.com/<user name>/<repo name>.git
remote: 
remote: Create a pull request for 'someNewBranch' on GitHub by visiting:
remote:      https://github.com/<user name>/<repo name>/pull/new/someNewBranch
remote:
To https://github.com/<user name>/<repo name>.git
 * [new branch]      someNewBranch -> someNewBranch
Branch 'someNewBranch' set up to track remote branch 'someNewBranch' from 'origin'.

W tej chwili zapewne na twe usta spragnione odpowiedzi ciśnie się pytanie: Ale jak to? A no tak to, że istnieją trzy typy branch-y:

Listę lokalnych nożna wyświetlić w następujący sposób:

git branch
  master
* someNewBranch

Natomiast listę wszystkich:

git branch -a
  master
* someNewBranch
  remotes/origin/master
  remotes/origin/someNewBranch

Nie muszę chyba tłumaczyć, że ci w komunistycznych kolorach to kopie zdalnych, które nie zawsze są aktualne.

Teraz niezwłocznie przełączę się na branch-a:

git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

by po chwili (lub co najwyżej dwóch) spróbować ściągnąć zmiany do mastera w następujący przebiegły sposób:

git pull origin someNewBranch
From https://github.com/<user name>/<repo name>
 * branch            someNewBranch -> FETCH_HEAD
Updating 992f8ae..c1622e9
Fast-forward
 someNewStuff.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 someNewStuff.txt

I znów, to samo pytanie po raz drugi z rzędu: Ale jak to?! Okazuje się bowiem, że operacja pull pozwala ściągnąć zmiany z wskazanego branch-a i merge-ować je!

Gdyby tak się zdarzyło, że w trakcie twojej pracy na tym samym branch-u ktoś dokonał modyfikacji to możliwe jest ściągnięcie ich do lokalnego branch-a w następujący sposób:

git pull
Propozycje książek