[GIT] Zaawansowane funkcje – cz. 4 – Przydatne Narzędzia

GIT: Przydatne narzędzia

Kontynuujemy serię artykułów o GIT, dzisiaj zajmiemy się przeglądem narzędzi przydatnych podczas korzystania z GITa.

Narzędzia bardzo ułatwiają pracę, a częstokroć pozwalają zapobiec tragedii poprzez zobrazowanie „układu projektu” przed wykonaniem ryzykownej operacji.

Seria Artykułów o GIT – spis treści
  1. GIT HEAD – co to jest? Detached Head. Kiedy można stracić głowę?
  2. GIT fast-forward i Merge Commit. Co to właściwie jest?
  3. Git REBASE i Squash. Tworzymy ładną historię zmian.
  4. Przydatne narzędzia i oprogramowanie do pracy z GIT
  5. Przydatne Materiały o GIT plus BONUS – ściąga z poleceń GIT’a
  6. Podsumowanie.

Wiersz poleceń

Gdy mówimy o GIT to na pierwszym miejscu musi znaleźć się wiersz poleceń, inne podejście byłoby profanacją. 🙂

W tym artykule zakładam, że pracujemy w systemie Windows.
(Osobiście jestem fanem Linuxa i korzystając z VS Code, kontenerów Dockerowych i .NET Core lub .NET 5 z powodzeniem można tworzyć aplikacje w .NET w Linuxie, jednak spodziewam się, że zdecydowana większość programistów .NET działa w Windows’ach.)

Windowsowa linia komend jest dość uboga i toporna, do tego została pozbawiona wielu przydatnych funkcji znanych z Linuxa. Prawdziwy problem zaczyna się gdy działamy zarówno na Linuxie jak i na Windowsie, wtedy dobitnie zaobserwujemy słabości windowsowej linii komend. Na szczęście jest na to kilka rad!

PowerShell

Najbardziej oczywistym zamiennikiem standardowej linii poleceń jest PowerShell. Możemy tworzyć w nim rozbudowane skrypty i realizować skomplikowane zabiegi w systemie operacyjnym – bardzo użyteczna sprawa dla administratorów Windowsowych, jednak dla Linuxowców przesiadka będzie trudna. Plusem jest, że PowerShell wspiera większość podstawowych komend znanych z Linuxowego basha.

Windows Subsystem for Linux

Jeśli działasz na Windows 10 to mam dobrą informację! Microsoft udostępnił możliwość zainstalowania WSL, czyli Windows Subsystem for Linux.

WSL zapewnia użytkownikowi możliwość korzystania z narzędzi, a nawet programów Linuxowych w systemie Windows, występuje w dwóch wersjach:

WSL w wersji 1 korzysta z warstwy pośredniej, użytkownik ma możliwość uruchamiania programów Linuxowych, jednak technicznie wywołania systemowe Linux’a są tłumaczone na wywołania Windowsowe i realizowane jako polecenia Windows. Mamy tutaj tzw. „translację wywołań„. Twórcy Windowsa dostarczają dedykowany kernel Linuxowy, który jest odpowiedzialny za translację, Kernel jest utrzymywany i rozwijany przez Microsoft. Jak można się domyślić rozwiązanie takie choć pomysłowe, nie jest wydajne, gdyż każda komenda Linuxowa musi zostać przetłumaczona, a następnie wywołana jako komenda Windows, zwiększa to ilość operacji realizowanych przez procesor oraz ilość operacji I/O, odczujemy to szczególnie dotkliwie jeśli spróbujemy uruchomić na WSL 1 bazę danych, cache czy inne oprogramowanie intensywnie korzystające z I/O.
WSL 1 nie obsługuje także wszystkich programów, ze względu na niedoskonałość warstwy tłumaczącej niektórych komend – technicznie – nie dało się przetłumaczyć lub było to nieopłacalne biorąc pod uwagę koszt obliczeniowy.

