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:
- Wypchniesz zmianę do pliku, a następnie scalisz zmianę z gałęzią main.
- Niektórzy współpracownicy scalają również swoje gałęzie z gałęziami głównymi.
- Wróć trochę czasu później i zauważysz, że brakuje zmian.
- 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 log
polecenie , ponieważ patrzysz na wszystkie zmiany, nie ma nic do uproszczenia.
Aby wyłączyć uproszczenie historii, należy użyć przełącznika --full-history
wiersza 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:
Jak widać, będziemy wykonywać następujące czynności:
- Utwórz plik .
- Dodaj wiersz do tego pliku w gałęzi (zwierzęta).
- Dodaj inny wiersz do tego pliku w innej gałęzi (owoce).
- Scal zwierzęta rozgałęziania z powrotem z gałęzią główną.
- Scal owoce gałęzi z powrotem do gałęzi głównej i wybierz całą kopię pliku z gałęzi owocowej.
- 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:
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.