I recognize that this is hardly a constructive comment, but it still bothers me that "Git skills" are a thing. I want to keep my code versioned and share them with my colleagues. There's no "Dropbox skills" game either, why do we need a "Git skills" game? There has to be a way to do what 90% of people use Git for, but then simple, right?
I understand the sentiment, but Git is hardly meant to be a simple tool that anybody can pick up and use without any prior experience. I don't use Git just to version and share my code -- I'd use Dropbox if that were the case. No, I use Git because I want to perform complex operations on a directed acyclic graph which represents the history and structure of my project. I use it because it can be interacted with in a programmatic way, and extended to meet my needs. Git is supposed to be complicated, and you do need "Git skills" to use it properly.
> No, I use Git because I want to perform complex operations on a directed acyclic graph which represents the history and structure of my project.
To accomplish what? Note, I'm not trying to diss you, I really want to understand why you want to do that.
I mean, I never woke up in the morning and said "woa, I really want to perform complex operations on an acyclic graph today". Maybe you and me are just different, but I usually want to make software, together with my team.
I want to hack on the same software as them at the same time, so we need a way to deal with all the technicalities that make emailing ZIP files around unpractical. I want to keep track of history so that I can see why we did what when, and so that I can undo stupid mistakes. That's really all I want.
I don't completely understand why I consciously need to perform complex operations on a directed acyclic graph to accomplish these things, but somehow that what I end up doing, and that makes me sad. I find it to be a horrible distraction. For me, the "D" in DVCS is an implementation detail, and I bet this holds for 90% of GitHub's paying customers.
Sorry, I've just realised how snarky my comment came off as.
I guess the point I was trying to make is that a huge portion of Git users don't actually need Git; they would probably get everything they need from a conceptually simpler VCS like Mercurial or SVN.
Regarding the DAG thing, this is just because that's essentially how Git actually represents the objects which it stores, which represent your repository and its history. A lot of the time I'm in the mindset of "committing some code to a branch" but sometimes it's useful for me to get into DAG-mode so that I can more easily think about how I want my repository to be structured.
An example is how I work with my master branch, which I consider to be the absolute source of truth for a repository's history. This means that it should be full of complete, atomic commits which are ordered in a way that enables me to do things like git-bisect (for finding bugs), generate meaningful release logs, and just generally understand the history at a glance. So rather than just blindly merge my branches into master, I spend a lot of time using git-rebase to squash, re-order, and edit my commits. I find it easier to do this when I'm thinking in terms of a DAG, rather than some abstract concept of a "commit" (whatever that is).
> I usually want to make software, together with my team
1. Small-scale history: Developers make mistakes. When things go wrong, a clean history of small, incremental changes is priceless. Git helps you craft such a history. It's not about what actually happened. It's about helping you solve future problems.
2. Large-scale history: large projects branch. Especially commercial ones, where you need to support old versions, or maybe have custom versions for laaarge customers. Git handles this well. And it's good at helping you get identical changes into multiple branches without loosing track.
> and I bet this holds for 90% of GitHub's paying customers.
I don't think the choice is that binary (git OR dropbox). I've needed to use both mercurial and git for different jobs. From that experience i would say mercurial is just as powerful as git but more intuitive and easy to learn.
Totally. At my work, a team of 5 devs manage to version their 25 years old software (>10.000 files) using SourceSafe !
No branch, no merge, only a central repo and intelligent check-in/check-out. They are way more efficient than the agile-y teams working with Git/Mercurial.
How often do they release? Do they do hotfixes? Do they have UAT versions? I bet they would be just as efficient using git as they are using SourceSafe (whatever that is). That's because YOU choose how you use git.
Except when it breaks. And what about feature branching? I think the name "feature branch" is an implementation detail, but I really do like that Git enables me to "only ship features that are considered somewhat 'done'", so that I can ship often yet not ship half-finished work.
SVN and CVS make this notoriously difficult. So I need a DVCS. But those are all super complex. I think Git/Hg/etc are great innovation and obviously the step forward compared to SVN and friends, but I'm not convinced were there yet.
There has to be a way to get the major tangible advantages of Git with the ease of use of SVN.
Good one, it actually looks really cool. I played with it last many years ago, when there was a notorious bug that occasionally, merges would take super long because the algorithm was exponential in nature. Do you know whether things have improved on that area?
Maybe if its default CLI wasn't a total piece of horse shit.
Seriously... some commands (like reset and show) do wildly different things based on a single flag or whether they're given an argument or not; the interpretation of arguments is by default context-sensitive (files vs. branch names); the "simple" way to do some things (revert local changes) is via a seemingly unrelated command (checkout); informational commands tend to show no useful info by default; etc.
The infuriating thing is that git's internal model is very simple. It's often easier to resort to working with the files under .git/ directly than figuring out what incantation I need to do simple thing X.
The only redeeming quality of the CLI is the existence of git rebase --interactive. It's one of the few commands that directly maps a user goal (editing the DAG) to a simple action (moving lines in a text file).
(Yes, I know there probably are replacement CLIs. That doesn't help when I need to help co-workers do something.)
Darcs is an example of a great DVCS CLI. Its commands each do exactly one thing; are well-named; only need options for the uncommon cases; and there's exactly one command for each basic operation on the repository.
Not really, just think about merging two branches. You can't really ask Dropbox to merge two diverging versions of a Word document, preferably automatically, maintaining coherency and correctness of the texts.
In fact, I've been involved in collaborative writing and it was organised so that it didn't require any awkward merging procedure.
'Git skills' take people away from writing. Or, put another way, 'git skills' increase cognitive load on programmers and is just another area where mistakes can be made.
In fact, I've been involved in collaborative writing and it was organised so that it didn't require any such thing.
That just means your group chose to limit the potential quality of the work (by not allowing people to improve on other's parts) or expand the timespan of the project (by disallowing concurrent editing) on behalf of simplifying the process.
They're valid tradeoffs, but too limiting for most software projects, in my opinion.
Because for projects that are developed and maintained for years, with a new developer taking over almost every year, the history can be a real treasure.
Developers suck at documentation ( or lack the will to do it ). History gives you clues on what was done to fix what, a glimpse of the requirement and 'Git skills' helps to keep this history clean.
I'm not sure we disagree. I'm not saying "we should use Dropbox instead of Git". I'm saying "we should design a tool that makes the most common Git tasks, including tracking history, much easier so that we don't need a terminal game to learn it".
By the way, let's say I don't "remember" which other branch contains a file at a certain path - what's the easiest way to find all other branches which contain a file at that path?
Ah - how do I make sure that cpp file is safe before running a shell script which I am not supposed to read with it as an arg? (I mean this in practice - not in the course of this game)
I kind of ruined it with my reflex to run "git branch -a" (DO NOT run this command if you want to play fairly); but I was able to complete it fairly quickly nonetheless.