Różnica między GIT i CVS

126

Jaka jest różnica między systemami kontroli wersji Git i CVS?

Z radością używam CVS od ponad 10 lat, a teraz powiedziano mi, że Git jest znacznie lepszy. Czy ktoś mógłby wyjaśnić, jaka jest różnica między nimi i dlaczego jeden jest lepszy od drugiego?

sójka
źródło
1
Ta przemowa Linusa (oryginalnego autora git) w dużym stopniu to podsumowuje. Google Tech Talks: Linus Torvalds w Git Uwaga: wysoce uparta dyskusja.
kungfoo
cvs jest bardzo stary i nie mogę uwierzyć, że programista to potrafi.
PersianGulf
10
To pytanie zostało zadane ponad 8 lat temu. Obecnie używam GIT.
jay
6
Tylko dlatego, że coś jest stare, nie czyni tego złym.
Justin Meiners,

Odpowiedzi:

338

Główna różnica polega na tym, że (jak już powiedziano w innych odpowiedziach) CVS jest (starym) scentralizowanym systemem kontroli wersji, podczas gdy Git jest rozproszony.

Ale nawet jeśli używasz kontroli wersji dla jednego programisty, na jednym komputerze (jednym koncie), istnieje kilka różnic między Git i CVS:

  • Konfigurowanie repozytorium . Git przechowuje repozytorium w .gitkatalogu w głównym katalogu twojego projektu; CVS wymaga skonfigurowania CVSROOT, centralnego miejsca do przechowywania informacji o kontroli wersji dla różnych projektów (modułów). Konsekwencją tego projektu dla użytkownika jest to, że importowanie istniejących źródeł do kontroli wersji jest tak proste, jak „git init && git add. && git commit” w Git, podczas gdy jest bardziej skomplikowane w CVS.

  • Operacje atomowe . Ponieważ CVS na początku był zbiorem skryptów wokół systemu kontroli wersji RCS dla poszczególnych plików, zatwierdzenia (i inne operacje) nie są atomowe w CVS; jeśli operacja na repozytorium zostanie przerwana w środku, repozytorium może pozostać w niespójnym stanie. W Gicie wszystkie operacje są atomowe: albo kończą się sukcesem, albo kończą się niepowodzeniem bez żadnych zmian.

  • Zestawy zmian . Zmiany w CVS dotyczą każdego pliku, podczas gdy zmiany (zatwierdzenia) w Git zawsze dotyczą całego projektu. To bardzo ważna zmiana paradygmatu . Jedną z konsekwencji tego jest to, że w Git bardzo łatwo jest cofnąć (stworzyć zmianę, która cofa) lub cofnąć całą zmianę; Inną konsekwencją jest to, że w CVS można łatwo wykonać częściowe wyewidencjonowanie, podczas gdy obecnie jest to prawie niemożliwe w Git. Fakt, że zmiany dotyczą poszczególnych plików, zgrupowanych razem, doprowadził do wynalezienia formatu GNU Changelog dla komunikatów o zatwierdzeniach w CVS; Użytkownicy Gita używają (a niektóre narzędzia Git oczekują) innej konwencji, z jedną linią opisującą (podsumowującą) zmianę, po której następuje pusta linia, po której następuje bardziej szczegółowy opis zmian.

  • Nazewnictwo rewizji / numerów wersji . Jest jeszcze jeden problem związany z faktem, że zmiany w CVS dotyczą plików: numery wersji (jak czasem można zobaczyć w rozszerzaniu słów kluczowych , zobacz poniżej), np. 1.4, odzwierciedlają ile razy dany plik był zmieniany. W Gicie każda wersja projektu jako całości (każde zatwierdzenie) ma swoją unikalną nazwę nadaną przez identyfikator SHA-1; Zwykle do zidentyfikowania zatwierdzenia wystarczą pierwsze 7-8 znaków (nie można zastosować prostego schematu numerowania wersji w rozproszonym systemie kontroli wersji - wymaga to centralnego numerowania). W CVS aby mieć numer wersji lub nazwę symboliczną odnoszącą się do stanu projektu jako całości, używasz tagów ; to samo dotyczy Gita, jeśli chcesz używać nazw takich jak 'v1.5.6-rc2' dla niektórych wersja projektu ... ale tagi w Git są dużo łatwiejsze w użyciu.

  • Łatwe rozgałęzianie . Gałęzie w CVS są moim zdaniem zbyt skomplikowane i trudne w obsłudze. Musisz oznaczyć gałęzie, aby mieć nazwę dla całej gałęzi repozytorium (a nawet to może się nie udać w niektórych przypadkach, jeśli dobrze pamiętam, z powodu obsługi poszczególnych plików). Dodaj do tego fakt, że CVS nie ma śledzenia scalania , więc musisz albo zapamiętać, albo ręcznie oznaczać punkty scalania i rozgałęzienia, i ręcznie podawać poprawne informacje dla "cvs update -j", aby scalić gałęzie. niepotrzebne trudne w użyciu. W Gicie tworzenie i łączenie gałęzi jest bardzo łatwe; Git sam zapamiętuje wszystkie wymagane informacje (więc scalanie gałęzi jest tak proste, jak „git merge nazwa gałęzi ”) ... musiał, ponieważ rozwój rozproszony w naturalny sposób prowadzi do wielu gałęzi.

    Oznacza to, że możesz używać gałęzi tematycznych , tj. Opracowywać oddzielną funkcję w wielu krokach w oddzielnej gałęzi funkcji.

  • Zmień nazwę (i skopiuj) śledzenie . Zmiany nazw plików nie są obsługiwane w CVS, a ręczna zmiana nazwy może zepsuć historię na pół lub doprowadzić do nieprawidłowej historii, w której nie można poprawnie przywrócić stanu projektu przed zmianą nazwy. Git wykorzystuje heurystyczne wykrywanie zmian nazwy, oparte na podobieństwie zawartości i nazwy pliku (to rozwiązanie sprawdza się w praktyce). Możesz również zażądać wykrycia kopiowania plików. To znaczy że:

    • badając podany commit, dostaniesz informację, że jakiś plik został zmieniony,
    • scalanie poprawnie uwzględnia zmiany nazwy (np. jeśli plik został zmieniony tylko w jednej gałęzi)
    • „git blame”, (lepszy) odpowiednik „cvs annotate”, narzędzia do wyświetlania historii zawartości pliku w wierszach, może śledzić ruchy kodu również po zmianie nazwy
  • Pliki binarne . CVS ma bardzo ograniczone wsparcie dla plików binarnych (np. Obrazów), wymagając od użytkowników wyraźnego oznaczania plików binarnych podczas dodawania (lub później przy użyciu "cvs admin", lub poprzez wrappery, aby robić to automatycznie na podstawie nazwy pliku), aby uniknąć zniekształcenia plik binarny poprzez konwersję końca linii i rozszerzenie słów kluczowych. Git automatycznie wykrywa plik binarny na podstawie zawartości w ten sam sposób, w jaki robią to CNU diff i inne narzędzia; możesz nadpisać to wykrycie używając mechanizmu gitattributes. Ponadto pliki binarne są zabezpieczone przed nieodwracalnym zniekształceniem dzięki domyślnemu ustawieniu `` safecrlf '' (i faktowi, że musisz zażądać konwersji końca linii, chociaż może to być domyślnie włączone w zależności od dystrybucji) oraz temu (ograniczone) słowo kluczowe ekspansja to ścisłe „opt-in” w Git.

  • Rozszerzenie słów kluczowych . Git oferuje bardzo, bardzo ograniczony zestaw słów kluczowych w porównaniu z CVS (domyślnie). Wynika to z dwóch faktów: zmiany w Git dotyczą repozytorium, a nie pliku, a Git unika modyfikowania plików, które nie uległy zmianie podczas przełączania na inną gałąź lub przewijania do innego punktu w historii. Jeśli chcesz osadzić numer wersji za pomocą Gita, powinieneś to zrobić używając swojego systemu budowania, np. Zgodnie z przykładem skryptu GIT-VERSION-GEN w źródłach jądra Linuksa i źródłach Git.

  • Zobowiązania korygujące . Ponieważ w rozproszonym systemie VCS, takim jak Git, publikacja jest niezależna od tworzenia zatwierdzenia, można zmienić (edytować, przepisać) niepublikowaną część historii bez przeszkadzania innym użytkownikom. W szczególności, jeśli zauważysz literówkę (lub inny błąd) w komunikacie zatwierdzenia lub błąd w zatwierdzeniu, możesz po prostu użyć polecenia „git commit --amend”. Nie jest to możliwe (przynajmniej nie bez silnego włamania) w CVS.

  • Więcej narzędzi . Git oferuje znacznie więcej narzędzi niż CVS. Jedną z ważniejszych jest „ git bisect ”, której można użyć do znalezienia zatwierdzenia (poprawki), które wprowadziło błąd; jeśli twoje zatwierdzenia są małe i niezależne, powinno być dość łatwo wtedy odkryć, gdzie jest błąd.