Zaletą WSL 1 jest fakt, że Windows rozpoznaje iż dane program należy uruchomić pod kontrolą kernela Linuxowego i uruchamia go tak jak program Windowsowy. Wygodne.

WSL w wersji 2 – wersja druga znacząco różni się od pierwszej, tutaj mamy pełny kernel Linuxowy dostarczony po prostu jako maszyna wirtualna. Kernel jest aktualizowany wraz z aktualizacją Windowsa i opiera się na klasycznym, niemodyfikowanym kernelu Linuxa, wszelkie poprawki wprowadzone do Linuxa otrzymujemy więc „prawie od ręki”, bez konieczności oczekiwania na aktualizację warstwy tłumaczącej.
Mamy możliwość pełnego korzystania z systemu Linux bez konieczności wykonywania translacji poleceń. W znaczny sposób podnosi to wydajność działania i pozwala na uruchomienie praktycznie każdej aplikacji.
Wadą jest, że działamy na maszynie wirtualnej, co prawda dobrze zintegrowanej z Windowsem, ale jednak to autonomiczny byt.

Gdzie znajduje się ta maszyna wirtualna?
Nie znajdziemy jej w konsoli Hyper-V, jest wbudowana wewnątrz Windowsa i przygotowana tak aby szybko się uruchamiała i nie używała nadmiernej ilości zasobów, ze względu na te optymalizacje użytkownik nie ma możliwości bezpośredniego zarządzania nią.

Jaką wersję WSL mam w systemie?

Można sprawdzić to poleceniem (w cmd):

wsl --list --verbose

Instalacji WSL dokonujemy z linii komend:

wsl --install

Domyślnie zainstaluje się kernel Debianowy (Ubuntu), mamy możlwość instalacji innego kernela:

wsl --list --online
wsl --install -d DISTRO-NAME
Dostępne dystrybucje Linuxa

Aktywację WSL można wykonać w menadżerze funkcji systemu Windows (Windows => RUN => optionalfeatures)

Windows Features

Po bardziej szczegółowe informacje dot. np. przejścia z WSL1 na WSL2 lub aktualizacji posiadanego kernela odsyłam do Internetu, nie chcę skupiać się na tym we wpisie dot. GITa.

Mam WSL, co dalej?

Czas na instalację Ubuntu pod Windowsem. 🙂 Pobieramy go z Microsoft Store:

Windows Store – Ubuntu i inne subsystemy Linuxowe

Po instalacji, możemy przejść do Ubuntu i (prawie) zapomnieć, że działamy w Windows’ach:

Wiersz poleceń Ubuntu uruchomiony pod kontrolą systemu WIndows

Oczywiście WSL udostępnia więcej możliwości w tym natywne wsparcie dla subsystemu Linuxa, więcej można przeczytać np. tutaj.

Nie ma czegoś prostszego, ja chce tylko lepszą linię komend!

Jasne, istnieje kilka prostszych rozwiązań! Są to emulatory linii komend.

Mintty

Wybór MinTTY podczas instalacji GITa

MinTTY jest emulatorem Linuxowego Terminala, możemy go zainstalować i ustawić jako domyślny terminal dla GITa podczas instalacji GIT dla Windows.

Obecnie rekomenduje instalację następcy klasycznego WinTTY: WslTTY
WslTTY korzysta z WSL jest przez to bardziej wydajny.

MinTTY instalowany wraz z GITem znajdziemy w lokalizacji:

Lokalizacja MinTTY

Cmder

Dochodzimy do narzędzia, które polecam najbardziej – jest nim CMDER.

