Git/Przypadki

Z Wikibooks, biblioteki wolnych podręczników.
< Git
Skocz do: nawigacji, wyszukiwania

Wcześniej musimy ustalić ustawienia SSH[1].

Schemat działań Gita


Szybki start (do uprządkowania)[edytuj]

Podstawowa obsługa Gita może być nieco zagmatwana dla początkujących. I tak:

  • Tworzenie gałęzi to "git checkout -b".

"git branch" powinno być używane tylko do wylistowania i usuwania gałęzi.

  • Współdzielisz swoją pracę przez "git fetch" (pobranie) i "git push" (wysłanie). To są przeciwieństwa.
  • "git pull" może również zrobić "git fetch" ale to jest opcjonalne.
  • Większość operacji wykonuje się przez "git polecenie".

Aby uzyskać pomoc na temat jakiegoś polecenia wpisujemy "git help polecenie" lub "git --help".


Obsługa git w edytorze vim

Uwaga! git nie dodaje pustych katalogów do repozytorium. To wynika z koncepcji, że git śledzi zawartość plików a nie pliki.

mkdir git_repo   # tworzymy katalog w którym będzie nasze repozytorium plików, możemy nazwać jak chcemy
cd git_repo      # przechodzimy do tego katalogu
git init         # inicjalizujemy bazę repozytorium (katalog .git)

Teraz wgrywamy do tego katalogu pliki lub tworzymy nowe.

git add .        # dodajemy wszystkie pliki do śledzenia z aktualnego katalogu, kropka oznacza właśnie katalog aktualny
git status       # sprawdzamy status naszego repozytorium, to polecenie pokaże które pliki zmienione, a które nowe
git commit -a    # zatwierdzamy zmiany czyli wysyłamy pliki do bazy repozytorium

Samo polecenie git commit zapisze tylko pliki, które zostały dodane poleceniem git add. Dlatego dodajemy -a, żeby nie dodawać ręcznie każdego zmienionego pliku. Nowe pliki trzeba jednak dodać przez git add.

git log          # sprawdzamy historię zatwierdzeń
git whatchanged -p # historia zmian razem z diff
git whatchanged --pretty=oneline # wyświetla tylko nazwy zmienionych plików

Jeśli chcemy, możemy rozgałęziać nasz projekt tworząc gałęzie. Domyślnie nowy projekt jest w gałęzi master. Wszystkie gałęzie można wylistować poleceniem

git branch

Znak * wskazuje aktualną gałąź.

Jeśli chcemy graficznie zobaczyć nasze drzewo kodu, to trzeba użyć polecenia gitk (w gentoo "gitview")

Przypadki użycia[edytuj]

Kopiowanie plików na serwer[edytuj]

Dodajemy zdalny serwer ( tutaj GitHub) :

git remote add github_c https://github.com/adammaj1/c

Sprawdzamy zdalne repo :

git remote show github_c

Otrzymujemy wynik :

* remote github_c
 Fetch URL: https://github.com/adammaj1/c
 Push  URL: https://github.com/adammaj1/c
 HEAD branch: master
 Remote branch:
   master new (next fetch will store in remotes/github_c)
 Local ref configured for 'git push':
   master pushes to master (local out of date)


Próbujemy wysłać pliki do zdalnego repozytorium ( ang. remote ):

git push github_c master

Najpierw musimy się zalogować :

Username: 
Password: 

Otrzymujemy odpowiedź :

To https://github.com/adammaj1/c
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/adammaj1/c'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Przyczyną błędu jest ... ( do zrobienia)

Rozwiązaniem jest : [2]

git pull github_c master

Otrzymujemy :

From https://github.com/adammaj1/c
* branch            master     -> FETCH_HEAD
Merge made by recursive.
README.md |    4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
create mode 100644 README.md

Następnie powtarzamy :

git push github_c master

I mamy pliki w zdalnym repo !

Usuwanie gałęzi ze zdalnego repo[edytuj]

git push origin :<branch_name>

Kopiowanie projektu z serwera[edytuj]

Na serwerze Gitorius zaintersował nas projekt Mandulia. Chcemy skopiować oprogramowanie na nasz komputer. W tym celu w konsoli wpisujemy :

git clone git://gitorious.org/maximus/mandulia.git

Otrzymujemy informacje gdzie projekt jest kopiowany :

Initialized empty Git repository in /home/user/mandulia/.git/

( powyższy katalog jest przykładowy).

Teraz możemy w konsoli przejść do tego katalogu

cd mandulia

lub użyć programu z GUI np. gitg


Wrzucanie do git aktualnego projektu[edytuj]

Załóżmy, że przechowujesz już swój projekt w katalogu projekt1, więc przechodzimy do tego katalogu

cd projekt1