Jeśli współpracujesz z co najmniej jednym innym deweloperem, zauważysz również następujące różnice między Git i CVS:

  • Zatwierdź przed scaleniem Git używa raczej zatwierdzenia przed scaleniem niż, jak CVS, scalenia przed zatwierdzeniem (lub zaktualizuj-potem-zatwierdzenie ). Jeśli podczas edytowania plików, przygotowań do stworzenia nowego zatwierdzenia (nowej rewizji), ktoś inny utworzył nowe zatwierdzenie w tej samej gałęzi i znajduje się on teraz w repozytorium, CVS zmusza cię do aktualizacji katalogu roboczego i rozwiązywania konfliktów przed zezwoleniem na zatwierdzenie. Tak nie jest w przypadku Git. Najpierw zatwierdzasz, zapisujesz stan w kontroli wersji, a następnie scalasz inne zmiany programisty. Możesz również poprosić innego programistę o scalenie i rozwiązanie konfliktów.

    Jeśli wolisz mieć historię liniową i unikać scalania, zawsze możesz użyć przepływu pracy zatwierdzania-łączenia- ponownego uruchamiania poprzez „git rebase” (i „git pull --rebase”), który jest podobny do CVS, ponieważ odtwarza zmiany zaktualizowanego stanu. Ale zawsze zobowiązujesz się pierwszy.

  • Nie ma potrzeby posiadania centralnego repozytorium Dzięki Git nie ma potrzeby posiadania jednego centralnego miejsca, w którym zatwierdzasz zmiany. Każdy programista może mieć swoje własne repozytorium (lub lepsze repozytoria: prywatne, w którym zajmuje się programowaniem, i publiczne, w którym publikuje gotową część) i może pobierać / pobierać z innych repozytoriów, w symetryczny fason. Z drugiej strony w przypadku większego projektu często występuje społecznie zdefiniowane / nominowane centralne repozytorium, z którego wszyscy czerpią (pobierają zmiany).


