git checkout – operacje na plikach
Poznając polecenie git checkout, na początku zawsze dowiadujemy się, że dzięki niemu możemy przechodzić między branchami. Można z jego pomocą stworzyć nowy branch oraz można poruszać się pomiędzy commitami w historii repozytorium.
W tym wpisie pokażę Ci, że można również operować na plikach.
git checkout – operacje na plikach
Załóżmy, że mamy w projekcie klasę User.cs i wprowadziliśmy w niej jakieś zmiany, jeszcze nie dodaliśmy zmian do stage’a i nie zrobiliśmy commita. Wykonując polecenie:
git checkout -- User.cs
Usunie wszystkie wprowadzone przez Nas zmiany, znajdujące się w katalogu roboczym. Zmiany dodane już do stage’a zostaną nie ruszone. Dwa znaki myślnika są potrzebne, aby dać znać poleceniu, że teraz nastąpi podanie ścieżki do pliku, a nie np. nazwa brancha na którym chcemy przejść albo jakaś inna opcja.
Dzięki temu można bardzo szybko usunąć wszystkie wprowadzone, a jeszcze nie zacommitowane zmiany.
Poza tym zamiast ścieżki do pliku można wpisać kropkę:
git checkout -- .
Wykonanie tego polecenia usunie wszystkie wprowadzone przez Nas zmiany we wszystkich plikach. Kropka oznacza, że polecenie ma się wykonać dla wszystkich plików w tym katalogu i katalogach podrzędnych.
Usuwanie zmian?
Tak naprawdę git nie usuwa wprowadzonych przez Nas zmian, tylko bierze ten plik z repozytorium (z bieżącego brancha, z ostatniego commita) i dodaje go do stage’a, usuwając przy tym wszystkie zmiany znajdujące się w katalogu roboczym. Z racji tego, że po usunięciu zmian z katalogu roboczego wzięty plik jest identyczny co aktualny, git nie widzi żadnych różnic.
Użyte wcześniej polecenie:
git checkout -- User.cs
jest równoznaczne z poleceniem:
git checkout master -- User.cs
Gdzie w tym drugim poleceniu jawnie podajemy, że plik chcemy wziąć z brancha master.
Skoro można podać nazwę bracha, to można również wziąć plik z innego brancha. Taka operacja może być bardzo przydatna w paru sytuacjach.
Jeżeli można wpisać nazwę brancha, może można wpisać coś innego? Oczywiście. Można wpisać id commita i zostanie wzięta zmiana zrobiona w tym pliku, ale z commita podanego w poleceniu. To również może okazać się przydatne. Jak i kiedy? Przyjrzyjmy się poniższym przykładom.
Wzięcie pliku z innego brancha
Kiedy to może się przydać? Wtedy kiedy potrzebujemy mieć w naszym branchu kod z konkretnego pliku, a zmiany są na innym branchu i do tego zostały wrzucone do jednego commita wraz z innymi zmianami. W takim przypadku git cherry-pick Nam nie pomoże.
Zobaczmy to na przykładzie. Na branchu master mamy plik User.cs, który wygląda następująco:
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Na drugim branchu o nazwie user, już mamy ten kod zmieniony i wygląda on tak:
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public DateTime EntryDate { get; set; }
}
Jednak funkcjonalność nie jest całkowicie skończona, a my już potrzebujemy ten kod u Nas. Trochę głupi jest to przykład 🙂 , ale na potrzeby działania gita w zupełności wystarczy. Będąc na branchu master wpisujemy do konsoli:
git checkout user -- User.cs
I już zmiany są na naszym branchu:
Zobaczmy jeszcze diff:
Wygląda tak jakbyśmy sami dodali trzy linie w pliku.
Wzięcie pliku z commita
Składnia polecenia jest taka sama, tylko zamiast nazwy brancha podajemy id commita. Może być pierwszych kilka znaków np.:
git checkout 388bee7 -- User.cs
Kiedy to może się przydać? Kiedy nie możemy użyć git revert, bo w jednym commicie mamy więcej zmian. Id commita nie musi być z naszego brancha, może również być z innego.
Podsumowanie
W ten prosty sposób można wziąc kod pliku z innego brancha lub z nawet z konkretnego commita. Nie trzeba ręcznie kopiować, nie trzeba w żaden sposób kombinować. Ułatwia to znacznie przywracanie/usuwanie zmian w plikach.
Źródło:
https://pl.atlassian.com/git/tutorials/using-branches/git-checkout
https://pl.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
2 Komentarze
dotnetomaniak.pl · 30 grudnia 2018 o 12 h 43 min
git checkout – operacje na plikach – Tomasz Prasołek
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl
Git - wersja 2.22 - przegląd nowości - Poznaj Gita · 23 czerwca 2019 o 20 h 30 min
[…] się do jego zastosowania do plików i katalogów w naszym repozytorium. Opisywałem w poście git checkout – operacje na plikach. Jeśli nie wiesz do czego służy w kontekście z plikami, to najpierw się z nim […]