Git/Przypadki

Z Wikibooks, biblioteki wolnych podręczników.
< Git
Skocz do: nawigacja, szukaj
Schemat działań Gita


Szybki start (do uporządkowania)[edytuj]

Wymagania[edytuj]

Zakładamy, że

  • zainstalowano program git
  • zainstalowano SSH[1] i ustalono ustawienia
  • utworzeno nowy lub skopiowano istniejący projekt

Schemat pracy z projektem[edytuj]

Schemat zależy od sytuacji projektu

Proponowany podstawowy schemat pracy : [2]

  • wprowadzenie zmian w pliku lub plikach
  • sprawdzamy jakie pliki zostały zmienione : git status
  • sprawdzamy co zostało zmienione w pliku : git diff [file]
  • zatwierdzamy zmianę : git commit -a -m [message] [3]


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



Zaawansowane możliwości :

  • gałęzie ( dodawanie, scalanie i usuwanie, konflikty)
  • zdalne repozytoria[4]
  • zbiorowa praca nad projektem

Podstawowa obsługa Gita[edytuj]

  • Większość operacji wykonuje się przez "git polecenie".
  • 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.
  • git nie dodaje pustych katalogów do repozytorium. To wynika z koncepcji, że git śledzi zawartość plików a nie pliki.

Pomoc[edytuj]

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


Obsługa git w edytorze vim

Przypadki użycia[edytuj]

Projekt[edytuj]

Mamy dwie możliwości


git init # tworzenie nowego repozytorium w istniejącym projekcie lub nowo utworzonym projekcie 
git clone /path/to/repository # kopiowanie z dysku lokalnego
git clone username@host:/path/to/repository # kopiowanie ze zdalnego serwera ( from origin to local )

Pliki[edytuj]

Zmiany lokalne :

git add *
git commit -m "Commit message"

Przesyłanie zmian na serwer :

git remote add origin <server>  # jeśli nie mamy ustwaionego zdalnego repo[5]
git push origin master # jeśli mamy ustawione zdalne repo


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.


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 : [6]

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 !

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

Drzewo i jego gałęzie[edytuj]

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

git branch # Wszystkie gałęzie można wylistować poleceniem : 
git checkout -b feature_x # tworzy gałąź feature_x i przełącza na nią 
git branch -d feature_x # usuwa gałąź feature_x 
git checkout master # przełączamy do gałęzi master
git push origin feature_x # wysyła na zdalny serwer gałąź feature_x 


Graficzne drzewo[edytuj]

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

Usuwanie gałęzi ze zdalnego repo[edytuj]

git push origin :<branch_name>


zaawansowane[edytuj]

zaawansowane

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ć.[7]

git reset --hard HEAD@{1}


Wycofanie nie zapisanych zmian (dwa polecenia)

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

Cofnięcie wszystkich lokalnych zmian

git checkout -f

Problemy[edytuj]

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

OPis [8]

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

Opis[9]

Odnośniki[edytuj]

  1. Setup git from github
  2. Understanding Git by Charles Duan
  3. How to properly commit to your git repository (rebasing) by Andrew Brown
  4. Praca-ze-zdalnym-repozytorium
  5. gi guide by by Roger Dudler
  6. Rip's Domain : Git: push rejected non-fast forward
  7. Guide
  8. | Brak miejsca na dysku
  9. można ponowić czynności clone