{"id":23395,"date":"2018-11-15T14:56:43","date_gmt":"2018-11-15T19:56:43","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=23395"},"modified":"2018-11-15T14:56:43","modified_gmt":"2018-11-15T19:56:43","slug":"version-control-before-git-with-cvs","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2018\/11\/15\/version-control-before-git-with-cvs\/","title":{"rendered":"Version Control Before Git with CVS"},"content":{"rendered":"<p><a href=\"https:\/\/twobithistory.org\/2018\/07\/07\/cvs.html\">Sinclair Target<\/a> (<a href=\"https:\/\/news.ycombinator.com\/item?id=17483083\">Hacker News<\/a>):<\/p>\n<blockquote cite=\"https:\/\/twobithistory.org\/2018\/07\/07\/cvs.html\"><p>Whereas with Git you&rsquo;d talk about the version of a file associated with commit\n<code>45de392<\/code>, in CVS files are versioned separately. The first version of your\nfile is version 1.1, the next version is 1.2, and so on. When branches are\ninvolved, extra numbers are appended, so you might end up with something like\nthe <code>1.1.1.1<\/code> above, which appears to be the default in our case even though we\nhaven&rsquo;t created any branches.<\/p><p>[&#8230;]<\/p><p>Since CVS doesn&rsquo;t have easily addressable commit objects, the only way to group a collection of changes is to mark a particular working directory state with a tag.<\/p><p>[&#8230;]<\/p><p>Because you need a tag to rewind to an earlier working directory state, CVS\nencourages a lot of preemptive tagging. Before major refactors, for example,\nyou might create a <code>BEFORE_REFACTOR_01<\/code> tag that you could later use if the\nrefactor went wrong. People also used tags if they wanted to generate\nproject-wide diffs. Basically, all the things we routinely do today with commit\nhashes have to be anticipated and planned for with CVS, since you needed to\nhave the tags available already.<\/p><\/blockquote>\n<p>This is a good retrospective of what it was like to use CVS. In my experience, it was also much more prone to corrupting the repository than either Git or Subversion.<\/p>","protected":false},"excerpt":{"rendered":"<p>Sinclair Target (Hacker News): Whereas with Git you&rsquo;d talk about the version of a file associated with commit 45de392, in CVS files are versioned separately. The first version of your file is version 1.1, the next version is 1.2, and so on. When branches are involved, extra numbers are appended, so you might end up [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2018-11-15T19:56:45Z","apple_news_api_id":"b37bdedf-d232-42a5-bee0-6d523ee95273","apple_news_api_modified_at":"2018-11-15T19:56:45Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/As3ve39IyQqW-4G1SPulScw","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[],"tags":[868,295,71,376],"class_list":["post-23395","post","type-post","status-publish","format-standard","hentry","tag-cvs","tag-history","tag-programming","tag-versioncontrol"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/23395","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=23395"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/23395\/revisions"}],"predecessor-version":[{"id":23396,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/23395\/revisions\/23396"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=23395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=23395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=23395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}