Omówienie uproszczenia historii usługi Git

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Uproszczenie historii git może być mylące bestii. 99% czasu nawet nie wiadomo, że istnieje, ale od czasu do czasu wyskoczy z ciemnych zakątków Git i gryzie Cię. W tym artykule dowiemy się, jakie jest uproszczenie historii i jak może to spowodować zamieszanie podczas przeglądania historii plików.

Zacznijmy od typowego scenariusza:

  1. Wypchniesz zmianę do pliku, a następnie scalisz zmianę z gałęzią main.
  2. Niektórzy współpracownicy scalają również swoje gałęzie z gałęziami głównymi.
  3. Wróć trochę czasu później i zauważysz, że brakuje zmian.
  4. Szukasz winowajcy, przyjrzysz się historii plików i zwróć uwagę... twoje zmiany nie są nawet wymienione!?

Historia zatwierdzń usługi Git to drzewo. Czasami historia chronologiczna nie jest taka sama jak rzeczywista historia drzewa plików. Taka sytuacja występuje najczęściej, gdy zatwierdzenie scalania przywraca plik z powrotem do pierwotnego stanu. W takim przypadku domyślny widok historii nie będzie pokazywał wszystkich zmian, ponieważ technicznie plik nie uległ zmianie. W tym scenariuszu usługa Git zdaje sobie sprawę, że może uprościć historię, a "zmiany", których najprawdopodobniej szukasz, zostaną usunięte z dziennika.

Jeśli nie wpadłeś do niego wcześniej, możesz stać się sfrustrowany, zastanawiając się, gdzie choleka nie moje zmiany idą?

Uproszczenie historii: domyślnie włączone

Domyślnie uruchomienie polecenia dziennika w pliku: git log file.txt spowoduje automatyczne uproszczenie historii, prawdopodobnie ukrycie niektórych zatwierdzeń z danych wyjściowych. Aby uzyskać więcej informacji, zobacz stronę man man usługi Git.

Co dodaje pomyłek polega na tym, że uproszczenie historii nie występuje, jeśli po prostu uruchomisz git logpolecenie , ponieważ patrzysz na wszystkie zmiany, nie ma nic do uproszczenia.

Aby wyłączyć uproszczenie historii, należy użyć przełącznika --full-historywiersza polecenia .

Przykład uproszczenia historii

Aby lepiej zrozumieć, jak działa uproszczenie, tworzymy własny przykład uproszczenia historii. Najpierw przyjrzyjmy się diagramowi historii, który utworzymy:

Gałęzie usługi Git

Jak widać, będziemy wykonywać następujące czynności:

  1. Utwórz plik .
  2. Dodaj wiersz do tego pliku w gałęzi (zwierzęta).
  3. Dodaj inny wiersz do tego pliku w innej gałęzi (owoce).
  4. Scal zwierzęta rozgałęziania z powrotem z gałęzią główną.
  5. Scal owoce gałęzi z powrotem do gałęzi głównej i wybierz całą kopię pliku z gałęzi owocowej.
  6. Sprawdź historię pliku.

Usługa Git uprości historię. Krok 5 jest kluczem tutaj. Zignorowaliśmy wszystkie zmiany z gałęzi zwierzęcej. Usługa Git zauważy, że nasz plik zasadniczo nie zmienił się między krokiem 1 a krokiem 5, dlatego pokaże nam tylko dwa wpisy historii.

Najpierw utworzymy plik i dodamy go do naszego repozytorium:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Teraz decydujemy się dołączyć tekst "osiołki" do pliku w gałęzi zwierzę:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Podczas eksperymentowania decydujemy, że zamiast tego chcemy iść z owocami w naszym pliku, więc tworzymy inną gałąź i dołączamy tekst "banany" na końcu pliku:

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Czując się zadowolony z naszych zmian, decydujemy się scalić naszą gałąź zwierząt z powrotem do gałęzi głównej:

> git checkout main
> git merge animals

Teraz przyjrzyjmy się dziennikowi dla naszego test.txt pliku:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Do tej pory tak dobre, prawda? Nic nie wygląda na zwykły w naszych danych wyjściowych dziennika. Teraz powiedzmy, że zmieniliśmy zdanie i postanowiliśmy scalić naszą gałąź owocowa:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Uh-oh, konflikt scalania. Po rozważeniu decydujemy się na użycie całego test.txt pliku z naszej gałęzi owocowej. Zazwyczaj należy użyć pewnego rodzaju edytora tekstów lub narzędzia scalania, ale po prostu utworzymy ponownie cały plik, ponieważ jest to tylko dwa wiersze:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Teraz przyjrzyjmy się historii naszego test.txt pliku:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Na pewno nie widzimy żadnych zmian z naszego pierwszego eksperymentu w dzienniku ani nie widzimy naszego scalania. Czy nadal tam są? Czy usługa Git całkowicie wyeliminowała zmiany?

> git log --full-history test.txt

Jak widać, chociaż uprościł dziennik bez full-history flagi, usługa Git zachowała wszystkie nasze zmiany:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Podsumowanie uproszczenia historii usługi Git

Chodzi o uproszczenie historii, że przez większość czasu nigdy tego nie zauważysz. Ale gdy konflikt scalania pójdzie nie tak i chcesz wiedzieć, co się stało, możesz zapoznać się z historią dziennika usługi Git i zastanawiać się, gdzie nastąpiły zmiany.

Teraz zamiast panikować, wiesz, że:

  • Uproszczenie historii dla plików jest domyślnie włączone
  • Flaga --full-history zapewnia bardziej kompleksową historię plików

Aktualizacja: Odkąd napisałem ten artykuł, usługa Azure DevOps Services wprowadziła szereg wspaniałych opcji wyświetlania historii w Internecie. Oznacza to, że jeśli nie chcesz logować się za pośrednictwem wiersza polecenia, możesz po prostu ściągnąć plik, dla którego chcesz wyświetlić historię w naszym Eksploratorze, a następnie wyświetlisz poniższy filtr historii, w którym można określić proste lub nie proste widoki historii:

Filtry git

c) 2016 Microsoft Corporation. Wszelkie prawa zastrzeżone. Ten dokument jest dostarczany "zgodnie z rzeczywistymi elementami". Informacje i widoki wyrażone w tym dokumencie, w tym adres URL i inne odwołania do witryn internetowych, mogą ulec zmianie bez powiadomienia. Ryzyko korzystania z niniejszego dokumentu ponosi użytkownik.

Na mocy niniejszego dokumentu użytkownik nie uzyskuje jakichkolwiek praw do własności intelektualnej zawartej w jakimkolwiek produkcie firmy Microsoft. Dozwolone jest kopiowanie niniejszego dokumentu i korzystanie z niego do własnych celów pomocniczych.