Wreszcie Git oferuje znacznie więcej możliwości, gdy potrzebna jest współpraca z dużą liczbą programistów. Poniżej znajdują się różnice między CVS w Git dla różnych etapów zainteresowania i pozycji w projekcie (pod kontrolą wersji przy użyciu CVS lub Git):

  • czai się . Jeśli jesteś zainteresowany tylko pobieraniem najnowszych zmian z projektu ( bez propagowania twoich zmian ) lub tworzeniem własnych programów (bez wnoszenia wkładu w oryginalne projekty); lub wykorzystujesz projekty zagraniczne jako podstawę własnego projektu (zmiany są lokalne i nie ma sensu ich publikować).

    Git obsługuje tutaj anonimowy, nieuwierzytelniony dostęp tylko do odczytu za pośrednictwem niestandardowego wydajnego git://protokołu lub jeśli jesteś za blokowaniem zapory DEFAULT_GIT_PORT(9418), możesz użyć zwykłego protokołu HTTP.

    Dla CVS najczęstszym rozwiązaniem (jak rozumiem) dla dostępu tylko do odczytu jest konto gościa dla protokołu „pserver” na CVS_AUTH_PORT(2401), zwykle nazywane „anonimowym” i z pustym hasłem. Poświadczenia są domyślnie przechowywane w $HOME/.cvspasspliku, więc musisz podać je tylko raz; nadal jest to trochę bariera (musisz znać nazwę konta gościa lub zwracać uwagę na wiadomości serwera CVS) i irytację.

  • programiści (twórca liści) . Jednym ze sposobów propagowania zmian w OSS jest wysyłanie poprawek pocztą elektroniczną . Jest to najczęstsze rozwiązanie, jeśli jesteś (mniej lub bardziej) przypadkowym programistą, wysyłając pojedynczą zmianę lub pojedynczą poprawkę błędu. BTW. wysyłanie poprawek może odbywać się przez komisję recenzentów (system recenzji poprawek) lub w podobny sposób, nie tylko pocztą elektroniczną.

    Git oferuje tutaj narzędzia, które pomagają w tym mechanizmie propagacji (publikowania) zarówno dla nadawcy (klienta), jak i dla opiekuna (serwer). Dla osób, które chcą wysyłać swoje zmiany e-mailem, istnieje narzędzie " git rebase " (lub "git pull --rebase") do odtwarzania własnych zmian na podstawie aktualnej wersji, więc zmiany są na górze aktualnej wersji (są świeże ) i „ git format-patch ” do tworzenia wiadomości e-mail z komunikatem zatwierdzenia (i autorstwa), zmiana w postaci (rozszerzonego) zunifikowanego formatu różnic (plus diffstat dla łatwiejszego przeglądu). Maintainer może przekształcić taki e-mail bezpośrednio w zatwierdzenie, zachowując wszystkie informacje (w tym komunikat o zatwierdzeniu) za pomocą polecenia „ git am ”.

    CVS nie oferuje takich narzędzi: możesz użyć "cvs diff" / "cvs rdiff" do generowania zmian i użyć łaty GNU do ich zastosowania, ale o ile wiem, nie ma sposobu na zautomatyzowanie stosowania komunikatu zatwierdzenia. CVS miał być używany w stylu klient <-> serwer ...

  • poruczniku . Jeśli jesteś opiekunem oddzielnej części projektu (podsystemu) lub jeśli rozwój twojego projektu przebiega zgodnie z przepływem pracy "sieci zaufania" używanym przy tworzeniu jądra Linuksa ... lub po prostu jeśli masz własne repozytorium publiczne, a zmiany to które chcesz opublikować są zbyt duże, aby wysłać je e-mailem jako serię poprawek , możesz wysłać żądanie ściągnięcia do (głównego) opiekuna projektu.

    Jest to rozwiązanie specyficzne dla rozproszonych systemów kontroli wersji, więc oczywiście CVS nie obsługuje takiego sposobu współpracy. Jest nawet narzędzie o nazwie „git request-pull”, które pomaga przygotować e-mail do wysłania do opiekuna z prośbą o pobranie z repozytorium. Dzięki „pakietowi git” możesz korzystać z tego mechanizmu nawet bez publicznego repozytorium, wysyłając pakiet zmian e-mailem lub przez sneakernet. Niektóre witryny hostingowe Git, takie jak GitHub , obsługują powiadamianie, że ktoś pracuje (opublikował jakąś pracę) nad Twoim projektem (pod warunkiem, że korzysta z tej samej witryny hostingowej Git), a także umożliwiają wysyłanie do PM typu żądania ściągnięcia.

  • główny programista , czyli ktoś, kto bezpośrednio publikuje swoje zmiany (w repozytorium głównym / kanonicznym). Ta kategoria jest szersza dla rozproszonych systemów kontroli wersji, ponieważ posiadanie wielu programistów z dostępem do zapisu w centralnym repozytorium to nie tylko możliwy przepływ pracy (możesz mieć jednego opiekuna, który wypycha zmiany do repozytorium kanonicznego, zestawu poruczników / opiekunów podsystemów, z których on / ona pulls i szeroka gama deweloperów-liści, którzy wysyłają łaty pocztą albo do opiekunów / listy mailingowej projektu, albo do jednego z poruczników / podrzędnych opiekunów).

    Dzięki Git możesz używać protokołu SSH ( protokół git zawinięty w SSH) do publikowania zmian, z narzędziami takimi jak „git shell” (w celu zwiększenia bezpieczeństwa, ograniczenia dostępu do kont powłoki) lub Gitosis (w celu zarządzania dostępem bez konieczności posiadania oddzielnych kont powłoki ) i HTTPS z WebDAV ze zwykłym uwierzytelnianiem HTTP.

    W CVS istnieje możliwość wyboru między niestandardowym nieszyfrowanym (zwykłym tekstem) pserver protokołem lub użyciem zdalnej powłoki (gdzie naprawdę powinieneś używać SSH ) do publikowania zmian, co w przypadku scentralizowanego systemu kontroli wersji oznacza zatwierdzanie zmian (tworzenie zatwierdzeń). Cóż, możesz również tunelować protokół „pserver” za pomocą SSH, a istnieją narzędzia innych firm, które to automatyzują… ale nie sądzę, aby było to tak proste, jak np. Gitosis.

Ogólnie rozproszone systemy kontroli wersji, takie jak Git, zapewniają znacznie szerszy wybór możliwych przepływów pracy. W przypadku scentralizowanych systemów kontroli wersji, takich jak CVS, z konieczności musisz rozróżniać osoby z dostępem do repozytorium przez zatwierdzanie, a tymi, którzy nie mają ... zatwierdzić dostęp.

Karl Fogel w Producing Open Source Software w sekcji dotyczącej kontroli wersji stwierdza, że ​​lepiej nie zapewniać zbyt ścisłej, sztywnej i rygorystycznej kontroli w obszarach, w których wolno dokonywać zmian w repozytorium publicznym; znacznie lepiej jest polegać (w tym celu) na ograniczeniach społecznych (takich jak przegląd kodu) niż na ograniczeniach technicznych; rozproszone systemy kontroli wersji jeszcze bardziej redukują IMHO ...

HTH (nadzieja, która pomaga)

Jakub Narębski
źródło
3
Jakub jest wymieniony jako jeden z pięciu moich autorów GIT, stąd wyczerpująca odpowiedź. Gdyby prawa rządzące światem były łatwe, tylko cztery osoby byłyby w stanie odpowiedzieć lepiej;)
samuil
1
@samuil: Nie jestem jednym z autorów Gita. Liczba zatwierdzeń to nie wszystko. Działam głównie w obszarze gitweb (interfejs webowy git).
Jakub Narębski
1
Pytałem o tabelę porównawczą między CVS i GIT, ale ta odpowiedź jest o wiele lepsza. +1 za to! :) Jest jeszcze jeden przydatny artykuł, który mam nadzieję wykorzystać jako punkt odniesienia ( thinkvitamin.com/code/… ), chociaż nie jest tak dobry, jak ta odpowiedź. :)
Android Eve
4

Git to DVCS , w przeciwieństwie do CVS będącego scentralizowanym. Uproszczony opis będzie następujący: uzyskasz wszystkie korzyści z kontroli wersji, gdy nie masz połączenia z żadnym z wielu możliwych repozytoriów, a operacje są szybsze.

Anton Gogolev
źródło
4

Witryna Git prawdopodobnie najlepiej to wyjaśnia.

Funkcja mojego zwierzaka może wykonywać polecenia w trybie offline. I prędkość, niesamowita prędkość, z jaką dzieje się wszystko oprócz pchania i ciągnięcia. (A te operacje są z założenia nieniszczące, więc możesz pchać / ciągnąć, kiedy idziesz na kawę, jeśli twoje centralne repozytorium jest opóźnione.) Kolejną fajną rzeczą jest to, że zawiera baterie: wbudowana gitkjest wystarczająco dobra przeglądarka historii; git guijest wystarczająco dobrym narzędziem do zatwierdzania; z wyjściem koloryzacji, git add -i, git add -p, git rebase -isą wystarczająco dobre interaktywne interfejsy; git daemoni git instawebsą wystarczająco dobre do współpracy ad hoc, jeśli nie chcesz / nie możesz bawić się swoim centralnym repozytorium.

millimoose
źródło
3

Jestem również szczęśliwym użytkownikiem cvs od ponad 10 lat, chociaż lubię też git iz czasem zacznę go preferować, chociaż większość projektów, nad którymi pracuję, używa obecnie cvs lub svn i nie wydaje się żeby biurokracja, w której pracuję, była przekonana, że ​​pozwoli nam przebić się przez zaporę ogniową.

Kilka rzeczy, które sprawiają, że cvs są ładniejsze niż mogłyby być w innym przypadku, to cvsp, a inna to skrypty łatek Andrew Mortona lub quilt. Cvsps pozwala na odtworzenie wielu plików zatwierdzenia w pojedynczą łatkę (a tym samym wyodrębnienie "zestawów zmian" z CVS) podczas quiltowania, a skrypty łatek Andrew Mortona pozwalają na wprowadzanie rozsądnych "zestawów zmian" do cv w dość łatwy i wygodny sposób, pozwalając na pracuj nad wieloma rzeczami jednocześnie, zachowując je rozdzielone przed wykonaniem. CVS ma swoje dziwactwa, ale do większości z nich jestem przyzwyczajony.

smcameron
źródło
2

„szczęśliwie korzystam z CVS od ponad x lat”, to ciekawy pomysł :-) To ogromny krok naprzód w stosunku do utrzymania dużej liczby kopii, ale ...

Domyślam się, że przyzwyczaiłeś się do wszystkich dziwactw lub nie wykonujesz zbyt wiele rozgałęziania i łączenia. Jest gorsza możliwość;

Osoby w Twojej organizacji przyzwyczaiły się do ograniczeń CVS, a Twoja praktyka pracy odpowiednio się dostosowała;

na przykład nigdy więcej niż jeden programista nie pracuje nad jednym pakietem na raz, używając tylko rozgałęzień w sytuacjach awaryjnych itp.

Podstawową zasadą jest to, że im coś jest trudniejsze, tym mniej ludzi to robi.

Chris Huang-Leaver
źródło