Cmder jest w pełni przenośnym (nie wymagającym instalacji) emulatorem wiersza poleceń dla systemu Windows. Korzystam z niego od wielu lat i uważam, że to jeden z najlepszych emulatorów.
Oparty jest na ComEmu, ale w przeciwieństwie do niego ma więcej możliwości dostosowania wyglądu i odświeżony interfejs. Kilka jego zalet to:

  • Pełne wsparcie dla GIT – np.: podpowiadanie nazw gałęzi, podpowiadanie składni, oznaczanie aktualnej gałęzi, kolorowanie wyników poleceń GIT’a.
  • Automatyczne podpowiadanie. Cmder uzywa Clink’a do podpowiadania składni.
  • Wbudowane wsparcie dla SSH. Ważnym elementem pracy z GIT jest możliwość skorzystania z SSH, dzięki Cmder mamy wsparcie SSH bezpośrednio w terminalu, bez użycia innych narzędzi. Mamy zintegrowane ssh-keygen i inne narzędzia znany choćby z Putty.
    DevOpsi skorzystają także z możliwości bezpośredniego logowania się do zdalnych Linuxów bezpośrednio z wiersza poleceń, bez potrzeby korzystania z Putty, czy Kitty.
  • Łatwe kopiowanie i wklejanie – jak w Linuxie, za pomocą zaznaczania i kliknięcia prawym klawiszem myszy.
  • Podświetlanie składni. Jeśli przeglądamy czyjeś commity z wiersza poleceń. Cmder automatycznie podświetli składnię bazując na rozszerzeniu danego pliku.
  • Możliwość dostosowania wyglądu. Cmder posiada szeroką gamę ustawień – umożliwiającą łatwą konfigurację wyglądu i zachowania.
  • Możemy otworzyć wiele zakładek i wybrać z jakiego wiersza poleceń chcemy korzystać: cmd, PowerShell, Bash.
Cmder – wybór powłoki
Cmder – panel ustawień

Zaadniczo – polecam zapoznanie się z jego możliwościami i wypróbowanie we własnym zakresie.

Strona projektu: https://cmder.net/

Czekoladowy tip

Autorzy Cmder’a (i ja również!) zachęcają do skorzystania z Chocolatey. Chocolatey to coś w rodzaju menadżera pakietów dla Windows. Umożliwia łatwa instalację programów, a przede wszystkim szybką i hurtową ich aktualizację.

Instalacja Cmder za pomocą Chocolatey jest niezwykle prosta:

choco install cmder

I już! Tak samo możemy instalować wiele innych aplikacji (repozytorium Chocolatey zawiera głównie popularne aplikacje na licencji Freware i różnych rodzajach licencji OpenSource). Mało tego – podczas przesiadania się na nowy komputer możemy wyeksportować zainstalowane oprogramowanie i jednym poleceniem zainstalować na nowym komputerze.

Narzędzia graficzne

Mamy 3 liczące się narzędzia graficzne do pracy z GIT oraz kilka pomniejszych.
Przejrzyjmy je.

Git Extensions

Wg mnie jedno z lepszych narzędzi – głównie dlatego, że jest darmowe, ciągle rozwijane, posiada wszystkie potrzebne funkcje i szeroką społeczność.

Oprócz realizacji wszystkich – nawet najbardziej zaawansowanych funkcji GITa, umożliwia nam także, m.in:

  • Graficzny podgląd historii plików wraz z kolorowaniem zmian
  • Graficzny, wyraźny podgląd układu gałęzi na lokalnym i zdalnym repozytorium – z możliwością precyzyjnego filtrowania
  • Wygodną funkcję commitowania zmian wraz z przeglądem zmian, jakie wprowadzimy do repozytorium (w tym wygodna obsługa stageowania, wycofywania i resetowania zmian)
  • Wygodną obsługę Stasha
  • Rozbudowaną i przejrzystą możliwość pracy na gałęziach wraz z ilustrowanymi opisami zasad działania danego polecenia
  • Możliwość zarządzania zdalnym repozytorium
  • Możliwość graficznego rozwiązywania konfliktów
  • Możliwość modyfikacji historii (wycofywanie commitów, cherry-pick, squashing, edycja ostatniego commitu, itd.)
  • Możliwość zarządzania wewnętrzną bazą danych GITa, w tym: zmianę/poprawkę nazwy użytkownika, odzyskiwanie utraconych obiektów, wymuszenie kompresji bazy danych
  • Wbudowaną funkcję Blame
  • Integracje z GitHubem
  • Integracje z Visual Studio
  • Społeczność utworzyła również sporo przydatnych pluginów, np. do integracji z popularnymi „hostingami” GITa, czy przyjazny moduł go przeglądu statystyk.

