Hacker News new | ask | show | jobs
by anon35 1055 days ago
Made a list of all the revision control tools I've used over the decades, the year they were created, and the year I last used them:

    sccs            1973    2000
    rcs             1982    2000
    cvs             1990    2004
    clearcase       1992    2004
    perforce        1995    2011
    subversion      2000    2015
    mercurial       2005    2015
    git             2005    present
So, at least for me, they last around 15 years or so.

But often time when I tell juinors that when they're my age, git will be distant a strange memory to them, they look at me funny. It's a wonderful tool and earned its success, but I'll be sad if it's our final take on the problem.

7 comments

In fairness, the rate of change of any type of tool slows down over time as the problem domain becomes well understood.

It's like the Joel on Software article (which annoyingly I can't find at the moment) about how software is always pretty much done by about version 4. His example was office software, especially Excel, and sure enough if you loaded Excel 4 today you'd see it does fundamentally all the main things.

I suspect we'll see git last at least double the length of time as those other VCS tools.

I think mostly it will depend on what we will call the replacement to git. We might end up calling it 'git', too.

Less weirdly: ethernet has been replaced a few times already, but they always just end up branding the replacement as a new version of 'ethernet'.

I think this is a great point! What even is "git"? If it's the binary program named "git", then there are already lots of replacements for that binary that people use, and it would not be surprising at all if one of those different frontends becomes more dominant than "git" itself.

But if "git" is the protocol, the specification of how a particular construction of a database of versions, then I suspect that will be pretty sticky. I'm sure it isn't the optimal solution but it works well and it's very useful to have a lingua franca for this.

Old versions of the git binary are incompatible with new versions.

I suspect everything about git is the ship of Theseus

Many of those variations of ethernet remain compatible, 10g switches can often negotiate down to 10/100.
Yes. And the replacement to git might also stay compatible.

(In an extreme case, git can talk svn via git-svn. In a weird alternative history, you could imagine git being treated as a new version of svn; but apart from the names, nothing much else would change compared to our universe.)

I’ve worked with many switches. I have not encountered a 10g switch that will negotiate to 10m. 100m is not automatic in most cases. These very old protocols are very different from modern 10g-100g. So much so that the transceivers may need to load a completely different firmware to even understand it.
100g may be too high, but my micro tick does fine: https://mikrotik.com/product/s_rj10

(I’ve not seen 100g over copper, but 10g is doable)

I don’t know if it will go down to half duplex.

Ok. Most of my experience the switches will have 2 modes for each port: 1G/2.5G/10G/25G/100G or 10M/100M/1G/2.5G. This is typical for datacenter switches. Found this out when my trusty 10/100M USB dongle couldn't establish link. I needed to upgrade to a 1G USB3 dongle.
Half duplex is in spec at 100 as well as 10, so I'd be surprised if it didn't.
I do think that if there is a replacement to git in the future, it will probably have pull requests, tags, etc. built in that most git servers support but implement separately since they’re not in the standard. Alternatively, GitHub as a platform will become so standardized that they may launch their own “VCS” which is just other things bolted onto git that only work with GitHub (we’re already going there with the git command line)
What? Tags are built into git. Maybe you're thinking of releases aka attaching additional files to tags.
They already have the GitHub command line, actually.

https://cli.github.com/

Typo that’s what I meant
> software is always pretty much done by about version 4

IPv4 has entered the chat

Excel has recently introduced 4-5 VERY big changes:

* javascript (arguably 'nobody' knows how to use it though, looking at the scarce resources)

* Lambdas

* Sharepoint integration, which is a type of shared notebook - and arguably this has ruined excel usability completely, since linking one file to another is basically unusable, what means were are back to the stone age, where people fucking copy paste things between files (omg)

* PowerQuery (this is not new, but seems to be the way to "fix" the problem that sharepoint files that can be edited by multiple uses are basically unusable junk)

* Updated PivotTable model that allows some basic connections between tables (this all could have been done in multiple other ways before)

For me the problem is that with the "multiplayer Excel" that seems to be promoted by Microsoft (shared workbooks on sharepoint, where multiple users can edit them at the same time), Excel lost the main functionality for actual power users, who take data from multiple source files and then consolidate them to one final report. Of course this is still "possible", but not as easy as it was before with shared drives.

I see like multiple major regressions at Microsoft that harm "average" office worker productivity now:

1) Excel file linkages broken (as described above)

2) Outlook calendar app on android -> lack of ability to have a custom notification sound (e.g. a 30 second sound), so you can skip fucking reminders, because one "ping" is easy to miss. Why cant I have a fucking calendar reminder that actually reminds me about stuff with sounds?

