During some ranting about Git on Twitter, Brendan Forster suggested I blog the things I would change. I don't have time to write a lot, but I thought I could spam out a list of things based on my first 30 minutes with Git on Windows.

Note: I've just installed GitHub for Windows as a result of these frustrations. I'm not usually a big GUI fan (I use Mercurial from the CLI always), but initial impressions are good. But still, I'm blogging about the CLI for now...

I grabbed a "Portable" version of Git, as I didn't want to soil my machine with something I knew was going to frustrate me. It contained a "git-cmd.bat" file that seemed to get me to a command prompt with git in the path.

Cloning

This one should be easy, right? Even with no knowledge of Git, I knew I could do git clone url. Well, turns out I couldn't do what I was used to doing with Mercurial (though this may be Codeplex's fault). I copy/pasted the URL to my fork of xUnit from the address bar, and hit enter. I got an error: fatal: http://(url) not found: did you run git update-server-info on the server?. WTF? Is this a Codeplex issue?

No, it wasn't. It was a user issue. The clone url for a repository on Codeplex is not the same as the homepage of the project. The last part of the message is rather misleading. I've no idea what update-server-info is, but I'm going to bet that more than 90% of the time that someone encounters this error, they just pasted the wrong url (or typo'd). The text should suggest this, rather than some server-side command that is probably rarely correct.

Suggestion: Re-word this message to be useful for the majority of cases.

Repository Status

In Mercurial, I type hg st to see repository status. It works, because I've typed enough characters that Mercurial knows that I must mean status. I tried git st and was greeted with a big list of commands that I "might have" meant, including even reset! Eh?

Suggestion: Steal Mercurials behaviour, and save keystrokes.

I did a quick count on how many keystrokes it took me to do the same thing (commit an edited file) in Mercurial and Git. It was 18 + the message in Mercurial, and 40 + the message in Git. WTF?

Repository Diff

In Mercurial, I type hg diff to see all of the outstanding changes that will be committed if I call commit. I did the same in Git and ended up stuck in some crazy mode that let me page up/page down, but apparently not exit. I tried Ctrl+C, Break, Escape, Enter and tons of other keys. I had no idea how to quit. After some Googling, I discovered it was :q. Classy. Just like all those other Windows applications.

Suggestion: Spit the diff out directly to the console like Mercurial (especially if it's so short it wouldn't fill the buffer). We already have the ability to scroll!

Suggestion: Don't use shortcut keys that aren't familiar to Windows users on Windows.

Suggestion: If you put the user into a mode that they need to "exit" to continue doing anything, tell them. Show something on screen that says "Press :q to exit"!

Commit

Ok, so I've seen my change. It all looks good. I need to commit it. Diff has already shown me the changes, so it knows what I want. git commit, right? Wrong! This command told me I hadn't added any changes to the staging area. What? Diff just showed me them! Turns out, I have to do "git add" first, so it knows what I want to commit.

Suggestion: Either don't show unstaged(?) changes in diff, just show a message saying there are some, or highlight the unstaged changes in some way.

(I'd almost go as far as ditching this staging crap, but I don't know enough Git to really understand the implications of that)

Commit (part 2)

With my changes staged, I can finally commit (hurray! so far this has taken longer than the 10-line-change I actually made!). So I type git commit. With Mercurial, this would fire up Notepad and let me type my commit message...

With Git, this launched VIM. That's right, VIM. You know, that standard Windows editor that everybody is familiar with? No, exactly. I started typing my commit message and my cursor starting moving all over the place and doing crazy things; I'd clearly mashed my way into executing commands or something... With that fixed, it was time to save and quit. I probably don't need to tell you how this works in Notepad! I tried Ctrl+S, Escape, Enter, Ctrl+C, and all sorts of other stuff. Again, I had to resort to Google. I wanted <ESCAPE>qw. Of course. Just like Microsoft Word; I should've known that! :-/

Suggestion: Use Notepad by default on Windows.

Suggestion: Don't use shortcut keys that aren't familiar to Windows users on Windows.

Suggestion: If you put the user into a mode that they need to "exit" to continue doing anything, tell them. Show something on screen that says "Press <ESCAPE>qw to exit"!

Pushing

With my change (finally) committed, it was time to push to Codeplex. This one isn't really Git's fault, but I spent 5 minutes trying to figure out why I got Authentication Failed messages when I entered my Microsoft Account details. Turns out, I have a Codeplex username/password from years ago which is "linked" to my Microsoft Account, and despite logging in to Codeplex using my Microsoft Account, this doesn't work with Git.

Suggestion: Let users push to Git using the same details they login to the site with! Or at a minimum, change the text that says "same as your website password" to make it more clear this is a Codeplex password, and not the one you probably used to login to the website!

Conclusion

My conclusion after all of this, is that Git is a fuckup on Windows. It's not friendly to Windows users, and it makes things way more complicated than they should be. If Mercurial had been half as complicated as this, I'd have never moved to (and advocated) DVCS.

I don't buy the "it's more complicated because it's more powerful" crap. What I was doing today should've been incredibly simple; and in Mercurial, it would have been. Mercurial is also cross-platform, so it's not like this terrible Windows support can be blamed on that.

I'm genuinely surprised that Git has become so popular on Windows (and at Microsoft) when it's such a mess. I can only assume this is down to GitHub doing a significantly better job than sites like BitBucket!

Luckily, it looks like GitHub for Windows might fill the gap between the totally-ridiculously-complicated-CLI and the complicated-and-badly-performing-explorer-humping Tortoise applications. No doubt I'll be tweeting more about that soon ;-)

I'm sure the Git fanboys/Linux Zealots will disagree with all of this and tell me I'm wrong. And that is why Git fails so badly on Windows. The zealots care more about trying to force their way on users rather than trying to build something that is easy to use and fits in with what different people are familiar with.

Git devs: When in Rome, do as the Romans do.