University day 2

48
Who am I ? Name : Sławek Borowiec Solution Architect & java frameworks trainer Since 2005 – until now @przodownikR1 Blog: http://przewidywalna-java.blogspot.com Hobby : Sport bikes & boxing & software engineering

Transcript of University day 2

Who am I ?

Name : Sławek Borowiec

Solution Architect & java frameworks trainer

Since 2005 – until now

@przodownikR1

Blog: http://przewidywalna-java.blogspot.com

Hobby : Sport bikes & boxing & software engineering

Week 2 : next stage : IDE + GIT

- jak skutecznie wykorzystać swoje IDE → czyli Twoje IDE.

- IDE, a narzędzia refaktoryzacyjne, szablony, optymalne ustawienia, automatyzacja.

- jak dobrać optymalny system kontroli wersji dla potrzeb projektu

- instalacja, konfiguracja i praca z Git

- ciągłe odnośniki oraz przypomnienie materiału z poprzedniego tygodnia.

- jak zapewnić sobie bezpieczną i komfortową pracę na starcie wytwarzania, jak dotrwać do jego końca i na dodatek zachować zdrowie :)

Twoje IDE – maksymalne wykorzystanie przez dewelopera

podpowiedzi (warnings,składnia,wydajność)

auto-uzupełnianie

skróty

pluginy

optymalizacja działania (uzyskiwanie pożądanej wydajności)

generacja kodu

testowanie

łatwa integracja z systemami kontroli wersji

debugowanie

refaktoring

Eclipse

Tuning VM → eclipse.ini | sts.ini

Odpowiednie kodowanie

Automatyczny zapis przed budowaniem

Filtrowanie typów (Type Filters)

Minimalizacja importów (Organize imports on save)

Aktualizacja do najnowszej javy i wersji IDE

Odchudzanie : startup & validation

Wyłącznie sprawdzania pisowni

Zamykanie niepotrzebnych projektów

Wyłączenie auto-walidacji i auto-budowania projektu

Wyłączenie niepotrzebnych deklaracji etykiet (SVN/CVS)

Codzienność ?? :)

Git – content tracking system – Git robi różnicę....

Nadzorowanie treści a nie plików

Wydajność

Solidność

Rozproszenie

Możliwość efektywnego zarządzania wielkimi projektami jak jądro Linuxa (szybkość i wolumen)

Lokalność (praca jest możliwa nawet przy braku dostępu do sieci)

Spójność (SHA-1)

Protokoły :

local (wygoda, zapis i odczyt)

