Elastyczne i statyczne rozgałęzianie (Git vs Clearcase/Accurev)

Moje pytanie dotyczy sposobu, w jaki Git obsługuje gałęzie: ilekroć rozgałęzisz się z commita, ta gałąź nigdy nie otrzyma zmian z gałęzi nadrzędnej, chyba że wymusisz jej połączenie.

Ale w innych systemach, takich jak Clearcase lub Accurev, możesz określić, w jaki sposób gałęzie mają być wypełnione jakimś mechanizmem dziedziczenia : chodzi mi o to, że z Clearcase, używając config_spec, możesz powiedzieć " get all the files modified on branch/main / issue001 and then continue with te na / main lub z tym konkretnym punktem odniesienia".

W Accurev masz również podobny mechanizm, który pozwala strumieniom odbierać zmiany z górnych gałęzi (strumienie jak je nazywają) bez łączenia lub tworzenia nowego commita na gałęzi.

Nie brakuje ci tego podczas korzystania z Gita? Czy możesz wyliczyć scenariusze, w których to dziedziczenie jest koniecznością?

Thanks

Update proszę przeczytać odpowiedź VonC poniżej, aby skupić się na moim pytaniu. / Align = "left" / linear storage " i SCM oparte na DAG mają różne możliwości, moje pytanie brzmi: jakie są realne scenariusze życia (zwłaszcza dla firm bardziej niż OSS), w których linear może zrobić rzeczy niemożliwe dla DAG? Są warte?

Author: phi, 2009-04-18

9 answers

Aby zrozumieć, dlaczego Git nie oferuje jakiegoś rodzaju "mechanizmu dziedziczenia" (nie obejmującego commit), musisz najpierw zrozumieć jeden z podstawowe pojęcia z tych SCM (na przykład Git vs. ClearCase)

  • ClearCase używa linear version storage : każda wersja elementu (pliku lub katalogu) jest powiązana w bezpośredniej relacji linear z poprzednią wersją tego samego element.

  • Git używa grafu acyklicznego skierowanego DAG - : każda" wersja " pliku jest w rzeczywistości częścią globalnego zestawu zmian w drzewie, które samo w sobie jest częścią commita. Poprzednia wersja musi znaleźć się w poprzednim zatwierdzeniu, dostępnym za pomocą pojedynczej ukierunkowanej ścieżki grafu acyklicznego.

W systemie liniowym, Specyfikacja konfiguracyjna może określić kilka zasad osiągnięcia" dziedziczenia", które widzisz (dla danego pliku najpierw wybierz Wersja, a jeśli nie jest obecna, wybierz inną wersję, a jeśli nie jest obecna, wybierz trzecią i tak dalej).

Gałąź jest widełkiem w linear historia danej wersji dla danej reguły select (wszystkie pozostałe reguły select przed tą regułą nadal obowiązują, stąd efekt "dziedziczenia")

W DAG, commit reprezentuje całe "dziedzictwo" jakie kiedykolwiek otrzymasz; nie ma "kumulacyjnego" wyboru wersji. Jest tylko jedna ścieżka w tym wykresie, aby wybrać wszystkie pliki, które zobaczysz dokładnie w tym momencie (commit).
Gałąź jest tylko nową ścieżką w tym wykresie.

Aby zastosować, w Git, niektóre inne wersje, musisz:

Ale ponieważ Git jest SCM opartym na DAG, zawsze spowoduje utworzenie nowego commita.

Co "tracisz" z Gitem jest to rodzaj "kompozycji" (kiedy wybieramy różne wersje z różnymi kolejnymi regułami select), ale nie byłoby to praktyczne wD VCS (jak w "Distributed"): kiedy tworzymy gałąź z Gitem, musisz to zrobić z punktem wyjścia i treścią jasno zdefiniowaną i łatwą replikacją do innych repozytoriów.

W czysto centralnym VCS, możesz zdefiniować swój obszar roboczy (w ClearCase, twój "widok", migawka lub dynamiczny) z dowolnymi regułami chcesz.


Nieznany-google dodaje w komentarzu (i w pytaniu powyżej):

Więc, kiedy zobaczymy, że dwa modele mogą osiągnąć różne rzeczy (linear vs DAG), moje pytanie brzmi: Jakie są realne scenariusze życia (szczególnie dla firm bardziej niż OSS), gdzie linear może zrobić rzeczy nie możliwe dla DAG? Czy są tego warci?

Jeśli chodzi o "realny scenariusz" w odniesieniu do reguł wyboru, to co można zrobić w modelu liniowym to mieć kilka zasad wyboru dla tego samego zestawu plików.

