7 rzadko używanych opcji w Git, których nie spotkasz w tutorialach i cheatsheetach

Opublikowane przez Tomasz Prasołek w dniu

g-crescoli-468248-unsplash - mniejsze

W tym poście przedstawię kilka przydatnych, ale nie tak często używanych poleceń git, które zwykle nie występują w tutorialach i w ściągawkach (cheatsheet).

3 opcje pomocne dla bałaganiarzy mających w repo dużo branchy

Sytuacja wygląda tak:

git log

Stworzyłem nowe repozytorium, w nim stworzyłem 2 nowe branche: merged i no-merged. Branch merged po kilku commitach scaliłem z głównym, a branch no-merged zostawiłem w spokoju.

git branch -a --no-merged

Pokaże listę branchy nie scalonych z branchem na którym aktualnie się znajdujemy.

git branch no merged

git branch -a --merged

Pokaże listę branchy już scalonych z branchem na którym aktualnie się znajdujemy.

git branch merged

Mi się to przydaje, bo niestety w jednym projekcie mam zaczętych kilka feature’ów i każdy na osobnym branchu. Trochę bałagan się zrobił.

git branch -a --contains $REVISION$

Pokaże listę branchy na których znajduje się dany commit. Przykład zrobiony na tym samym repozytorium – zobacz pierwszy zrzut ekranu.

$ git branch -a --contains 24368cf
* master
merged
no-merged

$ git branch -a --contains 0829c61
* master
merged

$ git branch -a --contains 4562d62
no-merged
Tworzenie brancha od razu z branchem zdalnym

Za pomocą poniższego polecenia można stworzyć jednocześnie branch lokalny i zdalny.

git checkout -b -t feature-branch-name origin/feature-branch-name

Przyda się dla osób pracujących z GitFlow lub podobnym workflow.

Pokazanie historii innego brancha

Aby zobaczyć historię innego brancha nie musimy się na niego przełączać. Nie musimy odpalać jakiegoś GUI, gdzie można na wykresie zobaczyć wszystkie branche. Można użyć polecenia log i na końcu dodać nazwę brancha:

git log no-merged

git log no merged

Widać, że jestem na branchu master, a commity są pokazane z brancha no-merded. Polecenie git lgg to mój alias na git log --oneline + dodatkowe opcje.

Różnica w pliku z danego czasu
git diff HEAD@{"$DATE$ $TIME$"} $FILE$

Inny zapis:

git diff @{"$DATE$ $TIME$"} $FILE$

To pokaże różnicę w podanym pliku od podanej daty do ostatniej zmiany. Do pokazania jak to działa stworzyłem sobie repozytorium i zrobiłem w nim 4 commity.

git log diff date

W repozytorium jest dodany plik text.txt. Każdy commit dopisuje do niego linię z takim samym tekstem jaki jest wpisany w wiadomości commita. Czyli w commicie 6502475 – Bardzo stary commit został dodany tekst “Bardzo stary commit” itd. Commity są zrobione w parunastu sekundowych odstępach, więc tylko na sekundach będę pokazywał różnicę.

git diff date example

W pierwszym przykładzie chciałem zobaczyć jaka nastąpiła zmiana w pliku od godz. 08:13:48, czyli sekundę przed ostatnim commitem. Widać wyraźnie, że doszła jedna linia tekstu. W drugim przypadku przeglądam zmiany od godz. 08:13:38, czyli sekundę przed drugim commitem. Tutaj widzę, że od tego czasu doszły aż 3 linie tekstu.

Różnica, ale z ignorowaniem białych znaków
git diff -w $REVISION$

Mamy taką sytuację: ktoś dodał klasę User.cs i wyglądała ona tak:

user class - first commit

Na końcu linii zostawił spację i znak tabulatora. Kolejna osoba dodała do tej klasy nową właściwość i przy okazji zrobiła porządek z białymi znakami. Teraz klasa wygląda tak:

user class - second commit

Ale diff pokazuje coś takiego:

git diff normal

Doszła właściwość Login, ale poza tym nic się nie zmieniło. Przynajmniej nie widać tego na tym diffie. Wygląda na to, jakby usunięto 2 linie i dodano 3 nowe 🙂 Jeśli użyjemy polecenia diff z opcją -w zobaczymy natomiast inny wynik:

git diff ignore whitespaces

Doszła jedna nowa linia, zmiany związane z białymi znakami są w tym przypadku ignorowane.

Mam nadzieję, że te opcje kiedyś się Wam przydadzą 🙂


Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *