University day 2
-
Upload
slawomir-borowiec -
Category
Technology
-
view
422 -
download
0
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)
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..
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
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>
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
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)
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
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')