3) The "new" windows taskbar that combines instances of same program into one button. Do they assume that most users treat windows like a toy? Nearly every office worker has like 3-5 excel files open, 3-5 emails, maybe some PDFs - and has to switch between them. Due to the fact that taskbar is combined by default, incredible amounts od productivity are lost

4) Hibernation is hidden. So you are supposed to turn off your computer every day, then come to the office, wait for 10 minutes for it to turn on (all the antivirus, constant updates, VPN), then turn your programs back, then turn your files / emails back. So you waste another minutes to setup the computer back to work. Compare it with hibernating, where you get your work back exactly the way you left it the day before. (and yes I am aware that updates are important and so on, since they defend against zero-days, but a multi-billion dollar company has the resources to figure out how to do them without productivity loss)

5) Bonus points: your computer can wake up at 3 am to install updates and also wake you up (maybe they changed it recently, or maybe admins control this by policy)

6) Random shutdowns, because some update is so incredibly important that at least once per quarter they have to force you to turn off your computer. Bonus points are when a window pop-up "restart now" and "ok" is the selected default so you accidentally press it while typing (and yes, I do restart my computer at least once per week to get updates)

However Microsoft is no longer interested in doing any productivity studies. They dont care. Now it seems their main goal is to offshore development to low cost countries. So we get software that looks as if it was done by lowest bidder.

I wonder why there's no true modern replacement for Excel that preserves the same versatility and ease of use for nontechnical users.

