
Never Use Source Control GUIs - joeyespo
http://late.am/post/2011/09/27/never-use-source-control-guis
======
Derbasti
There are really really great Git GUIs out there. Tower is the one example
everyone is citing. That said, Tower is a largely transparent wrapper around
the git command line. Pretty much every button corresponds to one and only one
command in the terminal. All it really does is to give you visual feedback and
meta-information on what you are doing.

This works really well. You have to understand Git in order to use it
efficiently, but once you do it is in many cases just a more convenient way of
using Git. Well, and then it knows to do a `stash/pull --rebase/stash pop`
instead of a simple pull if you want to.

On the very other end of the spectrum is Github for Windows, which literally
only has one button "Sync" for all that is pull, push, fetch, rebase etc. It
is a giant PITA. Also, it does have an interactive commit view with files and
checkboxes BUT IT DOES NOT STAGE STUFF WHEN YOU CHECK THE BOXES. This drives
me nuts! Also, it trips up and dies if you stage stuff externally. I die a
little every time that app breaks something.

Thus, I don't have anything against VC GUIs at all as long as they stay true
to the command line. But any kind of abstraction is bound to leak at some
point. This might be OK in some places, but your VC is not the right place to
store leaked Git abstractions.

In many other places though, command line abstractions work just fine. Maybe
this is more a comment about Git being hard to abstract than an argument
against abstracting command line tools in general. And maybe that does not say
anything good about Git.

------
jawngee
1\. Never tell me what to do. How about "Why I don't.." instead. I'm not sure
why you are qualified to give me an absolutism in the first place considering
you've only been a professional developer for 5 years. Now get off my damn
lawn.

2\. And you've apparently never used Tower.

~~~
joeyespo
There's a comment in the article that also recommends Tower. I've personally
been looking for a Tortoise replacement. What makes Tower so good?

~~~
jawngee
It's pretty much 1:1 to git command line.

