Wprowadzenie do GIT
Tak to się kiedyś robiło ;)
Polecamy korzystanie z systemu kontroli wersji nie tylko do programowania
git config --global core.editor vim
git config --global core.editor xed
git config --global core.editor gedit
git config --global core.editor notepad
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar
-nosession -noPlugin"
git config --global core.editor "'C:\Program Files\Microsoft VS Code\code.exe' -n -w"
--system
(brany pod uwagę na końcu)
/etc/gitconfig
%ProgramFiles(x86)%\Git\etc\gitconfig
%ProgramFiles%\Git\mingw64\etc\gitconfig
--global
(brany pod uwagę w drugiej kolejności)
~/.gitconfig
%USERPROFILE%\.gitconfig
--local
(brany pod uwagę w pierwszej kolejności)
.git/config
git config --POZIOM SEKCJA.NAZWA "TREŚĆ"
git config --global user.name "John Doe"
git config --POZIOM --edit
git config --global -e
Domyślny poziom przy zapisywaniu to local
git config (--POZIOM) --edit
git config --global -e
git config (--POZIOM) SEKCJA.NAZWA
git config --get user.email
git config (--POZIOM) --list
git config --list
Bez podania poziomu, git przyjmuje obecnie brany pod uwagę poziom
Suma kontrolna każdego commita opiera się na
Analogicznie wiarygodne są przelewy w bitcoin
cwiczenia/#simple-flow
Tworzenie commitów z konsoli
Twoje pliki - absolutnie każdy plik który utworzysz/edytujesz/usuniesz,
zawsze jest w którymś z 3 "obszarów" gita
Obszar roboczy (working directory) to obszar w którym jest praca którą wykonałeś, ale o której jeszcze nie powiedziałeś nic gitowi
Git nie wie nic o Twojej pracy w working directory, uważaj żeby jej nie stracić dopóki mu o niej nie powiesz
Zmiany w working directory odnoszą się do staging area, a jeśli danego pliku nie ma w staging area, wówczas bezpośrednio do obecnej wersji w lokalnym repozytorium
Po zastagowaniu zmiany, czyli przygotowaniu jej do commita, dalej można plik edytować, wówczas zmiany w working directory pokazywane są względem zastagowanej wersji
Co więcej, od razu można wybrać żeby zastagować tylko część zmian Dla przykładu na dole pliku zaczęliśmy dopisywać nowy kod, a w środku pliku zobaczyliśmy literówkę w tekście. Wówczas można od razu nieprzerywając pracy na dole pliku, zastagować jedynie poprawienie literówki i dodać commita "Fix typo in module A".
git revert
np:
cwiczenia/#reset-revert-commit-ammend
Pytania?
Przenosimy linie tekstu w edytorze
Zmieniamy komendy z początków linii w edytorze
Zawsze wnikliwie czytamy podpowiedzi gita, piszemy git status
gdy znikną
Commity między branchami można przekładać
pokazanie jak zmiana brancha wpływa na zawartość katalogów (git checkout)
stosowanie cherry-pick w praktyce
... ale w niektórych sytuacjach trzeba uważać.
Czasami łatwiej przerwać rebasowanie i jeżeli flow projektu na to pozwala, jednak zrobić zwykłego merge.
(głównie przy starych, mocno rozjechanych branchach)
Tak wygląda powstały konflikt w kodzie
Synchronizacja repozytoriów (np. lokalnego z wersją na GitHubie) odbywa się za pomocą 'wypychania' i 'ciągnięcia' commitów
git pull --rebase
git config --global --bool pull.rebase true
git push --force
Ale jak już wymuszasz, to zawsze z zabezpieczeniem
git push --force-with-lease
git log
gitk
Git log oraz gitk domyślnie pokazują historię od obecnego momentu - HEAD
, ale możliwe jest wskazanie dowolnego
momentu w historii, np. nazwy brancha, SHA commita lub odniesienia SHA^ lub SHA~N
np. HEAD^, master~5
git log -4
git log --oneline
git log --graph
git log --decorate
git log --stat
git log --patch
git log --since=X
, git log --after=X
, git log --before=X
git log X --not Y
, git log Y..X
, git log X...Y
git log --author="xyz"
git log --grep="xyz" -i
git log --no-merges
git log --all
git log --pretty="FORMAT"
git log -S"text" -i
Wyjście ze strumienia logów - klawisz q
cd ~/Desktop/cwiczenia
log-demo
:git clone https://gitlab.com/terrakok/gitlab-client log-demo
cd log-demo
git reset --hard 7ad14
gitk --author=gulya -1
git log --author=gulya -1
Odpowiedź:
Upgrade Markwon to version 2.0.0. Replace ImageSizeResolver workaround with upstream one.
Pytania?
gitk --all --grep="Update Stub" -i -1
git log --all --grep="Update Stub" -i -1
Odpowiedź:
terrakok
Pytania?
versionCode 10
)
git log -S "versionCode 10" -i -p
Odpowiedź:
terrakok, w commicie
6d289b10a07bb13d75a7b9767b9b0ae52b0421ce
Pytania?
b9272a3be3d4f9182e6893a0f9a2f7b9ff0b6923
gitk b927 -1
git log b927 -1 --stat
.../model/repository/session/SessionRepository.kt | 9 +++++++++
.../terrakok/gitlabclient/presentation/auth/AuthPresenter.kt | 12 ++++++------
0e02008383a59f6ab56a14df4688070aab925765
gitk 0e020 -1
git log 0e020 -1 --patch
git show 0e020
Odpowiedź:
Linie dodane do pliku PrivacyPolicyFragment.kt
:
override val parentScopeName = DI.APP_SCOPE
pusta
Toothpick.inject(this, scope)
Linia usunięta z pliku PrivacyPolicyFragment.kt
:
Toothpick.inject(this,
Toothpick.openScope(DI.APP_SCOPE))
Pytania?
gitk --after="2018-12-02 00:01" --before="2018-12-02 23:59"
git log --after="2018-12-02 00:01" --before="2018-12-02 23:59" --oneline
6167018 Merge branch 'task/upgrade-markwon-and-remove-image-loading-crutch' into 'develop'
fdb2e6c Merge branch 'project_milestone_tab' into 'develop'
158bba8 Delete unused "todo".
6d45888 Add account id for fixing same userId for difference servers.
0e02008 Fix scope for PrivacyPolicyFragment.
c46c806 Merge branch 'feture/multi_account' into develop
45c0836 Delete code style from git history.
5752be0 Add scopes to each fragment for more powerful memory management.
gitk develop --not origin/develop
gitk origin/develop..develop
git log develop --not origin/develop
git log origin/develop..develop
Odpowiedź:
Nie ma takich
Pytania?
git ls-tree -r 0e020 --name-only
Ścieżki do plików/katalogów które chcemy ignorować dla repozytorium, trzymamy w pliku .gitignore
Plik ten wersjonujemy w repozytorium
*.orig
**/[Pp]ackages/*
bin/
!src/Todo.csproj.user
- wykluczenie od reguły (zaczyna się od wykrzyknika)Jest to scenariusz na który każdy prędzej czy później się natknie
Powód jest prosty - plik już jest w repozytorium,
.gitignore ignoruje tylko nie śledzone pliki
Wystarczy plik... usunąć z repozytorium
git rm file1.txt
git commit -m "remove file1.txt"
git rm --cached file1.txt
git commit -m "remove file1.txt"
https://chris.beams.io/posts/git-commit/
git stash
git stash --include-untracked
git stash list
git stash apply (optional: name)
git stash pop (optional: name)
git stash drop (optional: name)
Uwaga
Łatwo zapomnieć o nieśledzonych plikach
możesz zmieniać istniejące snapshoty (commity)
ALE!
wiedząc, że jakoś trzeba się z innymi zsynchronizować :)
W przeciwieństwie do niektórych VCS,
git nie śledzi plików, wyłącznie ich zawartość
Lekkie(lightweight) - tylko wskaźnik z nazwą
git tag v1.4
Opisane(annotated) - posiadają opis, sumę kontrolną, autora, datę itd.
git tag -a v1.4 -m 'my version 1.4'
Fetch pobiera wszystkie tagi z serwera, ale domyślnie tagi się nie wypushowują
Dwa sposoby pushowania tagów
git push origin tag_name
git push --tags
Modyfikacje aliasów można wykonywać w gitconfigu
[alias]
st = status
ci = commit -v
Albo za pomocą polecenia
git config --global alias.st status
git config --global alias.ci 'commit -v'
Przykład użycia - skrócone wypisywanie statusu
git st
wdiff = diff --word-diff=plain
rh1 = reset HEAD^ --hard
amend = commit --amend -aC HEAD
standup = log --since '1 day ago' --oneline --author krzysztof.morcinek@gmail.com # hack it
with your email
cam = commit -am
jira = log --since '6am' --oneline --author krzysztof.morcinek@gmail.com # hack it with your
email
ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cgreen\\ [%cn]" --decorate
mt = mergetool
git remote add anotherOrigin https...
git remote -v
git push anotherOrigin
git fetch anotherOrigin
git push -u anotherOrigin your_branch
cache
git config --global credential.helper 'cache --timeout=300'
store
git config --global credential.helper store
sudo apt-get install libsecret-1-0 libsecret-1-dev
cd /usr/share/doc/git/contrib/credential/libsecret
sudo make
git config --global credential.helper
/usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
Instalator: github.com/Microsoft/Git-Credential-Manager-for-Windows/releases
Lub checkbox w trakcie instalacji gita:
Powinno ustawić: git config --global credential.helper manager
albo ścieżkę do exe
Commity i tagi można podpisywać kryptograficznie, jednak wymaganie tego w workflow jest kłopotliwe
$ git log --show-signature
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun 4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) <schacon@gmail.com>"
Author: Scott Chacon <schacon@gmail.com>
Date: Wed Jun 4 19:49:17 2014 -0700
Add new function