Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Terminal game to test Git skills (github.com/hgarc014)
54 points by jackpirate on Jan 8, 2015 | hide | past | favorite | 52 comments


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.

90% of everything is crap ;)


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.


Check-in and check-out is all most people need to know who use a 'traditional' tool like CVS and SVN.


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.


Make branches the exception instead of the rule, a.k.a. 'Trunk Based Development'. Just like Google and Facebook.

http://paulhammant.com/2013/04/05/what-is-trunk-based-develo...


How does svn make feature branching difficult?

svn branch is a "free" operation (branching doesn't use space), svn switch means you can hop between branches easily.

I can see how a dvcs is nicer to work with locally but I'd like to hear your struggles with svn.


Darcs. Super easy and has a formal theory behind it.


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?


Significantly. AFAIK there are still pathological cases where it'd take much time, but they are very rare.

[And to be fair: others don't have that problem only because their merging doesn't take into account the history.]


Nice to hear! I'm going to give it another roll.

Now that I'm picking your brain anyway, do you know if there's any (workable) way at all to combine a site like GitHub or Bitbucket with Darcs?


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.


Don't you think there is a sensible reason why writers don't merge branches?



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.


I would argue the exact opposite, but I don't think we are getting anywhere :)


They do, but it is a feature in Word and therefore not part of the Dropbox game ;)


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".


My way is called TortoiseGit.

It does everything any enterprise developer needs source control for.


I got to the point where it wanted me to run a shell script without examining its contents... and that's where I just stopped.

Also, I didn't use git to do any of it, but maybe that's because I'm a terrible person.


Yeah, I had to cheat on that part and check out the file content. No way I'm running it without looking.


Anybody stuck on this? -Sn The Next Clue Is: YtrydjKsYqebDoI3h bTINUeV6 pTVY8jnK2re HRwwNy25Ps6 u0YChCo5Jtw N3xkH3G nx aGo6yQTW RVZMsf3xk tBL0sG9GAR HQbyGYdqs i6dx1fyIPGJVciz8Z1NzdrvGE CKgkFauXqfKJmas cDLerWvBTRzUikmP2 0sqk2Xhie2DcIv KtCyYTlNx7WxJp6A2yox3r aJX4r7FpUhgsyGIwc prCCNx46GKVgzaerab3gXS7ieoOf1 Jp +Sn The next clue is: YtrydjKsYqebDoI3h bTINUeV6 pTVY8jnK2re HRwwNy25Ps6 u0YChCo5Jtw N3xkH3G nx aGo6yQTW RVZMsf3xk tBL0sG9GAR HQbyGYdqs i6dx1fyIPGJVciz8Z1NzdrvGE CKgkFauXqfKJmas cDLerWvBTRzUikmP2 0sqk2Xhie2DcIv KtCyYTlNx7WxJp6A2yox3r aJX4r7FpUhgsyGIwc prCCNx46GKVgzaerab3gXS7ieoOf1 Jp


I had two lines displayed after I diffed. I could read the answer from there.


what do you diff it with?


just realised I need to diff with origin/bug. Finished the game now :)


You can also try this one, its been around a while - https://github.com/Gazler/githug


I'm stuck at this clue though...

The next clue is: YtrydjKsYqebDoI3h bTINUeV6 pTVY8jnK2re HRwwNy25Ps6 u0YChCo5Jtw N3xkH3G nx aGo6yQTW RVZMsf3xk tBL0sG9GAR HQbyGYdqs i6dx1fyIPGJVciz8Z1NzdrvGE CKgkFauXqfKJmas cDLerWvBTRzUikmP2 0sqk2Xhie2DcIv KtCyYTlNx7WxJp6A2yox3r aJX4r7FpUhgsyGIwc prCCNx46GKVgzaerab3gXS7ieoOf1 Jp


same here :(


This is very well done!


Looks promising, but did I read correctly "each one harder than the next"? ;)


Nice, looking forward to the sequel ;)

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)


And posting thsi here is a mistake... ;)

https://github.com/hgarc014/git-game/issues/2


this issue has been fixed


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.


I can't even get the first one...what's the answer for the first one? i thought it's "new"?


Run "git log" and you'll see the commit messages. Checkout the commit that makes you think of a "new programmer"


Fun game. Just finished.

May I suggest a part 2? It can include rebasing, cherry-picking, stashing and resetting, among other things.


Great game! We should make a "bash skills" game for you in return, Henry!


> Clone this repository by running

What if I didn't know how to git clone? :)


I thought I was decent with Git and I fail the first task :(


nvm I got it


Neat idea to test GIT skills :D Gr8 wrk!


Really nice game.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: