Polski frontend

Oskar Kowalów - blog o programowaniu

Git - podstawowa praca w lokalnym repozytorium

body{--theme-ui-colors-transparent:var(--theme-ui-colors-transparent,transparent);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-white:var(--theme-ui-colors-white,#fff);--theme-ui-colors-gray-0:var(--theme-ui-colors-gray-0,null);--theme-ui-colors-gray-1:var(--theme-ui-colors-gray-1,#f7fafc);--theme-ui-colors-gray-2:var(--theme-ui-colors-gray-2,#edf2f7);--theme-ui-colors-gray-3:var(--theme-ui-colors-gray-3,#e2e8f0);--theme-ui-colors-gray-4:var(--theme-ui-colors-gray-4,#cbd5e0);--theme-ui-colors-gray-5:var(--theme-ui-colors-gray-5,#a0aec0);--theme-ui-colors-gray-6:var(--theme-ui-colors-gray-6,#718096);--theme-ui-colors-gray-7:var(--theme-ui-colors-gray-7,#4a5568);--theme-ui-colors-gray-8:var(--theme-ui-colors-gray-8,#2d3748);--theme-ui-colors-gray-9:var(--theme-ui-colors-gray-9,#1a202c);--theme-ui-colors-red-0:var(--theme-ui-colors-red-0,null);--theme-ui-colors-red-1:var(--theme-ui-colors-red-1,#fff5f5);--theme-ui-colors-red-2:var(--theme-ui-colors-red-2,#fed7d7);--theme-ui-colors-red-3:var(--theme-ui-colors-red-3,#feb2b2);--theme-ui-colors-red-4:var(--theme-ui-colors-red-4,#fc8181);--theme-ui-colors-red-5:var(--theme-ui-colors-red-5,#f56565);--theme-ui-colors-red-6:var(--theme-ui-colors-red-6,#e53e3e);--theme-ui-colors-red-7:var(--theme-ui-colors-red-7,#c53030);--theme-ui-colors-red-8:var(--theme-ui-colors-red-8,#9b2c2c);--theme-ui-colors-red-9:var(--theme-ui-colors-red-9,#742a2a);--theme-ui-colors-orange-0:var(--theme-ui-colors-orange-0,null);--theme-ui-colors-orange-1:var(--theme-ui-colors-orange-1,#fffaf0);--theme-ui-colors-orange-2:var(--theme-ui-colors-orange-2,#feebc8);--theme-ui-colors-orange-3:var(--theme-ui-colors-orange-3,#fbd38d);--theme-ui-colors-orange-4:var(--theme-ui-colors-orange-4,#f6ad55);--theme-ui-colors-orange-5:var(--theme-ui-colors-orange-5,#ed8936);--theme-ui-colors-orange-6:var(--theme-ui-colors-orange-6,#dd6b20);--theme-ui-colors-orange-7:var(--theme-ui-colors-orange-7,#c05621);--theme-ui-colors-orange-8:var(--theme-ui-colors-orange-8,#9c4221);--theme-ui-colors-orange-9:var(--theme-ui-colors-orange-9,#7b341e);--theme-ui-colors-yellow-0:var(--theme-ui-colors-yellow-0,null);--theme-ui-colors-yellow-1:var(--theme-ui-colors-yellow-1,#fffff0);--theme-ui-colors-yellow-2:var(--theme-ui-colors-yellow-2,#fefcbf);--theme-ui-colors-yellow-3:var(--theme-ui-colors-yellow-3,#faf089);--theme-ui-colors-yellow-4:var(--theme-ui-colors-yellow-4,#f6e05e);--theme-ui-colors-yellow-5:var(--theme-ui-colors-yellow-5,#ecc94b);--theme-ui-colors-yellow-6:var(--theme-ui-colors-yellow-6,#d69e2e);--theme-ui-colors-yellow-7:var(--theme-ui-colors-yellow-7,#b7791f);--theme-ui-colors-yellow-8:var(--theme-ui-colors-yellow-8,#975a16);--theme-ui-colors-yellow-9:var(--theme-ui-colors-yellow-9,#744210);--theme-ui-colors-green-0:var(--theme-ui-colors-green-0,null);--theme-ui-colors-green-1:var(--theme-ui-colors-green-1,#f0fff4);--theme-ui-colors-green-2:var(--theme-ui-colors-green-2,#c6f6d5);--theme-ui-colors-green-3:var(--theme-ui-colors-green-3,#9ae6b4);--theme-ui-colors-green-4:var(--theme-ui-colors-green-4,#68d391);--theme-ui-colors-green-5:var(--theme-ui-colors-green-5,#48bb78);--theme-ui-colors-green-6:var(--theme-ui-colors-green-6,#38a169);--theme-ui-colors-green-7:var(--theme-ui-colors-green-7,#2f855a);--theme-ui-colors-green-8:var(--theme-ui-colors-green-8,#276749);--theme-ui-colors-green-9:var(--theme-ui-colors-green-9,#22543d);--theme-ui-colors-teal-0:var(--theme-ui-colors-teal-0,null);--theme-ui-colors-teal-1:var(--theme-ui-colors-teal-1,#e6fffa);--theme-ui-colors-teal-2:var(--theme-ui-colors-teal-2,#b2f5ea);--theme-ui-colors-teal-3:var(--theme-ui-colors-teal-3,#81e6d9);--theme-ui-colors-teal-4:var(--theme-ui-colors-teal-4,#4fd1c5);--theme-ui-colors-teal-5:var(--theme-ui-colors-teal-5,#38b2ac);--theme-ui-colors-teal-6:var(--theme-ui-colors-teal-6,#319795);--theme-ui-colors-teal-7:var(--theme-ui-colors-teal-7,#2c7a7b);--theme-ui-colors-teal-8:var(--theme-ui-colors-teal-8,#285e61);--theme-ui-colors-teal-9:var(--theme-ui-colors-teal-9,#234e52);--theme-ui-colors-blue-0:var(--theme-ui-colors-blue-0,null);--theme-ui-colors-blue-1:var(--theme-ui-colors-blue-1,#ebf8ff);--theme-ui-colors-blue-2:var(--theme-ui-colors-blue-2,#bee3f8);--theme-ui-colors-blue-3:var(--theme-ui-colors-blue-3,#90cdf4);--theme-ui-colors-blue-4:var(--theme-ui-colors-blue-4,#63b3ed);--theme-ui-colors-blue-5:var(--theme-ui-colors-blue-5,#4299e1);--theme-ui-colors-blue-6:var(--theme-ui-colors-blue-6,#3182ce);--theme-ui-colors-blue-7:var(--theme-ui-colors-blue-7,#2b6cb0);--theme-ui-colors-blue-8:var(--theme-ui-colors-blue-8,#2c5282);--theme-ui-colors-blue-9:var(--theme-ui-colors-blue-9,#2a4365);--theme-ui-colors-indigo-0:var(--theme-ui-colors-indigo-0,null);--theme-ui-colors-indigo-1:var(--theme-ui-colors-indigo-1,#ebf4ff);--theme-ui-colors-indigo-2:var(--theme-ui-colors-indigo-2,#c3dafe);--theme-ui-colors-indigo-3:var(--theme-ui-colors-indigo-3,#a3bffa);--theme-ui-colors-indigo-4:var(--theme-ui-colors-indigo-4,#7f9cf5);--theme-ui-colors-indigo-5:var(--theme-ui-colors-indigo-5,#667eea);--theme-ui-colors-indigo-6:var(--theme-ui-colors-indigo-6,#5a67d8);--theme-ui-colors-indigo-7:var(--theme-ui-colors-indigo-7,#4c51bf);--theme-ui-colors-indigo-8:var(--theme-ui-colors-indigo-8,#434190);--theme-ui-colors-indigo-9:var(--theme-ui-colors-indigo-9,#3c366b);--theme-ui-colors-purple-0:var(--theme-ui-colors-purple-0,null);--theme-ui-colors-purple-1:var(--theme-ui-colors-purple-1,#faf5ff);--theme-ui-colors-purple-2:var(--theme-ui-colors-purple-2,#e9d8fd);--theme-ui-colors-purple-3:var(--theme-ui-colors-purple-3,#d6bcfa);--theme-ui-colors-purple-4:var(--theme-ui-colors-purple-4,#b794f4);--theme-ui-colors-purple-5:var(--theme-ui-colors-purple-5,#9f7aea);--theme-ui-colors-purple-6:var(--theme-ui-colors-purple-6,#805ad5);--theme-ui-colors-purple-7:var(--theme-ui-colors-purple-7,#6b46c1);--theme-ui-colors-purple-8:var(--theme-ui-colors-purple-8,#553c9a);--theme-ui-colors-purple-9:var(--theme-ui-colors-purple-9,#44337a);--theme-ui-colors-pink-0:var(--theme-ui-colors-pink-0,null);--theme-ui-colors-pink-1:var(--theme-ui-colors-pink-1,#fff5f7);--theme-ui-colors-pink-2:var(--theme-ui-colors-pink-2,#fed7e2);--theme-ui-colors-pink-3:var(--theme-ui-colors-pink-3,#fbb6ce);--theme-ui-colors-pink-4:var(--theme-ui-colors-pink-4,#f687b3);--theme-ui-colors-pink-5:var(--theme-ui-colors-pink-5,#ed64a6);--theme-ui-colors-pink-6:var(--theme-ui-colors-pink-6,#d53f8c);--theme-ui-colors-pink-7:var(--theme-ui-colors-pink-7,#b83280);--theme-ui-colors-pink-8:var(--theme-ui-colors-pink-8,#97266d);--theme-ui-colors-pink-9:var(--theme-ui-colors-pink-9,#702459);--theme-ui-colors-grayDark:var(--theme-ui-colors-grayDark,#2d3748);--theme-ui-colors-text:var(--theme-ui-colors-text,#2d3748);--theme-ui-colors-background:var(--theme-ui-colors-background,#fff);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#6b46c1);--theme-ui-colors-primaryHover:var(--theme-ui-colors-primaryHover,#2c5282);--theme-ui-colors-secondary:var(--theme-ui-colors-secondary,#5f6c80);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#e2e8f0);--theme-ui-colors-success:var(--theme-ui-colors-success,#9ae6b4);--theme-ui-colors-info:var(--theme-ui-colors-info,#63b3ed);--theme-ui-colors-warning:var(--theme-ui-colors-warning,#faf089);--theme-ui-colors-danger:var(--theme-ui-colors-danger,#feb2b2);--theme-ui-colors-light:var(--theme-ui-colors-light,#f7fafc);--theme-ui-colors-dark:var(--theme-ui-colors-dark,#2d3748);--theme-ui-colors-textMuted:var(--theme-ui-colors-textMuted,#718096);--theme-ui-colors-toggleIcon:var(--theme-ui-colors-toggleIcon,#2d3748);--theme-ui-colors-heading:var(--theme-ui-colors-heading,#000);--theme-ui-colors-divide:var(--theme-ui-colors-divide,#cbd5e0);color:var(--theme-ui-colors-text,#2d3748);background-color:var(--theme-ui-colors-background,#fff);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#cbd5e0);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#9f7aea);--theme-ui-colors-secondary:var(--theme-ui-colors-modes-dark-secondary,#7f8ea3);--theme-ui-colors-toggleIcon:var(--theme-ui-colors-modes-dark-toggleIcon,#cbd5e0);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#1A202C);--theme-ui-colors-heading:var(--theme-ui-colors-modes-dark-heading,#fff);--theme-ui-colors-divide:var(--theme-ui-colors-modes-dark-divide,#2d3748);--theme-ui-colors-muted:var(--theme-ui-colors-modes-dark-muted,#2d3748);}*{box-sizing:border-box;}body{margin:0;font-family:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.625;font-weight:400;color:var(--theme-ui-colors-text,#2d3748);background-color:var(--theme-ui-colors-background,#fff);padding:0;box-sizing:border-box;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.css-1ccrm8j{font-size:1rem;-webkit-letter-spacing:-0.003em;-moz-letter-spacing:-0.003em;-ms-letter-spacing:-0.003em;letter-spacing:-0.003em;line-height:1.625;--baseline-multiplier:0.179;--x-height-multiplier:0.35;word-break:break-word;}@media screen and (min-width:640px){.css-1ccrm8j{font-size:1rem;}}@media screen and (min-width:768px){.css-1ccrm8j{font-size:1.25rem;}}

Cześć, witam Cię w kolejnym wpisie 🤚. W tym artykule przeprowadzę Cię przez początki pracy z Git'em.

Na koniec tego artykułu:

.css-15rlv7r li{font-size:1rem;-webkit-letter-spacing:-0.003em;-moz-letter-spacing:-0.003em;-ms-letter-spacing:-0.003em;letter-spacing:-0.003em;line-height:1.625;--baseline-multiplier:0.179;--x-height-multiplier:0.35;}@media screen and (min-width:640px){.css-15rlv7r li{font-size:1rem;}}@media screen and (min-width:768px){.css-15rlv7r li{font-size:1.25rem;}}będziesz miał zainstalowany i skonfigurowany Git na swoim komputerze,założysz lokalne repozytorium, poznasz podstawowy workflow, który będzie składał się z komend git status, git log, git add i git commit..css-1gtwvjp{border-left-color:var(--theme-ui-colors-primary,#6b46c1);border-left-style:solid;border-left-width:6px;margin-left:0;margin-right:0;padding-left:2rem;}.css-1gtwvjp p{font-style:italic;}

Uwaga dla doświadczonych użytkowników 💡

Jeśli używasz Git'a na codzień i wiesz o co chodzi z commitami, to prawdopodobnie ten wpis nie jest dla Ciebie, ale zapraszam Cię do przeczytania tego artykułu i podzielenia się swoimi przemyśleniami/uwagami w komentarzach. Twoja opinia jest dla mnie ważna. Podzielenie się swoimi uwagami może pozytywnie wpłynąć na kształt następnych artykułów 🤝

.css-1p1kpni{font-family:inherit;font-weight:700;line-height:1.25;margin:0;margin-bottom:0.25rem;font-size:1.5rem;margin-top:2rem;color:var(--theme-ui-colors-heading,#000);}@media screen and (min-width:640px){.css-1p1kpni{font-size:1.875rem;}}@media screen and (min-width:768px){.css-1p1kpni{font-size:1.875rem;}}@media screen and (min-width:1024px){.css-1p1kpni{font-size:2.25rem;}}Czemu Git?

Jak wspomniałem w moim poprzednim wpisie, Git to obowiązkowe narzędzie każdego programisty. Git pozwala na tworzenie historii twojego kodu, który masz w swoim wybranym folderze, z możliwością przywrócenia stanu twojego projektu z wybranego momentu w czasie. Zapisywanie stanu projektu, przeglądanie jego historii i przywracanie zmian odbywa się lokalnie, więc nie trzeba mieć dostępu do internetu.

Myślę, że nie trudno jest wyobrazić sobie sytuację, gdy piszesz stronę internetową, masz już wszystko gotowe i wystarczy kliknąć "save", a tu nagle jakieś zrządzenie losu i przypadkiem usuwasz cały plik, lub chociaż większość kodu z pliku. Czasami nie ma możliwości powrotu do usuniętych treści. Albo masz gotową stronę i zaczynasz wprowadzać poprawki do kodu, ale niechcący psujesz masę rzeczy i już nie wiadomo, gdzie szukać źródła problemu.

Mając Gita i tworząc historię kodu, gdzie każdą zmianę commitujesz (od komendy git commit), nie będziesz miał takiego problemu, bo w każdym momencie możesz przywrócić ostatnią działającą wersję swojego kodu (lub innych plików).

Załóżmy, że piszesz stronę internetową i postanowiłeś dodać menu na górze strony. Typowy workflow w Git'cie wygląda mniej więcej tak: piszesz kod (czyli dodajesz menu na stronie), następne wybierasz pliki lub konkretne linie kodu, które będą miały być zapisane (staged area), nadajesz opis tym zmianom i zapisujesz je (commit) w historii (czyli w naszej lokalnej bazie danych Gita). I ten proces powtarza się za każdym razem jak wprowadzisz kolejną zmianę w kodzie, lub w dowolnym pliku w całym repozytorium. W Git'cie zapisywana jest cała historia zmian w repozytorium i tym samym wszystkie pliki w takim stanie w jakim znajdowały się w danym momencie. Czyli Git nie tylko zapisuje historię zmian, z informacją, co się zmieniło i kto to zrobił, ale też zachowuje wszystkie pliki w takim stanie w jakim były podczas zapisywania zmian. Możesz więc wrócić do poprzedniego commita i odtworzyć zawartość plików w konkretnym momencie w czasie.

Ale zacznijmy od początku...

Instalacja Git

Żeby zacząć używać Gita, musisz mieć go zainstalowanego na swoim komputerze. Aby upewnić się, czy Git jest dostępny na twoim komputerze, otwórz terminal i wpisz komendę:

.css-l84w3r{background-color:rgba(107,70,193,0.2);border:none;color:var(--theme-ui-colors-gray-2,#edf2f7);cursor:pointer;font-size:14px;font-family:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";-webkit-letter-spacing:0.025rem;-moz-letter-spacing:0.025rem;-ms-letter-spacing:0.025rem;letter-spacing:0.025rem;-webkit-transition:default;transition:default;position:absolute;top:0;right:0;z-index:1;border-radius:0 0 0 0.25rem;padding:0.25rem 0.6rem;}@media screen and (min-width:640px){.css-l84w3r{font-size:14px;}}@media screen and (min-width:768px){.css-l84w3r{font-size:16px;}}.css-l84w3r[disabled]{cursor:not-allowed;}.css-l84w3r:not([disabled]):hover{background-color:var(--theme-ui-colors-primary,#6b46c1);color:var(--theme-ui-colors-white,#fff);}Copy.css-1gy8470{border:0;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px;}copy code to clipboard1git --version

Jeżeli nie zobaczysz konkretnej wersji programu to możesz przejść do instalacji Gita:

instalacja na systemie Windows - .css-688a3f{box-sizing:border-box;margin:0;min-width:0;color:var(--theme-ui-colors-primary,#6b46c1);-webkit-text-decoration:none;text-decoration:none;}.css-688a3f:hover{-webkit-text-decoration:underline;text-decoration:underline;}https://git-scm.com/download/wininstalacja na Linuxie - https://git-scm.com/download/linuxinstalacja na macOS - https://git-scm.com/download/mac

Po zakończonej instalacji, aby upewnić się, że wszystko zakończyło się pomyślnie jeszcze raz sprawdź wersję gita, za pomocą komendy, która jest powyżej.

Konfiguracja Git'a

Super, masz zainstalowanego Git'a! Teraz go skonfigurujesz i zaczniesz z niego korzystać.

Żeby móc używać Git'a, trzeba skonfigurować jego środowisko. Robi się to raz, dla każdego komputera. Git potrzebuje twojego maila i nazwy użytkownika. Git używa tych informacji dla każdego commita, którego stworzysz.

Copycopy code to clipboard1git config --global user.name "Jan Kowalski"2git config --global user.email jankowalski@przyklad.pl

To jest jedyna rzecz, którą trzeba zrobić, aby Git zaczął używać tych informacji dla dowolnego repozytorium, które stworzysz na swoim komputerze (dzięki fladze --global). Jeżeli we wszystkich repozytoriach nie chcesz używać tych samych danych, to możesz skonfigurować osobno każde repozytorium, używając powyższych komend bez flagi --global.

Możesz sprawdzić, czy Git dobrze zapisał twoje dane za pomocą komend:

Copycopy code to clipboard1git config user.name2git config user.emailZakładanie nowego repozytorium

Kilka razy wspomniałem słowo "repozytorium". Co to właściwie jest? Repozytorium to jest konkretny folder na twoim komputerze, którego Git jest świadom. To znaczy, że Git będzie śledził wszystkie zmiany w danym folderze, po to, aby umożliwić Ci ich zapisanie w swojej bazie danych. Każde repozytorium musi mieć swój osobny folder.

Będziemy korzystać z terminala do podstawowych operacji, takich jak: przemieszczanie się między folderami (cd), tworzenie folderów (mkdir), tworzenie plików (touch), dodawanie tekstu do plików (echo) i podglądanie zawartości pliku (vim). Operacje związane z tworzeniem pliku i modyfikowaniem go, możesz wykonać ręcznie za pomocą GUI, a nie za pomocą terminala. Inaczej mówiąc, możesz modyfikować pliki za pomocą edytora tekstowego, nie musisz korzystać z terminala.

Stwórz nowy folder, przejdź do niego i stwórz repozytorium:

Copycopy code to clipboard1mkdir nauka-gita2cd nauka-gita3git init

Ku twojej uciesze powinieneś zobaczyć podobny komunikat (oczywiście z inną ścieżką do twojego folderu):

Copycopy code to clipboard1Initialized empty Git repository in /Users/oskarkowalow/Projects/git-test/.git/

Brawo, stworzyłeś nowe repozytorium 🎉. Teraz jest ono puste, ale za chwilę zaczniemy dodawać do niego jakąś zawartość.

Rejestrowanie zmian w repozytorium

Właśnie przechodzimy do najciekawszej sekcji 🔥.

Jak wspomniałem, aktualnie twoje repozytorium jest puste. Aby się o tym przekonać wpisz komendę git status:

Copycopy code to clipboard1git status2 3On branch master4No commits yet5nothing to commit (create/copy files and use "git add" to track)

To komenda pokazuje nam informacje o aktualnym stanie plików w naszym repozytorium. Jak widać mamy tu kilka informacji. Aktualnie jesteśmy na domyślnym branchu master, nie mamy żadnych commitów i nie mamy nic do zacommitowania. To prawda. Git nie śledzi żadnych plików, bo w tym folderze nie ma żadnych plików ani folderów. Git podpowiada nam co możemy teraz zrobić:

Copycopy code to clipboard1create/copy files and use "git add" to track

No dobrze, zatem stwórzmy sobie pusty plik README.txt:

Copycopy code to clipboard1touch README.txt

Ta komenda stworzyła pusty plik README.txt w aktualnym folderze. Sprawdźmy, czy teraz Git coś zauważy:

Copycopy code to clipboard1git status2 3On branch master4No commits yet5Untracked files:6 (use "git add <file>..." to include in what will be committed)7 README.txt8 9nothing added to commit but untracked files present (use "git add" to track)

Teraz Git mówi nam coś więcej. Widzimy, że nasz plik README.txt jest jako "Untracked file". W ostatniej linijce dostajemy informację, że nic nie zostało dodane do commita, ale Git widzi nieśledzone pliki i podpowiada, że może chcemy zacząć je śledzić.

Tutaj dochodzimy do istotnej informacji. Każdy plik może być w jednym z dwóch stanów: tracked albo untracked. Pliki, które są śledzone (tracked) to pliki, które były w ostatnim commicie, czyli już zostały zapisane w historii. Natomiast pliki nieśledzone przez Git'a to wszystko pozostałe, czyli pliki, które ani nie były w poprzednim commitcie, ani nie są w obszarze staged, o czym za chwilę opowiem. Póki co widzimy, że nasz nowy plik jest jako untracked, więc jedynie co możemy z nim zrobić to dodać go do obszaru staged. Zobaczmy jak to wygląda.

.css-14fixdb{font-family:inherit;font-weight:700;line-height:1.25;margin:0;margin-bottom:0.25rem;font-size:1.25rem;color:var(--theme-ui-colors-heading,#000);margin-top:1rem;}@media screen and (min-width:640px){.css-14fixdb{font-size:1.5rem;}}@media screen and (min-width:768px){.css-14fixdb{font-size:1.5rem;}}@media screen and (min-width:1024px){.css-14fixdb{font-size:1.875rem;}}Śledzenie nowych plików

Git doradził nam, że możemy zacząć śledzić nasz nowy plik - zróbmy to.

Copycopy code to clipboard1git add README.txt

Ciekawe co powie nam Git, jak odpalimy komendę git status:

Copycopy code to clipboard1git status2 3On branch master4No commits yet5 6Changes to be commited:7 (use "git rm --cached <file>..." to unstage)8 new file: README.txt

Teraz plik README.txt jest śledzony oraz jest fazie staged. Staged area oznacza, że plik może być zacommitowany, czyli zachowany w historii Git'a. Skąd wiemy, że plik jest oznaczony jako staged? Po tym, że widzimy komunikat "Changes to be commited".

A więc zapiszmy nasz nowy plik i zróbmy naszego pierwszego commita 🤩.

Zatwierdzanie zmian

Mamy wybrany plik README.txt, który chcemy zapisać i znajduje się on w fazie staged. Każdy plik, który ma być zapisany musi się znaleźć w tym obszarze, bo inaczej Git go nie zapisze. Wpisujemy:

Copycopy code to clipboard1git commit

Teraz powinieneś zobaczyć w terminalu czarny ekran z kilkoma linijkami tekstu, który na pierwszy rzut oka wygląda dość strasznie.

Copycopy code to clipboard1[tutaj jest nasz kursor]2# Please enter the commit message for your changes. Lines starting3# with '#' will be ignored, and an empty message aborts the commit.4#5# On branch master6#7# Initial commit8#9# Changes to be committed:10# new file: README.txt11#12~13~14~

To co się nam pokazało to edytor tekstu Vim. Na samej górze miga nasz kursor. Poniżej dowiemy się, że mamy podać opis commita dla naszych zmian. Dalej widzimy, że cały tekst, który jest poprzedzany znakiem # to komentarz, i nie znajdzie się on w historii naszych zmian. Dalej widzimy znajome Ci informacje o branchu master i o zmianach, które zostaną zatwierdzone, czyli plik README.txt. Jednak pomiędzy tymi linijkami pojawiła się informacja, której wcześniej nie było - "initial commit". To jest pierwszy commit w tym repozotorium. I ten pierwszy commit musi zawierać jakieś pliki, bo inaczej nie moglibyśmy go stworzyć.

Teraz trzeba podać wiadomość do naszego commita. Wiadomość commita to musi być coś, co charakteryzuje aktualnie dodaną zmianę. Wiadomość ta składa się z tytułu i opisu, przy czym między tytułem a opisem musi być jedna pusta linia przerwy.

Czemu by nie nazwać tego commita "Initial commit", tak jak podpowiada nam Git? Podaj też opis commita. W tym przypadku nie jest on konieczny, bo wiadomo, że jest to pierwszy commit i niewiele w nim dodajemy, to jednak warto dodać dodatkowe parę zdań, które wyjaśni co i dlaczego dodaliśmy z naszych zmianach.

Copycopy code to clipboard1Initial commit2 3This is my first commit in this repo. I only added an empty README.txt file.

I teraz trzeba zapisać wiadomość tego commita i wyjść z edytoru Vim. Posłuży nam sekwencja klawiszy ESC, a następnie wpisanie :wq (te trzy znaki pojawią się na samym dole w otwartym edytorze) i kliknięcie enter.

Nie zawsze trzeba pisać opis do commita ale warto o tym pamiętać. Jeśli chcesz dodać tylko tytuł commita, bez opisu, możesz użyć innej komendy:

Copycopy code to clipboard1git commit -m "Initial commit"2[master (root-commit) 5c0c99d] Initial commit31 file changed, 0 insertions(+), 0 deletions(-)4create mode 100644 README.txt

Stworzyłeś swojego pierwszego commita 🥳.

Zobacz, że dostaliśmy kilka informacji o stworzonym commicie: nazwę brancha na którym jesteśmy (master), SHA-1 (czyli hash SHA-1, informacja, za pomocą której Git zapisuje commita w bazie danych), ile plików się zmieniło oraz ile linii dodaliśmy i ile usunęliśmy.

Wyświetlanie historii commitów

Teraz mając już pierwszego commita za nami możemy wyświetlić historię commitów jakie znajdują się w repozytorium w którym przebywamy. Do tego użyjemy komendy git log, która otworzy nam poglądowe okienko w terminalu i informacją o ostatnich commitach. U mnie wygląda to następująco:

Copycopy code to clipboard1commit 5c0c99dca76dd91eb72af9cb3b2aa8920a203a7d (HEAD -> master)2Author: Oskar Kowalów <kowalow.oskar@gmail.com>3Date: Sat Aug 8 13:14:49 2020 +02004 5 Initial commit6 7 This is my first commit in this repo. I only added an empty README.txt file.

Mamy informację o SHA-1 commita, dane autora, datę oraz wiadomość commita.

Zapisywanie modyfikowanych plików

Dodajmy jakiś tekst do naszego nowo stworzonego pliku README.txt. Możesz wpisać poniższą komendę lub edytować plik swoim ulubionym edytorem tekstu:

Copycopy code to clipboard1echo 'To jest nowe README, czytaj uwaznie' >> README.txt

Teraz sprawdźmy co widzi Git:

Copycopy code to clipboard1git status2On branch master3Changes not staged for commit:4 (use "git add <file>..." to update what will be committed)5 (use "git checkout -- <file>..." to discard changes in working directory)6 7 modified: README.txt8 9no changes added to commit (use "git add" and/or "git commit -a")

Widzimy, że plik README.txt jest oznaczony jako modified. Pliki już aktualnie śledzone przez Git'a, czyli takie, które już znalazły się w poprzednim commicie, mogą być w trzech stanach: unmodified, modified albo staged. Póki co spotkaliśmy modified oraz staged. Modified oznacza plik, który został zmienił się od czasu ostatniego commita. To by się zgadzało, bo wcześniej plik README.txt był pusty, a teraz zawiera nowy tekst.

Stwórzmy sobie jeszcze jeden plik w naszym repozytorium:

Copycopy code to clipboard1touch CONTRIBUTING.txt2git status3On branch master4Changes not staged for commit:5 (use "git add <file>..." to update what will be committed)6 (use "git checkout -- <file>..." to discard changes in working directory)7 8 modified: README.txt9 10Untracked files:11 (use "git add <file>..." to include in what will be committed)12 13 CONTRIBUTING.txt14 15no changes added to commit (use "git add" and/or "git commit -a")

Dodajmy te pliki i zacommitujmy je. Najbezpieczniej jest dodawać pliki do fazy staged wymieniając je po kolei, czyli:

Copycopy code to clipboard1git add README.txt CONTRIBUTING.txt

Chyba, że wiemy co robimy, to możemy użyć skrótu i dodać wszystkie pliki, które się zmieniły do fazy staged:

Copycopy code to clipboard1git add -A

Załóżmy, że zanim zrobimy commita, chcemy jeszcze dodać więcej tekstu do pliku README.txt. Zmodyfikujmy go sobie:

Copycopy code to clipboard1echo 'Dopisuje kolejna wazna informacje' >> README.txt

Co teraz widzi Git?

Copycopy code to clipboard1git status2On branch master3Changes to be committed:4 (use "git reset HEAD <file>..." to unstage)5 6 new file: CONTRIBUTING.txt7 modified: README.txt8 9Changes not staged for commit:10 (use "git add <file>..." to update what will be committed)11 (use "git checkout -- <file>..." to discard changes in working directory)12 13 modified: README.txt

Hmm, mamy podwójnie zmodyfikowany plik README.txt? Coo 🤯? Musisz wiedzieć, że Git zapisał do fazy staged plik w takiej formie w jakiej był w momencie wywołania komendy git add. Jeżeli dodany plik zostanie zmodyfikowany, nowe zmiany nie są zapisane w fazie staged i nie wejdą one do następnego commita, jeśli ponownie ich nie dodamy.

Dodajmy zatem nowe zmiany, które pojawiły się w pliku README.txt:

Copycopy code to clipboard1git add README.txt2git status3On branch master4Changes to be committed:5 (use "git reset HEAD <file>..." to unstage)6 7 new file: CONTRIBUTING.txt8 modified: README.txt

Teraz wszystko się zgadza. Robimy commita i nadamy mu tylko tytuł:

Copycopy code to clipboard1git commit -m "Add new file and modify README"Podsumowanie

Mam nadzieję, że w tym artykule przybliżyłem Ci obsługę Git'a. Jeśli jeszcze nie zacząłeś go używać to warto to robić dla każdego swojego projektu, po to, aby śledzić proces swojej nauki. Jeśli coś było dla Ciebie niejasne, lub po prostu chcesz się podzielić swoimi przemyśleniami to serdecznie zapraszam Cię do sekcji komentarzy. Widzimy się w następnych 🤚