Every user could just have their own file, in which they could stash records(Or updates to other people's records), and you could have interfaces to view the data that look like a typical spreadsheet.

The data itself could live in an unsorted set of JSON objects with UUIDs, but the UI could be just as easy as Excel, you'd get tables that you could add or remove columns to and from, and put formulas in the fields, and query in some stripped down language with similar power to Excel.

And it could be 100% compatible, you would be free to put your data in the spreadsheet like the old fashioned way, sync with any cloud including SyncThing and no cloud at all, and data files could just be plain CSV you could version.

Linking two Excel files and consuming data between them requires the workbooks be open in Excel.

Power Query is no where close to what you described it as. It was not created for SharePoint or real time coauthoring. It is for getting and transforming data.

Subversion is basically CVS done right. The problem is that CVS was a dead end that didn't scale to a distributed development model.

Git goes back to the local RCS model and adds atomic commits to that model. That's how it climbed out of the local optimum that was Subversion. There were a couple controversial choices that Git made, for example not tracking renames and not having linear revision numbers, but they turned out to be not a big deal and they allowed very efficient operations without the performance issues of e.g. darcs.

Given all the attempts to fix version control between 1995 and 2010, the basic data model of git seems to be very hard to improve on, especially with additions such as git-lfs.

There could be new command line interfaces but it has become harder and harder to kick away the incumbents. I know no one who is using git switch and git restore instead of the overloaded and confusing git checkout.

git-lfs is horrible, at least it was horrible the last few times I tried it out.

More precisely git-lfs is horrible the way it works with Github and its insanely low git-lfs storage and transfer limit.

What ends up happening inevitably is that you add some file to git-lfs that you did not mean to.

Only half sane/insane way to fix this is to just say screw it and start a fresh git repository, hopefully with files that you salvaged before the whole git-lfs mess.

I am quoting Github documentation "To remove Git LFS objects from a repository, delete and recreate the repository."

https://docs.github.com/en/repositories/working-with-files/m...

You say that is user error. Of course, users will make errors.

However your version control tools should get out of your way not make your life hell.

EDIT: I felt fine using Subversion combine with Redmine for issues in mid 2000s

Why did we need to go to git for everything when we still end up remoting to/from centralized hubs?

> I know no one who is using git switch and git restore instead of the overloaded and confusing git checkout.

Welp, I guess there's me, but it does indeed seem like adoption of the new commands hasn't been very forthcoming - I guess that's what happens when "the old way still works just fine" - but personally I'd expect that more and more people will change to the new commands over time.

I just checked these commands out to update my git knowledge, but when I saw the following in the docs [1][2] I immediately marked these commands as not (yet) worth it to learn since the way these commands work might change.

  THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
So that might have something to do with it as well. Especially if there are stable commands that I already know that have the same functionality.

[1]: https://git-scm.com/docs/git-switch

[2]: https://git-scm.com/docs/git-restore

It makes sense for old timers to keep just doing it the way we always have, but I wonder how newcomers to version control are being taught. I would really hope they aren't just being thrown a bunch of these inscrutable commands by their leads, like when I learned it!
Judging by my colleagues (whether more or less experienced than me), "whatever the GUI allows for".

Yes, almost the entire company runs on the subset of git presented by Visual Studio and Azure DevOps. I would guess this is more and more common, and even the more obvious shortcuts available for many things through git itself will become more and more arcane.

I should at some point alias git checkout to throw a warning, git switch/restore are clearly a better choice, but unfortunately checkout is ingrained in muscle memory at this point.
I, personally, would find this very helpful if git did it by default. I learned git by searching for "how do I?" stuff. Now I know how to do things, so I don’t go looking. It's possible that there are new and improved workflows, but I'll never know because it already works for me, even if I do it "the hard way".
"what the hell is git switch" --every developer
I did an alias co for checkout a while back, now I don't think I will ever unlearn that.
I for one am trying to train myself to start using switch and restore, so that I can recommend them in company channels for people having problems with our monorepo(s).
> Given all the attempts to fix version control between 1995 and 2010, the basic data model of git seems to be very hard to improve on, especially with additions such as git-lfs.

I wouldn't be surprised if some of the work and rigour being invested in OTs and CRDTs, and multi-user collaborative editing in general leads to some breakthrough improvements in the source control space too.

Aren't CRDTs the logical conclusion of automatic merging? I feel like with source control you want to be more intentional about what gets merged, right? Maybe CRDT can be good for trunk-based development with a merge queue. Definitely has a spot in pair programming.
I don’t know what we’ll be using 15 years from now. But the thing that is really sad in your list is that you stopped using mercurial in 2015, but still use git to this day.
I migrated a project from clearcase to git at my first company and for all the hate I have for clearcase even I agree there was little point in switching to something else before. We had a bit of svn on other part of the company but that was it.

VCS don’t change that fast. All the tools you list before the advent of DVCS actually have a lot in common. I think git will be there for some time.

The internet tends to lock things in. There were many languages dominant in history at some point or another, english will be the final one. There were many scripting languages, javascript will be the final one. Many networking protocols, TCP/IP the final one. Same for git. I think the only thing that might displace git is some environment for new programmers with its own version control system like glitch[1].

[1]: https://medium.com/glitch/reinventing-version-control-with-g...

> There were many scripting languages, javascript will be the final one

If, by “scripting languages”, you mean “browser-native languages”, WebAssembly might become a serious contender as the lingua franca for the Web in the long term.

> The internet tends to lock things in.

More generally, a globally connected civilization locks things in, once they are sufficiently widespread.

Barring an apocalypse, our present is eternity. I'm always amused when I read science fiction that assumes in the future, Chinese will be the lingua franca, or that we'll have political offices modeled after Ancient Rome, or that there's a world government, or similar nonsense.

To paraphrase O'Brien from 1984: "If you want a picture of the future, imagine a crony-capitalist, meme- and outrage-driven society that always seems on the brink of collapse but never actually does collapse – forever."

> More generally, a globally connected civilization locks things in, once they are sufficiently widespread.

This idea is known as the end of history.

https://en.m.wikipedia.org/wiki/End_of_history

So it looks like you're ready for a change ... What's next on the horizon?
Generally git‘s support for a stacked PR workflow is poor [0], but imho that is the future of team collab (git is great for very asynchronously built projects, like the linux kernel). I also wonder, how much better git could be if it was based on DAGs not trees (I may want to use a changeset that is still developing in more than one branch without maintaining copies of it) and corollarily I‘d like to rebase subtrees (sub-DAGs) instead of single branches.

I have introduced a stacked PR workflow to our team a while ago and a few months later half of the team had migrated to some kind of stacked PR workflow tool (on top of github and git, even though support is sub-optimal). It seems like this is an idea that is really sticky.

[0] https://github.com/ezyang/ghstack

> (I may want to use a changeset that is still developing in more than one branch without maintaining copies of it)

Not sure if you realize, but a commit is a state of all files in the repository, not a patch. Patches are calculated for you at display time (and can be calculated against any other commit, not just a parent). Sounds like you may be confused because of trying to apply a wrong mental model of how the repository represents things.

I'd say that git actually supports stacked workflows quite well. It's GitHub's PR model that makes it hard.

> I'd say that git actually supports stacked workflows quite well. It's GitHub's PR model that makes it hard.

I agree that the model does but I’m not aware of any good way of using such a workflow with the CLI either. Is there a reasonable way to effectively keep rebasing on top of multiple upstream branches?

> Is there a reasonable way to effectively keep rebasing on top of multiple upstream branches?

This is the problem. You cannot rebase with a stacked PR flow. The correct way to do this is use the merge command as intended.

One of the most powerful features of git is the ability to understand a common history between multiple parties and everyone throws this away entirely with a rebase and causes non-stop conflicts. I simply do not understand the preference for it, especially in shared repos.

Do not use a rebase workflow with any work that is shared with others unless you are communicating regularly and understand how obliterating your commit history will change how git views what is changed between two repositories. Rebase only works well if you are in a leaf branch you control and even then I prefer a single squash merge back into upstream rather than multiple rebases if possible.

I can't even tell you how much of my life has been lost correcting merge conflicts caused by bad rebasing of my commits by others.

> Not sure if you realize, but a commit is a state of all files in the repository, not a patch.

I think that's a core problem. It's not just that git calculates a patch to show you, it's that — in every git-using project I've seen — a developer writes a patch, and writes a commit message describing that patch. It's not just github. And then developers make the incorrect assumption that git's later presentation of the commit as a patch matches the original patch and is accurately described by the commit message.

The developer never writes a patch when using git. The developer creates a new repository state, links it to a parent state (or multiple parent states) and describes the difference between these states in the commit message. A patch form is just a handy way to visualize these changes.

You can dump commits into patches and then apply them onto different repositories, but in order to do that you still have to convert such patch into a new repository state first.

Many people "learn" git by learning which commands to use to do some things and in turn don't understand what's going on at all. It's like learning how to write a letter by reading Word's manual.

> I also wonder, how much better git could be if it was based on DAGs not trees [...]

Git generally supports DAGs.

> [...] corollarily I‘d like to rebase subtrees (sub-DAGs) instead of single branches.

Rebasing is something you do to the commit graph, which is a DAG. Branches only come in incidentally. Branches in git are really just mutable pointer to immutable commits.

What you are describing is probably some useful workflow, I guess?

I seem to understand GP wants to move a whole DAG potentially having multiple leaves, not just a DAG ending at a single leaf.

IOW

   git rebase --onto shaX shaY shaZ
ends at shaZ, git walks backwards from it until the commit whose parent is shaY to produce the list of commits to cherry-pick onto shaX

So presumably this would be useful:

    git rebase --onto shaX shaY [shaZ1 shaZ2 shaZ3 ...]
with shaZn being optional and consisting of all leaves down from shaY

This is achievable with git but it's not just doing n rebases like so:

    git rebase --onto shaX shaY shaZ1
    git rebase --onto shaX shaY shaZ2
    git rebase --onto shaX shaY shaZ3
    ...
because each rebase would produce different commits for parts that are common to shaZ n1 and shaZn2 ancestry, so one would have to first find all the branching points and do partial rebases onto the rebased parent commits in order.

It definitely can be done (manually or automatically) but is not as trivial as one might think.

OK, that makes sense.

I think if you wanted to do this, it would probably be easiest to produce an artificial leaf that points to all the leaves you want to rebase.

Yes, and the original commenter's point is that git does not support this well, at the data model layer even. Because commits have exactly one parent commit, which is immutable, and because rebasing creates a new commit, rebasing an entire subtree with N nodes under it requires N operations, rather than just 1.

Personally I think it's a pretty small price to pay for the advantage of the single-immutable-parent model, but I do think it's surprising that there aren't better tools for this workflow. I do this all the time, but manually and painstakingly.

Not only it's useful, it's as easy to do in git as typing `git rebase -r`. Recently it even gained support for rewriting branch pointers in the process.
In general, it's almost always better to use long options. So that would be `git rebase --rebase-merges` in this case.

Almost always means: it's better eg when communicating with other humans, whether that's on a forum like HN or in code or scripts. Long options are easier for humans to understand and to 'google'. They also provide some redundancy against typos.

The sole exception, where short options can be useful, is when you are actually using a command line interactively. Use short options to your heart's content there.

Do you mean it can rewrite branch pointers that pointed to intermediate commits? How?
--update-refs
Point could be made people don't really use git anymore - they use github as the primary interface. Branching, merging, review, etc.
How many people know GitHub can do that? Your comment was the first I'd heard about it.
I suspect it’s the opposite way around: most people, when they hear “git”, macroexpand it to “github” and don’t even know that there is a (more powerful) command-line interface.

The peer-peer distributed nature is barely known — these days it’s a centralized client/server system. I remember the Internet connection going out at work a few years ago and developers saying they couldn’t coordinate bc github was not accessible when they could easily have synced, merged etc with each other directly.

My partner definitely does not know the difference between Git and GitHub. He's not much of a programmer but yeah.. maybe this is like Java vs JS all over again. Or jQuery vs JS. That one makes me extra sad.
The only git GUI I use is GitLens. I have always found the command line much easier to understand...and the GUIs make me nervous.
I've never seen as the primary workflow.

It's handy, especially if you're using Git as a CMS or something like that.