Rozważ tę "specyfikację konfiguracji " (tj." specyfikację konfiguracji " dla reguł wyboru z ClearCase):

element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... aLabel2 -mkbranch myNewBranch

Wybiera wszystkie pliki oznaczone ' aLabel2 '(i gałąź stamtąd), z wyjątkiem tych oznaczonych ' aLabel3' - i gałąź stamtąd - (ponieważ ta reguła poprzedza wspomnianą ' aLabel2').

Czy warto? Nie.

Właściwie, smak UCM ClearCase (the "ujednolicone zarządzanie konfiguracją" metoda dołączona do produktu ClearCase i reprezentująca wszystkie "najlepsze praktyki" wydedukowane z podstawowego użycia ClearCase) nie pozwala na to, z powodów simplificity . Zbiór plików jest nazywany "komponentem" i jeśli chcesz rozgałęziać dla danej etykiety( znanej jako" linia bazowa"), zostanie przetłumaczony w następujący sposób:]}

element /aPath/... .../myNewBranch
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... /main/0 -mkbranch myNewBranch

Musisz wybrać jeden punkt startowy (tutaj "aLabel3") i idź stamtąd. Jeśli chcesz również pliki z ' aLabel2', wykonasz scalenie ze wszystkich plików' aLabel2 'do plików w 'myNewBranch'.

Jest to "uproszczenie", którego nie trzeba robić za pomocą DAG, gdzie każdy węzeł wykresu reprezentuje jednoznacznie zdefiniowany" punkt startowy " dla gałęzi, niezależnie od tego, jaki jest zestaw plików.

Merge i rebase wystarczą, aby połączyć ten punkt startowy z innymi wersjami danego zestawu plików, aby osiągnąć pożądany "kompozycja", zachowując tę konkretną historię w izolacji w gałęzi.

Celem ogólnym jest rozumowanie w "koherentne operacje kontroli wersji stosowane do komponentu koherentne ". "Spójny" zbiór plików jest jednym w dobrze zdefiniowanym stanie koherentnym:

  • jeśli są oznaczone, wszystkie jego pliki są oznaczone
  • if branched, all its files will branched from same unique starting punkt

Jest to łatwe w systemie DAG; może być trudniejsze w systemie liniowym (szczególnie w przypadku "Base ClearCase", gdzie" Config spec " może być trudne), ale jest egzekwowane za pomocą metodologii UCM tego samego narzędzia liniowego.

Zamiast osiągnąć tę "kompozycję" poprzez " prywatną sztuczkę z regułami wyboru "(ClearCase, niektóre reguły wyboru), można ją osiągnąć tylko za pomocą operacji VCS (rebase lub merge), które pozostawiają wyraźny ślad dla wszystkich (w przeciwieństwie do konfiguracji prywatnej dla dewelopera lub udostępnianej przez niektórych, ale nie wszystkich deweloperów). Ponownie, wymusza zmysły spójności, w przeciwieństwie do "dynamicznej elastyczności", która może być trudna do odtworzenia później.

To pozwala na opuszczenie sfery VCS (system kontroli wersji) i wejście do sfery SCM (Zarządzanie konfiguracją oprogramowania) , która dotyczy głównie " odtwarzalności". I to (Funkcje SCM) mogą być osiągnięte za pomocą liniowego lub opartego na DAG VCS.

 30
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:02

Wygląda na to, że to, czego szukasz, może być git rebase. Zmiana rozmiaru gałęzi koncepcyjnie odłącza ją od pierwotnego punktu gałęzi i ponownie dołącza w innym punkcie. (W rzeczywistości rebase jest zaimplementowany poprzez nałożenie każdej łaty gałęzi w kolejności do nowego punktu gałęzi, tworząc nowy zestaw łat.) W twoim przykładzie, możesz zmienić nazwę gałęzi na bieżącą końcówkę górnej gałęzi, która zasadniczo "odziedziczy" wszystkie zmiany wprowadzone do drugiej gałęzi.

 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-18 08:06:42

Nie do końca rozumiem, o co prosisz, ale brzmi to jak git ' s śledzenie semantyki jest tym, czego chcesz. Kiedy oddzielisz się od am origin możesz zrobić coś takiego:

Git - T-b my_branch origin / master

I wtedy przyszłe "git pull" s automatycznie Scali origin / master do twojego oddział roboczy. Możesz użyć "Git cherry-V origin / master", aby zobaczyć co za różnica. Możesz użyć "Git rebase" przed opublikowaniem swojego zmiany w celu oczyszczenia historii, ale nie należy używać rebase once Twoja historia jest publiczna(tzn. inne osoby podążają za tą gałęzią).

 3
