git checkout – operacje na plikach

Opublikowane przez Tomasz Prasołek w dniu

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:

git checkout file 001

Zobaczmy jeszcze diff:

git checkout file 002

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 […]

Dodaj komentarz

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