Most times when someone on my team screws up a commit, it's because they
botched the command line (the inverse of this article's claims). Fix it in
Tower in a few minutes in a visually simple way that helps them understand
what's going on.

It also makes submodule usage do what you think it should do.

------
davvid
That's an interesting stance.

There are things I can do in <http://git-cola.github.com/> that I simply can't
do on the command-line. That's why I use a GUI.

To be fair, I wrote it, so I know _exactly_ what commands it runs. I do think
I've done a decent job of making it very clear what's going on under the hood,
though. I even have a mode where the tool prints every git command it runs.

In general, though, I agree that folks should have an understanding of the
underlying concepts. That way the GUI becomes a supplementary tool (rather
than a crutch). This advice is not limited to just GUIs, though.

~~~
zem
agreed, git-cola is way more usable than the git command line for breaking
your uncommitted changes into a series of partial commits. that's the one time
i will absolutely use a gui tool as being the best tool for the job.

------
rcthompson
> I claim that any GUI which sufficiently exposes the underlying tool’s
> features to know with confidence what clicking any button will do fails at
> being any more intuitive than the command line tool itself;

I think this is the meat of the article here. Other commenters have noted that
Tower more or less falls into this category, i.e. a mostly 1-to-1 mapping of
GUI elements onto git commands, and you need to know git to use Tower. I would
add Magit to this category as well. You could not use either one unless you
already understand git itself and how to use it.

However, I don't think that these GUIs are useless simply because they are not
more intuitive than the command line. While they may not abstract any of the
intrinsic complexity of git, they certainly make git _much_ easier to use
simply by taking away a lot of the _techincal_ complexity in day-to-day usage.

~~~
Derbasti
+1 for magit. That is an awesome wrapper for Git! (I pretty much stopped using
Tower since I learned magit.)

------
pygorex
Actually, source control GUIs are excellent for less-technical team members.
I've had great results using TortoiseSVN or the GitHub client with multiple
distributed teams.

It's great to be able to tell a new team member: "Press this button to get
everyone else's updates." "Press this button to push your updates to the
server/current branch." Later, depending on their role and level of skill, we
can cover branching, merging, tagging and other move advanced features.

~~~
rogerbinns
My experience has been that developers using a gui make better commits. It is
far easier to see what the changes are, see unintended code changes, make a
more useful message and only pick a relevant subset of changed hunks.

The command line only folks tend to do 'git commit -a' or equivalent and have
messy noisy commits.

Yes a highly skilled developer at the top of their game, paying attention to
every detail and pumped full of caffeine is far less likely to do that, but
they are rare.

------
FreshCode
TortoiseHg is fantastic for Mercurial, but there are no comparable Git GUIs
that I know of. Github for Windows looks nice, but it tends to be slightly
unstable.

In my experience, open source GUIs for open tools generally have that
unpolished "design by committee" feel of a Diablo 1 inventory hacker written
in Visual Basic, so I can relate to the hate a little bit.

~~~
yumraj
There is TortoiseGit Link: <http://code.google.com/p/tortoisegit/>

------
Someone
_"I claim that any GUI which sufficiently exposes the underlying tool’s
features to know with confidence what clicking any button will do fails at
being any more intuitive than the command line"_

Based on that claim, he should also be opposed to word processors, visual text
differs, and vi. After all, all they expose are the features of
troff+Ghostscript, diff, and the combination of ed and sh.

------
jonpaul
Is this fear common amongst developers? My startup <http://gitpilot.com> is
trying to make collaboration amongst developers using Git stupidly simple. A
by-product of doing this is a simplified Git process. However, maybe our
approach is off. Any opinions on the matter?

~~~
rogerbinns
It looks like just another github equivalent, and I spied a Mac dock so is it
Mac specific too?

In any event what I have found missing is a goal oriented interface. To many
of the guis and the git cli are all about tasks. If you know what tasks map to
your goals then it works out ok, but if not (as is the case for perpetual
intermediates) then it is a confusing maze of bizarre commands, useless
messages and copy/paste from google search results hoping one of them will
work. For context see this [http://www.drdobbs.com/goal-directed-software-
design/1844099...](http://www.drdobbs.com/goal-directed-software-
design/184409952?pgno=8)

Git also has all of its defaults setup for large groups. For example tags are
not pushed unless you specify an additional flag. That is absolutely the right
thing to do when there are lots of developers, but the "wrong" thing when
there are only two.

Nirvana for me would be a gui tool (Linux and Mac) that interoperates with
projects hosted at Github and has a goal oriented interface. It should be
smart about things (eg tags not being pushed in a project of two people is
worthy of attention), and it should enable a git workflow (eg topic branch,
pull requests, reviews etc). I really don't care what the git commands are to
do various things - there are often several needed in some particular order
with various random flags. Just help me and other perpetual intermediates
reach our goals and concentrate on our development efforts, not micromanaging
a version control system.

Part of that also means having an attitude about the right way/best practise
way of doing something. Rather than providing endless configurable ways (and
dialog boxes) to do something, pick one right way even if not everyone would
agree. An example would be to always push tags for projects with few
developers.

~~~
jonpaul
Thanks for taking the time to provide some feedback. The article that you
presented was really interesting and despite being over 15 years old, it seems
that its insights are still valid today.

Regarding Gitpilot, I think that our biggest problem at the moment is that
maybe we are miscommunicating its value proposition. As it's a compliment to
Github and not a replacement. I think you'd also find that it's at least
attempting to be goal oriented as opposed to being task oriented like most Git
GUIs. For the sake of brevity, Gitpilot is best described as a git-flow GUI
[<http://nvie.com/posts/a-successful-git-branching-model/>,
<https://github.com/nvie/gitflow/>]. (Our branching model is a bit different
though)

It is Mac specific at the moment and it's currently awaiting review for the
Mac App store. If you're interested, when it's live, I'll send you and your
team promo codes so that you can try it out at no cost. If so, send me an
email to jp [AT] gitpilot.com

Thanks again.

~~~
rogerbinns
Alan Cooper (article author) also has a company and wrote several books (About
Face, Inmates etc). And is considered the father of Visual Basic! But yeah,
goals are timeless. I wish software/website authors realised that the goal of
most users is to use their software and site for as little time as possible
because they manage to achieve their goals quickly. Dialog boxes and similar
stuff annoy the crap out of me. The programmer of the app/site has deep
comprehensive information and they can't make their mind up, then why dump it
on the user? You can trivially mitigate most things. For example if you
provide undo across sessions then you don't need to ask users if they really
meant to delete. Firefox on Android does a great thing - any closed tabs are
shown at the bottom for a short period of time somewhat faded. Touch it to
bring it back to life.

We have 4 git users on the team. The one writing the most code (me) is Linux
only. The next person (about half time git) is almost entirely Mac. Another
two use git but have no idea what it does and do not care (both Mac). They
merely run the tools we store in git. Additionally our stuff is scattered
across several repositories (for good reason). To do work you need one more of
them. The Github for Mac client only lets you sync one repository at a time
which is painful. I wrote a script in the end that syncs all repositories.

I would love to have a goal oriented gui for a git flow since I'm very lax at
the moment, not having time to learn how to micromanage the sequence of
commands needed. Heck I still have to look up the flags to git stash
everything time I use it.

But being Mac only means your software is of no value to us. Thanks for the
offer though.

------
stcredzero
One thing that I've noted about the git integration in XCode4 -- the thing
seems to put me on a branch to commit and take me off of it right after. If
one isn't aware of this happening, bad things can result from an ill-timed
command line git command.

------
vhackish
Also, never generalize ;-)