Chcemy teraz, aby git śledził pliki z projektu i pozwalał nam zarządzać wersjami plików, przeglądać historię itp. Musimy więc utworzyć lokalne repozytorium, wewnątrz katalogu projekt1.

git init

Utworzony zostanie ukryty katalog projekt1/.git , w którym git będzie przechowywał wszystkie zmiany, które każemy mu pamiętać.

Następnie dodajemy wszystkie pliki do indeksu (coś jak poczekalnia dla plików)

git add .

Możemy sprawdzić co się zmieniło :

git status

Na koniec przenosimy pliki z poczekalni od repozytorium

git commit -m 'pierwszy zapis do repo'

Wszystkie te zmiany odbywają się lokalnie ( na naszym dysku , pomiędzy katalogiem roboczym projektu a lokalnym repozytorium = podkatalogiem katalogu roboczego)

Wrzucanie pojedynczego nowego pliku[edytuj]

Załóżmy, że stworzyliśmy nowy plik tekst.txt i chcemy go wrzucić do repozytorium. Tutaj też najpierw trzeba go wrzucić do poczekalni

git add tekst.txt

Dopiero potem wysyłamy plik do repozytorium.

git commit -m 'pierwszy plik'

Wrzucanie zmienionego pojedynczego pliku[edytuj]

Nasz plik tekst.txt już jest w repozytorium, ale zrobiliśmy zmiany, które chcemy zapisać w repozytorium. W tym przypadku możemy pominąć poczekalnię

git commit tekst.txt -m 'drobna zmiana'

Wrzucanie tylko zmienionych plików bez plików nie śledzonych[edytuj]

Załóżmy, że zmieniliśmy wiele plików, ale w naszym katalogu projekt1 są pliki, których nie chcemy w repozytorium jeszcze. Komenda git add . tu nam nie pomoże. Ale jest inna, która doda tylko pliki już śledzone przez git.

git add -A

Wrzucanie dwóch z wielu zmienionych plików[edytuj]

Znowu zmieniliśmy tekst.txt, ale także tekst2.txt oraz tekst3.txt. Chcemy jednak wysłać do zmiany dotyczące tekst.txt oraz tekst2.txt.

git commit tekst.txt tekst2.txt

Niejasności związane z git add[edytuj]

Uruchamiamy git add tekst.txt i cały plik tekst.txt jest wrzucany do indeksu. Razem z zawartością. Jeśli teraz wprowadzimy jakieś poprawki do tekst.txt i nie zrobimy znowu git add tekst.txt, to git commit tekst.txt wyśle do repozytorium starszą wersję znajdującą się w indeksie.

Dlatego git add używamy tylko w trzech wariantach:

git add .
git add nowy_plik
git add nowy_plik nowy_plik2 itd.

Dalsze operacje (do uprządkowania)[edytuj]

Wycofanie nie zapisanych zmian (dwa polecenia)

git checkout file-to-revert
git reset HEAD <file>

Cofnięcie wszystkich lokalnych zmian

git checkout -f

Cofanie zmian (do uprządkowania)[edytuj]

Poniższe polecenia działają na plikach już śledzonych. Jeśli chcemy usunąć także pliki nie śledzone, trzeba to zrobić ręcznie. Można najpierw usunąć wszystkie pliki poleceniem

rm -Rf *

To nie usunie katalogów o nazwach zaczynających się na kropkę czyli repozytorium .git.

git reset HEAD^         # nie ruszaj plików roboczych - pozostaw zmiany
git reset --hard HEAD^  # zresetuj również pliki robocze
git reset --hard HEAD~5 # cofnij się o 5 zapisów
git reset --hard origin # wyczyść wszystkie zmiany i zacznij od nowa
git-checkout -- nazwa_pliku # Przywróć ostatnią wersję pliku z repozytorium dla aktualnej gałęzi
git-checkout revision nazwa_pliku # Przywróć plik w wersji revision

Uwaga!

git-checkout revision #utworzy nam oderwaną gałąź, co nie koniecznie jest oczekiwane


git reset --hard revision # uaktualni HEAD i aktualną gałąź do
punktu określonego przez revision, i uaktualni drzewo robocze
aby odzwierciedlało nowy index.

Jeśli git reset --hard HEAD^ nie zadziała to trzeba trzeba inaczej

git reflog

wyświetli nam się lista operacji i znajdujemy numer tej operacji, do której chcemy wrócić.[3]

git reset --hard HEAD@{1}

Inne[edytuj]

Unable to write new index file, czyli brak miejsca na dysku[edytuj]

OPis [4]

Nie można ponowić czynności clone[edytuj]

Opis[5]

Odnośniki[edytuj]

  1. Setup git from github
  2. Rip's Domain : Git: push rejected non-fast forward
  3. Guide
  4. | Brak miejsca na dysku
  5. można ponowić czynności clone