Strona domowa: https://gitextensions.github.io/

Główne okno Git Extension
GitExtension – widok historii modyfikacji pliku
Git Extension – opcje dostępne z menu kontekstowego dowolnej gałęzi
Git Extension – widok opcji
Git Extension – widok okna commitu
Git Extension – graficzna prezentacja działania wybranego typu złączenia
GitExtension – graficzna prezentacja działania funkcji Rebase

SourceTree

SourceTree to drugie, bardzo dobre narzędzie do graficznej obsługi GIT’a. Obecnie właścicielem Sourcetree jest firma Atlasian (ta sama, która jest właścicielem Jiry, Confluence, BitBucket’a, Trello i kilku innych znanych produktów). W tym momencie Sourceetree jest darmowy także do użytku komercyjnego.


Zasadniczo posiada wszystkie funkcje, znane z GitExtension i ma nieco odświeżony interfejs, wygląda więc bardziej atrakcyjnie, ma też łatwiejszą logikę obsługi.
Poza tym – funkcjonalnie – nie różni się wiele odd GitExtension.
Z moich obserwacji Sourcetree jest wolniejszy w działaniu od GitExtension i czasami lubi się zawiesić, choć jest zdecydowanie ładniejszy.

Inne zalety SourceTree to:

  • Bardziej czytelna wizualizacja gałęzi
  • Wbudowana obsługa predefiniowanego modelu Git-Flow:
SourceTree – wbudowane GitFlow

Wybór pomiędzy dwoma powyższymi narzędziami zależy od indywidualnych preferencji danego programisty.

Strona domowa: https://www.sourcetreeapp.com/

SourceTree – fragment głównego okna programu w MacOs


SourceTree – widok zmodyfikowanych plików
SourceTree – okno główne pod kontrolą Windows

Git Kraken

Kolejnym, wartym uwagi narzędziem jest GitKraken.

Git Kraken to świetne narzędzie, bardzo dobrze dopracowane wizualnie, dostępność poszczególnych opcji i układ menu jest przemyślany. Społeczność i tutoriale na stronie GitKrakena są po prostu świetne!

Za GitKrakenem stoi obecnie firma Axsoft z amerykańskiej Arizony.

GitKraken dla zespołów programistów jest płatny:

GitKraken – cennik

Solo-programista może go jednak używać za darmo. To skuteczna polityka firmy umożliwiająca przyzwyczajenie użytkowników do swojego narzędzia i pośrednie wymuszenie na firmie jego zakupu.

Po wykaz funkcji GitKrakena zapraszam na stronę gitkraken.com

Na uwagę zasługuje wbudowana w GitKrakena integracja z popularnymi narzędziami wspierającymi prace w projektach jak Jira, GitLab, GitHub czy Trello.
Bardzo pomocne są również wbudowane narzędzia do pracy grupowej.

W mojej opinii jest to najlepsze i najabrdziej rozbudowane narzędzie do pracy z GITem, niestety dla zespołów – płatne.

GitKraken – widok okna głównego

Strona domowa: https://www.gitkraken.com/

Co poza tym?

TortoiseGIT

Większość nieco starszych programistów zna zapewne „żółwia” z TortoiseSVN, do GITa też powstał Tortoise. Jego naczelną funkcją jest integracja z Eksploratorem Windows i zapewnienie menu kontekstowego bezpośrednio w Systemie Operacyjnym umożliwiającego realizację najczęstszych poleceń GITa. Dodatkowo wprowadza on ikony nakładane na pliki, symbolizujące stan w repozytorium GITa:

TortoiseGIT – ikony plików w Eksploratorze Windows


Jest stale rozwijany i być może niektórym przypadnie do gustu.

Strona domowa: https://tortoisegit.org/

TortoiseGIT – menu kontekstowe programu – w Explolatorze Windows
TortoiseGIT- okno commitowania

TortoiseGIT dostarcza także przyjemne narzędzie do rozwiązywania konfliktów:

TortoiseGIT – narzędzie do rozwiązywania konfliktów

Drobne narzędzia:

GITk

Nie możemy zapomnieć o wbudowanym w GIT podglądzie GITk. Umożliwia on szybki podgląd układu gałęzi i zmian wykonywanych w poszczególnych commitach.

Jeśli ktoś decyduje się na korzystanie z wiersza poleceń do pracy z GITem i czasami chce sprawdzić jak ułożone są gałęzie w prostym narzędziu graficznym – gitk będzie idealny. Wywołujemy go wpisując gitk w wierszu poleceń (zakładając, że mamy zainstalowanego GITa i poprawnie ustawiony PATH).

GitK – okno główne
GIT-GUI

To drugie narzędzie dostarczane wraz z GITem typu commit tool, czyli ułatwiacz wykonywania commitów. Wywołujemy go z linii poleceń:

git gui

GIT-GUI – okno główne
GIT-GUI – commit

W przejrzysty sposób prezentuje pliki, które zostaną zawarte w commicie, umożliwia przejrzenie zmian i np. ich wycofanie.

Osobiście często go używam, gdy decyduję się na pracę z linią poleceń git gui uruchamiam przed wykonaniem commita, który zostanie „wypchnięty” do repozytorium na serwerze.

git log –graph

Dla konsolowych hardcorowców jest też:

git log --all --graph

Czyli prezentacja gałęzi za pomocą konsoli:

git log –graph

Wbrew pozorom ma to swoje zalety, na wyniku polecenia możemy np. wykonać grep lub inne przetwarzanie tekstu.

Listę wszystkich graficznych klientów znajdziemy tutaj.

Konflikty, konflikty – wszędzie konflikty

W ostatnim artykule mówiliśmy o rozwiązywaniu konfliktów. Wspominałem, że „ręczne rozwiązywanie konfliktów”, czyli poprzez edycję odpowiednio oznaczonego przez GIT plików tekstowego wcale nie jest takie trudne i czasami to najszybszy sposób.
Jeśli natomiast konfliktów jest więcej, albo konieczne do wykonania zmiany są mniej oczywiste przydatne będzie dedykowane narzędzie.

To z jakiego narzędzia GIT (lub dany program zapewniający GUI do GITa) będzie korzystał konfigurujemy w ustawieniach.

Łączenie trójstronne – 3-way merge

Łączenie trójstronne to bardzo przydatna opcja, dla osób początkujących nieco niezrozumiała. Omówmy ją w skrócie:

Ty i drugi programista pracujecie nad tym samym plikiem:

  • Kolega zmodyfikował przedostatnią linię w pliku, połączył z masterem i przesłał zmiany do repozytorium na serwerze centralnym.
  • Ty – na swojej gałęzi – zmodyfikowałeś pierwszą linię w tym samym pliku i próbujesz zrobić merge z masterem aby przesłać zmianę na serwer centralny.
  • Pojawia się konflikt: zarówno Ty jak i kolega zmodyfikowaliście ten sam plik, nie ma pewności jak to połączyć.

Gdybyśmy dokonywali łączenia dwustronnego – podobnie jak miało to zazwyczaj miejsce np. w SVN, widzielibyśmy w panele:

  • Plik ze zmianami kolegi (przedostatnia linia oznaczona zostanie jako zmodyfikowana)
  • Plik z Twoimi zmianami (pierwsza linia oznaczona zostanie jako zmodyfikowana)
  • Panel wynikowy, w którym musisz zdecydować o wyniku połączenia