Author: stsquad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-18 10:31:49

Jeśli chodzi o schemat dziedziczenia używany przez accurev: użytkownicy GIT prawdopodobnie "dostaną" całość, gdy spojrzysz na git-flow (Zobacz także: http://github.com/nvie/gitflow i http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/)

[[0]}Ten model rozgałęziania GIT mniej więcej robi (ręcznie / przy pomocy narzędzia Git-flow) to, co accurev robi automatycznie po wyjęciu z pudełka i z wielką obsługą GUI.

Więc wydaje się GIT może rób to, co robi accurev. Ponieważ nigdy nie korzystałem z git/git-flow na co dzień, nie mogę powiedzieć, jak to działa, ale wygląda obiecująco. (Minus odpowiednia obsługa GUI: -)

 2
Author: Martin Ba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-10 13:58:42

Postaram się odpowiedzieć na pytanie. (Muszę tu powiedzieć, że nie używałem GIT tylko przeczytać o tym, więc jeśli coś, o czym wspomniałem poniżej jest źle, proszę mnie poprawić)

"Czy możesz wyliczyć scenariusze, w których to dziedziczenie jest koniecznością?"

Nie powiem, że jest to konieczne, ponieważ możesz rozwiązać problem z narzędziem, które posiadasz, i może być poprawnym rozwiązaniem dla Twojego środowiska. Myślę, że to bardziej kwestia procesów niż samego narzędzia. Upewnienie się, że proces jest spójny, a także pozwala cofnąć się w czasie, aby odtworzyć każdy pośredni krok / stan jest celem, a plusem jest to, że narzędzie pozwala uruchomić proces i SCMP tak bezbolesnie, jak to możliwe

Jedyny scenariusz, jaki widzę, jest przydatny, aby mieć to 'dziedziczenie' zachowanie i używać mocy specyfikacji konfiguracyjnej, jest wtedy, gdy chcesz, aby twój zestaw zmian "izolowany " zmapowany do zadania (devtask, CR, SR, lub cokolwiek definiuje cel/zakres Twojego zestawu zmian)

Za pomocą ta kompozycja pozwala na to, aby Twoja gałąź programistyczna była czysta i nadal używała innej kombinacji (używając kompozycji) reszty kodu, i nadal tylko to, co jest istotne dla zadania izolowane w gałęzi podczas całego cyklu życia zadania, aż do fazy integracji.

Będąc purystą, musisz commit/merge/rebase tylko po to, aby mieć "zdefiniowany punkt początkowy", myślę, że 'zanieczyszczą ' Twoją gałąź i skończysz z Twoim zmiany + inne zmiany w Twojej gałęzi / zestawie zmian.

Kiedy / gdzie ta izolacja jest przydatna? Poniższe punkty mogą mieć sens tylko w kontekście firm realizujących CMM i niektórych certyfikatów ISO, i mogą nie być interesujące dla innych rodzajów firm lub OSS

  • Będąc naprawdę wybrednym, możesz chcieć dokładnie policzyć wiersze kodu (dodane/zmodyfikowane/usunięte) zestawu zmian odpowiadającego pojedynczemu programiście, później używanemu jako jedno wejście dla kodu i wysiłku szacunki.

  • Kod może być łatwiejszy do przejrzenia na różnych etapach, mając tylko kod w jednej gałęzi (nie przyklejony z innymi zmianami)

W dużych projektach z kilkoma zespołami i + 500 deweloperów aktywnie pracujących jednocześnie na tym samym kodzie bazowym, (gdzie graficzne pojedyncze drzewa wersji elementów wygląda jak bałagan splątane sieci z kilku linii obciążenia, jeden dla każdego dużego klienta, lub po jednym dla każdej technologii) kilka stopni głębokości sprawiło, że ta ilość ludzi pracuje płynnie, aby dostosować ten sam produkt / system (kod podstawowy) do różnych celów. Korzystając z tej specyfikacji konfiguracyjnej, dynamicznie dało każdemu zespołowi lub zespołowi podrzędnemu inny widok na to, czego potrzebują i skąd muszą się rozgałęziać (kaskadowo w kilku przypadkach) bez potrzeby tworzenia pośrednich gałęzi integracyjnych lub ciągłego łączenia i rebasowania wszystkich bitów, od których musisz zacząć. Kod z tego samego zadania/celu był rozgałęzieniem różne etykiety, ale miały sens. (Można tu argumentować "znaną linię bazową" jako zasadę SCM, ale proste etykiety rozważane w pisemnym planie SCM wykonały pracę) Musi być możliwe rozwiązanie tego za pomocą Gita (chyba w sposób nie dynamiczny), ale naprawdę trudno mi sobie wyobrazić bez tego zachowania 'dziedziczenia'. Myślę, że punkt wspomniany przez VonC "jeśli rozgałęziony, wszystkie jego pliki będą rozgałęziać się z tego samego unikalnego punktu początkowego" został tutaj złamany, ale poza tym był dobrze udokumentowany na SCMP, I pamiętaj, że były mocne powody biznesowe, aby to zrobić w ten sposób.

Tak budowanie tych specyfikacji config, o których wspomniałem powyżej, nie było darmowe, na początku tam, gdzie 4-5 dobrze płatnych ludzi za SCM, ale zostały później zredukowane przez zautomatyzowane skrypty, które zapytały Cię, co chcesz na warunkach etykiet / gałęzi / funkcji i napisze CS dla Ciebie.

Odtwarzalność tutaj została osiągnięta poprzez zapisanie specyfikacji Config wraz z zadaniem w systemie devTask, więc każde zadanie przed mapowane do wymagań, a następnie mapowane do specyfikacji config, zestawu zmian (pliki kodu, dokumenty projektowe, dokumenty testowe itp.)

Więc do tego tutaj jeden wniosek może być, tylko jeśli twój projekt jest wystarczająco duży/skomplikowany (i możesz sobie pozwolić na SC Managerów przez całe życie projektu:)) wtedy dopiero zaczniesz myśleć, czy potrzebujesz zachowania "dziedziczenia" lub naprawdę wszechstronnego narzędzia, w przeciwnym razie przejdziesz bezpośrednio do narzędzia, które jest darmowe i już dbasz o spójność of you SCM ... ale mogą być inne czynniki na narzędziu SCM, które mogą sprawić, że będziesz trzymać się jednego lub drugiego ...Czytaj dalej..

