[linux-l] Re: VCS

Rocco Rutte pdmef at cs.tu-berlin.de
Sa Apr 22 12:37:34 CEST 2006


* Steffen Dettmer <steffen at dett.de>:

>> > Ja, und es geht einfach, weil in dem exp-Branch keiner was anderes
>> > geändert haben sollte. Im trunk kann man selten "einfach so" reverten.
>> 
>> Doch, schon. Aber nur in Changeset-basierten VCS.

>Ich glaube das nicht. Wie soll das funktionieren? Mit einem "diff" tool,
>dass C Quelltext gramatikalisch analysiert oder wie? Der erste führt ne
>neue Variable ein, der zweite initialisiert sie nicht direkt, sondern
>über eine refaktorisierte Funktion, der dritte benennt sie um und der
>vierte baut eine Prüfung und ein logstatement ein. Wie willte jetzt die
>zweite Änderung (und nur die) reverten?!

In dem man den zweiten Commit revertet? ;-)

Klar, das ist sinnlos, weil dann der Code kaputt ist, aber dafür kann 
die Versionskontrolle nichts.

Ich habe noch nicht genau herausgefunden, was mit "Changeset" genau 
gemeint ist, aber ich denke mal, dass ein Commit atomar ist, mehrere 
Dateien betrifft und nur als ganzes existiert (ein Commit in git, eine 
Rivision in Subversion, etc).

Da ist ein revert mit einem Changeset-basierten VCS natürlich einfacher 
statt sich für deine 2. Änderung in CVS alle betroffenen Dateien 
rauszusuchen.

Vor allem, weil ein revert mehr ist als nur 'diff | patch -R', weil die 
meisten VCS auch rename können.

>> Darcs z.B. kann das. Aber nur, wenn die darauffolgenden Patches unabhängig
>> sind. Bei neuen Features ist das aber i.d.R. der Fall.

>"unabhängig"... Na, /dann/ kann CVS das auch. Da reverted man über ein
>Datum, ein Tag (oder alt zwei) oder notfalls über Revisionsnummern (oder
>commit-Ids oder wie auch immer das SCM sowas nennt) einfach per
>textueller zeilenweisen Patcherei, klar. Gut, bei CVS muss man leider
>händisch taggen und diverse andere Nachteile machen sich breit, gerade
>bei weit verstreuten Änderungen, aber /wenn/ man das denn mal braucht,
>kriegt man es hin.

Es ist glaube ich einfach "nur" umständlich, also es geht schon, klar.

>> So kann man dann die verschiedenen Branches einfach als verschiedene
>> Zusammenstellungen von Patches (d.h. changesets) betrachten.

>Ja, OK, das ist bei CVS ja (mit etlichen Buch füllenden Einschränkungen)
>auch in etwa so.

Nein, nicht wirklich.

Streng genommen gibt es in zum Beispiel git ja nichtmal Repositories 
sondern nur eine Welt mit quasi allem Code unter Versionskontrolle.  
Jeder commit ist ein benannter (Log) Diff gegen einen Vorgänger (wenn 
der leer ist halt der erste). Eine Branch ist konzeptionell nur ein 
symbolischer Name für einen Commit, der bei jedem Commit der Branch 
akualisiert wird (zum ersten mal hatte ich git mit 0.6 oder 0.7 benutzt, 
da musste man die ID, die man beim Commit bekommt, noch manuell 
speichern sondern kam man an den Commit nicht mehr ran. Jetzt machen das 
Gott-Sei-Dank Shellscripte ;-).

Beispiel: in trunk gibt es den letzten Commit 'a', wobei das wohl 
identisch mit "Changeset" ist. Davon macht man eine Branch auf und 
committet etwas als Commit 'b' mit Vorgänger 'a'. Der symbolische Name 
für die Branch verweist auf 'b' als letzten Commit, der für trunk 
weiterhin auf 'a'. Je nachdem wohin man committed, werden die letzten 
Commits aktualisiert. Wenn man weiter in trunk committed, dann wird der 
Pointer für den letzten Commit in trunk jeweils angepasst (für die 
Branch bliebe er gleich, d.h. man bekäme immer 'b') usw.

Das ganze ist intern ein gerichteter und azyklischer Graph mit Commits 
als Knoten. Die ganzen Branches, Tags _und_ verschiedene Repositories 
sind nur pointer für solche Commits und man kann beliebige dieser 
Untergraphen verschmelzen.

Das ist hat nicht mehr wirklich etwas mit CVS/RCS zu tun...

   bye, Rocco
-- 
:wq!



Mehr Informationen über die Mailingliste linux-l