Nie masz pewności, którą zmianę pozostawić, a którą usunąć, a może pozostawić obie..?
Oczywiście możesz to wydedukować, ale przydatne będzie spojrzenie „od jakiego pliku wyszliście„, czyli jak wyglądał wspólny przodek zmodyfikowanego pliku zanim zaczęliście wprowadzać na nim zmiany. Pozwoli Ci to zweryfikować w jakim celu kolega wprowadził zmianę i w jakim celu zrobiłeś to Ty, ocenisz też czy funkcjonalności czasami się nie duplikują.
Na tym właśnie polega łączenie trójstronne – system do powyższej listy doda jeszcze jeden panel – ze wspólnym przodkiem.

3-way merge
Łączenie trójstronne: Wspólny Przodek, plik Twój, plik drugiego programisty, wynik.

Meld

Zasadniczo – wszystkie opisywane programy są podobne, różnią się detalami i wybór konkretnego głównie zależy od preferencji programisty.
Ja bardzo lubię narzędzie Meld. Jest szybkie, darmowe, działa zarówno pod Linuxem jak i WIndowsem i ma przyjazny interfejs. Oprócz tego posiada funkcję porównywania katalogów, „auto-merge” i spore możliwości personalizacji.

Strona domowa: https://meldmerge.org/

Meld – rozwiązywanie konfliktów – fragment okna
Meld – łączenie trójstronne

KDiff3

To bardzo popularne narzędzie o nieco archaicznym interfejsie, ma wszystko czego potrzeba, interfejs wygląda tak samo na Windowsie jak i Linuxie. Jest rozpowszechniane na zasadach oper-source i bardzo wygodnie obsługuje się je za pomocą klawiatury.

Strona domowa: http://kdiff3.sourceforge.net/

KDiff3 – widok okna głównego

Beyond Compare

Trzecim narzędziem, o którym warto wspomnieć (ale niestety płatnym) jest Beyond Compare . Posiada ładny, przyjazny dla oka interfejs i sporo opcji.

Strona domowa: https://www.scootersoftware.com/

Beyond Compare – łączenie trójstronne
Beyond Compare – analiza różnić w folderach

WinMerge

Ostatnim narzędziem, którego paradoksalnie używam często jest WinMerge, co prawda nie do pracy z GIT, ale do porównywania plików poza systemem kontroli wersji, porównywania skryptów i zawartości folderów. Ma przyjazny, nowoczesny interfejs i działa bardzo szybko. Niedawno autorzy wprowadzili opcję łączenia 3-stronnego, której brakowało dotychczas. WinMerge posiada także opcje porównywania zdjęć, tabel i plików binarnych!

Strona projektu: https://winmerge.org/

WinMerge – widok okna scalania plików
WinMerge – scalanie trójstronne
WinMerge – widok okna porównywania katalogów
Visual Studio Code

Bardzo przystępne mergeowanie, a także obsługę GITa oferuje Vistual Studio Code, niestety natywnie nie wspiera łączenia 3-stronnego i to jest duża wada. Problem ten starają się rozwiązać rozszerzenia, ale żadne z nich nie jest idealne. Natomiast sama obsługa GITa na potrzeby nieskomplikowanych „Git-Flow”, oraz prosta opcja scalania zasługują na uwagę i w praktyce często z nich korzystam.

Strona domowa projektu: https://code.visualstudio.com/

Visual Studio Code – widok rozwiązywania konfliktu scalania
GitLeans – VS Code

Jeśli jesteśmy przy VS Code i GIT to polecam rozszerzenie GitLeans. Zawiera kompleksową obsługę najczęściej wykorzystywanych funkcji GITa w VS Code.

Mój wybór

Moje preferencje to:

  • w codziennych przypadkach: Wiersz Poleceń (Cmder) + Visual Studio Code
  • w trudniejszych sprawach: GitExtension + Meld!

Myślę, że omówiliśmy wszystkie warte uwagi narzędzia współpracujące z GIT, zachęcam do subskrypcji i obserwowania bloga, niebawem kolejne wpisy! 🙂

Jedna odpowiedź do “[GIT] Zaawansowane funkcje – cz. 4 – Przydatne Narzędzia”

  1. Pingback: dotnetomaniak.pl

Leave a Reply