Niektóre uwagi poboczne, które mogą być Poza tematem, ale myślę, że w niektórych przypadkach, takich jak mój, należy wziąć pod uwagę.

Muszę tu dodać, że używamy "good-ol CC", a nie UCM. Całkowicie zgadzam się z VonC w sprawie dobra metodologia pozwala "kierować" elastyczność w kierunku bardziej spójnej konfiguracji. Dobrą rzeczą jest to, że CC jest dość elastyczny i można znajdź (nie bez wysiłku) dobry sposób, aby mieć coś spójnego, podczas gdy w innych SCM możesz mieć to za darmo. Ale na przykład tutaj (i w innych miejscach, w których pracowałem z CC) dla projektów C/C++ nie możemy sobie pozwolić na cenę braku funkcji winkin (ponownego użycia obiektów Derive), które skracają kilka X razy czas kompilacji. Można argumentować, że posiadanie lepszego projektu, bardziej odsprzęgniętego kodu i optymalizacja plików Makefile może zmniejszyć potrzebę kompilacji całości, ale są przypadki, które trzeba skompilować całą bestię wiele razy dziennie,a dzielenie się DO oszczędza mnóstwo czasu / pieniędzy. Gdzie teraz jestem staramy się używać jak najwięcej darmowych narzędzi, jak to tylko możliwe, i myślę, że pozbędziemy się CC, jeśli znajdziemy tańsze lub darmowe narzędzie, które implementuje funkcję winkin .

Skończę z czymś, o czym wspomina Paweł, różne narzędzia są lepsze niż inne do różnych celów ale dodam, że można uciec od pewnych ograniczeń narzędzia, mając spójny proces i bez bliznowacenia powtarzalności, kluczowe punkty poza SCM W końcu chyba odpowiedź na jest warta? zależy od Twojego "problemu", używanego SDLC, procesów SCM i czy jest jakaś dodatkowa funkcja (jak winkin), która może być przydatna w Twoim środowisku.

Moje 2 centy

 2
Author: FedeN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-18 23:18:52

Pomijając teorię, oto rodzaj oczywistego praktycznego podejścia do tego, z mojego punktu widzenia przy użyciu AccuRev w komercyjnym środowisku produkcyjnym przez wiele lat: model dziedziczenia działa bardzo dobrze, dopóki strumienie dzieci nie odbiegają zbytnio od przodków, które są nadal w rozwoju. Rozkłada się, gdy dziedziczące strumienie są zbyt różne.