local : → git clone {filepath} | git clone {file:///home/przodownik/..}

Secure Shell (SSH) (bezpieczeństwo,uwieżytelnienie, szyfrowanie, wygoda, zapis i odczyt, dostępny port, brak anonimowego dostępu)

ssh : → git clone ssh://user@server/myProject.git (pozwala odczyt jak i zapis)

Git (szybkość, brak uwieżytelnienia)

HTTP (prostota,standard,HTTPS – szyfrowanie,otwarty na firewalls, ~szybkość)

Serwery : GitHub , BitBucket

System kontroli wersji source: http://programmers.stackexchange.com/questions/136079/are-there-any-statistics-that-show-the-popularity-of-git-versus-svn

Śledzenie zmian w kodzie

~Praca grupowa

Przechowujemy :

source code, properties, tests, niektóre binaria

Nie przechowujemy :

classes, plików tymczasowych, plików ide, plików zbędnych do odpalenia projektu itd..

git vs svn, a rynek pracy

Localne source : http://git-scm.com/book/en/v2/Getting-Started-About-Version-Control

Lokalne – łatwo pomylić katalogi i zmodyfikować niewłaściwą wersją lub pojedynczy plik. Podejście bardzo prymitywne i mało odporne na błędy,właściwie brak możliwości pracy grupowej.

Scentralizowane (svn, cvs, etc)

source : http://git-scm.com/book/en/v2/Getting-Started-About-Version-Control

Scentralizowane – rozwiązuje problem pracy grupowej, możliwość utraty danych,

w przypadku awarii serwera centralnego.

Rozproszone source : http://git-scm.com/book/en/v2/Getting-Started-About-Version-Control

Rozproszone – kopiowane jest lokalnie całe repozytorium. Możliwość swobodnego przełączania między zdalnymi repozytoriami. Łatwe odzyskiwanie danych po awarii. Szybkość pracy, komitujemy na lokalne repozytorium, a zmiany możemy wypchnąć na zdalne w dowolnym momencie, np. po skończeniu jakieś funkcjonalności

Source :techidiocy.com

Source : www.vitaliypodoba.com

Instalacja i narzędzia

sudo apt-get install gedit-plugins → gedit plugins

gitk

eGit

meld

find

wc

powłoka : fish

git –version

find . -name .git -type d -exec rm -fr {} /:

cherry-pick

Konfiguracjagit config {klucz} {wartość} -> odczyt i modyfikacja zmiennych, które opisują wszystkie funkcjonalności i zachowania git.

Plik : /etc/gitconfig: Widoczny dla wszystkich userów w systemie w odniesieniu do wszystkich lokalnych repozytoriów.

git config –system

Plik : ~/.gitconfig: Widoczny dla konkretnego użytkownika

git config –global

Plik : .git/config w aktualnym repo → odnosi się tylko do niego.

Każdy poziom ma priorytet wyższy niż poziom poprzedni !!

git config --global user.name "Sławomir Borowiec"

git config --global user.email '[email protected]'

git config --global core.editor vim

git config --global merge.tool meld

git config –list

git help <polecenie>

Tworzenie synonimów

git config –global alias.logp 'log –graph –abbrev-commit –pretty=oneline'

git.igonore

Ignorowanie plików z przestrzeni roboczej

Korzystanie ze wzorców

nazwa katalogu (/)

nazwa pliku dopasowany literalnie do wzorca

! → negacja dalsze części wzorca

..etc

Gwiazdka (*) dopasowuje zero lub więcej znaków;

[abc] dopasowuje dowolny znak znajdujący się wewnątrz nawiasu kwadratowego (w tym przypadku a, b lub c);

znak zapytania (?) dopasowuje pojedynczy znak;

nawias kwadratowy zawierający znaki rozdzielone myślnikiem ([0-9]) dopasowuje dowolny znajdujący się pomiędzy nimi znak (w tym przypadku od 0 do 9).source : http://git-scm.com/book/pl/v1/Podstawy-Gita-Rejestrowanie-zmian-w-repozytorium

Pojęcia

origin – nazwa zdalnego głównego repo

head – wskazuje nasze bieżące miejsce w branch'u

master – nazwa głównego branch'a

repozytorium (archiwum) (repository) – historia zmian (repo) (object store + index) (.git)

obszar roboczy – zbiór plików na których pracujemy

commit – zbiór zmian , które mają być utrwalone → zapisanie zmian w repozytorium

branch – gałąź głównego korzenia mająca na celu np. tworzenie nowej funkcjonalności

tag – traktuj to jako zakładkę poszczególnych rewizji (commit'ów)

index (stage) - zawiera informacje o tym, czego dotyczyć będzie następna operacja commit. (.git)

pull request: - żądanie połączenia Twoich zmian z innym branch'em lub repozytorium

check out - aktualizacja Twojego obszaru roboczego z daną gałęzią , rewizja czy zakładką

merge – połączenie odrębnych gałęzi w jedną całość.

push - wysłanie zmian na zdalne repozytorium

pull- pobranie zmian ze zdalnego repozytorium

Git Tworzenie repo

git init – tworzenie nowego → .git

git clone – kopiowanie istniejącego

git clone {url} {new_clone_repo_name}

Surowe – synchronizacja projektów, tylko folder .git bez obszaru roboczego oraz indeksu. Są to repozytoria przeznaczone do udostępniania w sieci → git push, git pull (brak bezpośredniego miejsca na jakiekolwiek zmiany)

git init --bare → git init –bare {path}

git clone --bare

Github Quick setup

https://github.com/przodownikR1/testr2.git

echo "# testr2" >> README.md

git init

git add README.md

git commit -m "first commit"

git remote add origin https://github.com/przodownikR1/testr2.git

git push -u origin master

…or push an existing repository from the command line

git remote add origin https://github.com/przodownikR1/testr2.git

git push -u origin master

Git init, add, commit, status

git add – zmiana stanu pliku z nienadzorowanego na nadzorowany

git add . == git add -A

git commit -a -m '' - uwzględnij dodane już pliki podczas dodawania do repo (git add . | git commit)

git status == git ls-files -s

git commit –ammend {filename} – wymuszenie dodania pliku do rewizji

Git rm

git rm odwrotność git add

git rm –cached {filename} – usuwa plik z indeksu ale pozostawia do w przestrzeni roboczej

git rm {filename} – usuwa plik z indeksu i przestrzeni roboczej

git rm -f {filename} – usunięcie bez względu na inne czynniki

Git mv

mv fileOne fileTwo

git rm fileOne + git add fileTwo

==

git mv fileOne fileTwo

Git mv

mv fileOne fileTwo

git rm fileOne + git add fileTwo

==

git mv fileOne fileTwo

File status lifecycle

Stany pliku

Zatwierdzony - oznacza, że dane zostały bezpiecznie zachowane w Twojej lokalnej bazie danych.

Zmodyfikowany - oznacza, że plik został zmieniony, ale zmiany nie zostały wprowadzone do bazy danych.

Śledzony, nadzorowany (tracked)- oznacza, że zmodyfikowany plik został przeznaczony do zatwierdzenia w bieżącej postaci w następnej operacji commit. (git add {someFile})

Plik aktualny (unmodified file) – możliwy jest do zawsze możliwy do odzyskania (checkout) (obecny w repo git add + git commit). Nie można go zaindeksować.

Plik zmodyfikowany (modified file) – to plik posiadający różnice pomiędzy wersją w repo , a obszarem roboczym

Plik nieśledzony, nienadzorowany (untrucked file) – to nowo utworzony plik w obszarze roboczym nie będący częścią żadnej rewizji (repo czy indeksie)

Plik zaindeksowany (staged file) – objęty operacją commit

Plik niezaindeksowany (unstaged file) – zmodyfikowany plik, który nie został zaindeksowany (nie występujący w bazie index)

Plik pomijany (ignored file) – niewidoczny dla archiwum (.gitignore)

Source : http://tex.stackexchange.com/questions/70320/workflow-diagram

Git branch

Pozwala na pracę rozwojową prowadzoną w jakimś konkretnym celu np. dodaniu nowej funkcjonalności lub poprawie błędów

Branch = zadanie !!

git branch {branch_name} – tworzenie

git branch – lista lokalnych branch'y (-v | -r | -a )

git branch -d {branch_name} – skasowanie branch'a

git show-branch – bardziej dokładny niż git branch (chronologicznie)

git checkout -b {branch_name}

git branch –merged –no-merged -wyświetlenia gałęzi, które już zostały lub jeszcze nie zostały scalone do aktywnej gałęzi

Git : reset, checkout

Przywracanie obszaru roboczego do stanu z wybranej rewizji

git reset –hard {rev} – późniejsze rewizje są usuwane z historii !

git checkout -f {rev} – repo znajduje się w stanie detached

git checkout -f {rev} {filename} – odzyskanie pliku z danej rewizji

git chechout – {filename} - cofanie zmian w zmodyfikowanym pliku

Logs

git log -p -5 → pokazuje różnice wprowadzone z każdą rewizją

Opcje :

- short

- full

- fuller

git log --pretty=oneline

git log --pretty=format:"%h - %an, %ar : %s"

Opis :

%h Skrócona suma kontrolna zmiany

%an Nazwisko autora

%ae Adres e-mail autora

%ad Data autora

%ar Względna data autora

%cn Nazwisko zatwierdzającego zmiany

%ce Adres e-mail zatwierdzającego zmiany

%cd Data zatwierdzającego zmiany

%cr Data zatwierdzającego zmiany, względna

%s Temat

Przykład : logs

przodownik~/w/spring-boot (master| )$ git log --pretty=format:"%h - %an, %ar : %s" --author Rob ✔15:51

● 7ecbbc1 - Rob Winch, 7 weeks ago : Merge branch '1.2.x'● 493d7a3 - Rob Winch, 7 weeks ago : Merge branch '1.1.x' into 1.2.x● 760d6ec - Rob Winch, 7 weeks ago : Fix Unnecessarily Adding Default Security User● f9816ea - Rob Winch, 2 months ago : Fix configureGlobal on SpringBootApplication● e42fa79 - Rob Winch, 2 months ago : Fix fragile AuthenticationManagerConfiguration● adb2205 - Rob Winch, 11 months ago : Make SpringBootPlugin more Groovy● 52382f9 - Rob Winch, 11 months ago : Default Compile tasks to use UTF-8 encoding● ae7098a - Rob Winch, 1 year, 1 month ago : Add RepositoryRestMvcAutoConfiguration● f852096 - Rob Winch, 1 year, 1 month ago : Security Documentation Cleanup● 6b0eba3 - Rob Winch, 1 year, 2 months ago : Update to Spring Security 3.2.1● 6c5701b - Rob Winch, 1 year, 3 months ago : Use @Autowired AuthenticationManagerBuilder● 77b5ad1 - Rob Winch, 1 year, 6 months ago : Update to Spring Security Snapshot● f40758c - Rob Winch, 1 year, 8 months ago : Update README link text to be M1● 3662a8b - Rob Winch, 1 year, 9 months ago : Fix README Quick Start Java Example

Przykład : logs

--since 'yyyy-mm-dd' '| --until | --author | -n

--abbrev-commit - skrócenie SHA

--abbrev=4 - skrócenie SHA

przodownik ~/w/spring-boot (master| )$ find . -type f -print | grep -v '/\.git/' | wc ✔-l

=> 2472

przodownik ~/w/spring-boot (master| )$ git log --pretty=oneline --author Rob | ✔wc -l

=> 14

przodownik ~/w/spring-boot (master| )$ git log --pretty=oneline | wc -l ✔

=> 4425

git log --since=2.weeks

Tags

opisane (annotated tags)

- dane o autorze

- datę utworzenia

- komentarz

- SHA rewizji

lekkie (lightweight tags) → (.git/refs/tags)

- tylko SHA rewizji

Git push nie przesyła etykiet do zdalnego repozytorium !

git push origin [tag_name]

Tags

git tag -a {nazwa} -m {komentarz} → (opisowy)

Znacznik musi być unikalny

git tag {nazwa} → (lekki)

git tag -d {nazwa} – usuwanie znacznika

git tag – listuje znaczniki

git log --tags --simplify-by-decoration

--pretty="format :%ai %d %an %s" | sort

git describe – lista dostępnych znaczników opisanych

git show -s {tagName} – wyświetlenie szczegółów

Kompresja

git archive --format=zip --output={fileName} SHA

Wygenerowanie skompresowanego archiwum odpowiadającego danej rewizji. Zamiast rewizji SHA można użyć znaczników.

Git stash

Traktuj stash jako schowek czy skrytkę.

git stash list

git stash – dodanie do skrytki

git stash pop – z usunięciem ze stosu

git stash apply – bez usunięcia ze stosu

git stash drop – usunięcie ze skrytki

Git remote

Sprawdzanie zdalnych repozytoriów i tworzenie połączenia z nimi.

git remote | remote -v

git remote add origin {url}

git remote origin

remote show [remote_repo]

git remote rename {old_name} {new_name}

git push [remote_repo] :[branch] – usuwanie zdalnej gałęzi

git push origin –delete [remote_branch] – odpowiednik powyższego

Git push

Wypychanie zmian do zdalnego repozytorium

git push -u origin masterprzodownik ~/b/university_training (step13_templates| )$ git branch step14_git ✔

przodownik ~/b/university_training (step13_templates| )$ git checkout step14_git ✔ Switched to branch 'step14_git'

przodownik ~/b/university_training (step14_git| )$ ✔ git push origin step14_git

Total 0 (delta 0), reused 0 (delta 0)

To https://github.com/przodownikR1/university_training.git

* [new branch] step14_git -> step14_git

przodownik ~/b/university_training (step14_git| )$✔

Git pull, fetch

Pobiera zmian ze zdalnego repo

git pull {repo_name} {branch_name}

git fetch {repo_name} – pobiera zmiany ze zdalnego brancha

Git merge

git merge {branchName} – przeniesienie zmian z gałęzi branchName do bieżącej

przodownik /t/gitRepo (master| )$ ✔ git merge hotfix Updating 5c8bc03..cde1827Fast-forward 1.java | 1 + hot.java | 1 + main.java | 1 + 3 files changed, 3 insertions(+) create mode 100644 1.java create mode 100644 hot.javaprzodownik /t/gitRepo (master| )$ ✔ git prettyAll * cde1827 (HEAD, master, hotfix) a hotfix| * c4452d1 (feature) a added| * 3ca2549 a feature|/ * 5c8bc03 aprzodownik /t/gitRepo (master| )$✔ git branch -d hotfix Deleted branch hotfix (was cde1827).przodownik /t/gitRepo (master| )$ ✔ git prettyAll in 0.1 seconds automatically...* cde1827 (HEAD, master) a hotfix| * c4452d1 (feature) a added| * 3ca2549 a feature|/ * 5c8bc03 a

Merge example - continue

przodownik /t/gitRepo (feature| )$ ✔ git merge master

Auto-merging main.java

CONFLICT (content): Merge conflict in main.javaAuto-merging 1.java

CONFLICT (add/add): Merge conflict in 1.java

Automatic merge failed; fix conflicts and then commit the result

przodownik /t/gitRepo (feature|MERGING|●2 1 3)$ ✖ ✚ git status

On branch feature

You have unmerged paths.

(fix conflicts and run "git commit")

Changes to be committed:new file: hot.java

Unmerged paths:

(use "git add <file>..." to mark resolution)

both added: 1.java

both modified: main.java

przodownik /t/gitRepo (feature|MERGING|●2 1 3)$ ✖ ✚ git commit -a

[feature 7e57cf1] Merge branch 'master' into feature

przodownik /t/gitRepo (feature| )$ git status ✔

On branch feature

nothing to commit, working directory clean

Merge → conflicts

<<<<<HEAD - aktualna gałąź w której obecnie się znajdujesz.

<<<<<< ======= >>>>>> - usuwamy

git add .

git commit ..

git mergetool – narzędzie do ułatwniania operacji scalania.

Git rebase

Integrowanie zmian z jednej gałęzi do drugiej jest możliwe dzięki operacji :

- merge -scalanie

- rebase – zmiana bazy

Nie zmieniaj bazy rewizji, które wypchnąłeś już do publicznego repozytorium !!

git rebase -i {rev} - łączenie rewizji

git rebase -i rev_12

git rebase -i HEAD~3

pick (p) → dana rewizja zostanie zapisana w historii po zakończeniu operacji

reword (r) → pick + opis

edit (e) → pick + edycja zmian w rewizji

squash (s) → łączy podaną rewizję z poprzednią

fixup (f) → squash bez modyfikacji komentarza

exec (x) → wiersz polece

Merge/Rebase source: http://git-scm.com/book/pl/v1/Ga%C5%82%C4%99zie-Gita-Zmiana-bazy

-merge

Git revert

git revert –no-edit {rev} – usunięcie zmian wprowadzonych przez daną rewizje.

--no-edit = domyślny komentarz 'Revert …'

Git diff

Porównujemy pliki, rewizje i całe branch'e

git diff –cached – co z indeksu trafi do repozytorium

git difftool –cached – to co wyżej ale z użyciem narzędzia do wskazywania różnić np. meld.

git diff – zmiany spoza poczekalni

git diff {branch} {rev} {conrete_file} – pokazuje różnice względem branch'a, rewizji, pliku lub pakietu

git diff –stat - statystyki

Git apply - łaty

git apply /home/przodownik/main.java.patch – wczytywanie łaty

(współpracuje z git diff, zasada : 'zaakceptuj lub odrzuć wszystko')

Koniec :)

Dziękuje za uwagę :)