Dziedziczenie (późniejsze wersje jako Dzieci wcześniejszych) pozwala na aktywację zmian w strumieniach przodków w strumieniach potomnych nikt nie robi nic (chyba że połączenie jest wymagane, w którym to przypadku pokazuje się jako głębokie nakładanie, co jest dobre, aby móc zobaczyć).

To brzmi świetnie, a w praktyce tak jest, gdy wszystkie strumienie są stosunkowo podobne. Używamy tego modelu dla strumieni z poprawkami i service pack poniżej danej wersji produkcyjnej. (Jest to dla nas trochę bardziej skomplikowane, ale taka jest ogólna idea.)

Wydania produkcyjne są równolegle, bez dziedziczenia, z tymi hotfix i service pack poniżej każdego z nich. Uruchomienie nowej wersji oznacza utworzenie nowego strumienia na poziomie wydania i ręczne przepchnięcie do niego wszystkiego z najnowszego strumienia konserwacji dla poprzedniego wydania. Następnie zmiany we wcześniejszych wydaniach, które odnoszą się do późniejszych, muszą być ręcznie wepchnięte do każdej z nich, wymagając więcej pracy, ale pozwalając na znacznie większą kontrolę.

Początkowo używaliśmy modelu dziedziczenia we wszystkich wydaniach, gdzie późniejsze były dziećmi wcześniejsze. To działało dobrze przez jakiś czas, ale z czasem stało się niewykonalne. Duże różnice architektoniczne między wydaniami sprawiły, że nieuniknione dziedziczenie zmian było złym pomysłem. Tak, możesz wstawić migawkę pomiędzy, aby zablokować dziedziczenie, ale wtedy wszystkie zmiany muszą być popychane ręcznie, a jedyną rzeczywistą różnicą między strumieniem rodzic-migawka-dziecko a równoległymi, nie dziedziczącymi strumieniami jest to, że cały graficzny widok strumienia nieustannie przesuwa się w dół i w prawo, co jest PITA.

One really dobrą rzeczą w AccuRev jest to, że masz ten wybór, cały czas. Nie jest to nieodłączne ograniczenie architektury Twojego programu SCM.

 2
Author: enigment,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 13:35:30

Czy zauważyłeś, że możesz również zamawiać specfific file version z GIT?

Po prostu użyj tego:

git checkout [< tree-ish >] [--] < paths >

Jak w specyfikacji config każda istniejąca Wersja pliku (ścieżki) może być załadowana do obszaru roboczego. Cytat z git-checkout docs:

Następująca sekwencja sprawdza gałąź master, zwraca plik Makefile do dwóch wersji z powrotem, usuwa hello.c przez pomyłkę i pobiera go z indeksu:

$ git checkout master             
$ git checkout master~2 Makefile             
$ rm -f hello.c            
$ git checkout hello.c            
 2
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-07 15:22:26

ClearCase, bez MultiSite, jest pojedynczym repozytorium, ale Git jest rozproszony. ClearCase zatwierdza na poziomie pliku, ale Git zatwierdza na poziomie repozytorium. (Ta ostatnia różnica oznacza, że pierwotne pytanie jest oparte na nieporozumieniu, jak wskazano w innych postach tutaj.)

Jeśli są to różnice, o których mówimy, to myślę, że 'linear' versus ' DAG ' jest mylącym sposobem odróżnienia tych systemów SCM. W ClearCase wszystkie wersje pliku są określane jako Wersja pliku "drzewo", ale tak naprawdę jest to Graf acykliczny! Prawdziwa różnica w stosunku do Gita polega na tym, że Dagi ClearCase istnieją na każdy plik. Więc myślę, że jest mylące odwoływanie się do ClearCase jako non-DAG i Git jako DAG.

(BTW ClearCase wersje swoich katalogów w podobny sposób do swoich plików-ale to już inna historia.)

 1
Author: Darren Yeats,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 14:26:44

Nie jestem pewien, czy o coś pytasz, ale demonstrujesz, że strumienie Accurev są innymi narzędziami niż gałęzie Git (lub SVN). (Nie znam Clearcase.)

Na przykład, w Accurev jesteś zmuszony , jak mówisz, do korzystania z pewnych przepływów pracy, co daje historię zmian, która nie jest obsługiwana w Git. Dziedziczenie Accurev sprawia, że niektóre przepływy pracy są bardziej wydajne, a inne niemożliwe.

Z Git możesz mieć kodowanie rozpoznawcze w lokalnych reposach lub w gałęziach funkcji, które nie byłyby dobrze obsługiwane przez Accurev.

Różne narzędzia są dobre do różnych celów; warto zapytać, do czego każdy z nich jest dobry dla.

 0
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-18 14:33:12