Предупреждение: Эта статья вас ничему не научит. Это очень высокоуровневый взгляд, мои мысли, моя рефлексия на вопрос, который для меня важен + небольшое этнографическое исследование по графическим клиентам git-а.

Поговорим о распределенных системах управления версиями.

CVS был грустным, медленным, неатомарным („ничего не трогайте, я коммичусь“), зато с нормальным клиентом в Эклипсе.

SVN был медленным и поначалу веселым, но с появлением первой ветки тоже грустным („ничего не коммитьте, я мержусь“), с двумя разными клиентами в Эклипсе, баги которых нежно дополняли друг друга.

Тогда я выучил git. Git — это такой нелогичный набор утилит командной строки, в котором ежедневные операции выполняются последовательностью из двух–четырех команд. Первую неделю я тыкался в каждый угол, как слепой щенок. Я рисовал себе схему четырех хранилищ (working copy, staging area, local repo, remote repo), и подписывал стрелочками, какая команда и с какими опциями переносит информацию откуда куда. К концу этого периода адаптации я нащупал те заветные комбинации, которые мне нужны были в повседневной работе, и обрел некоторую смелость в перетасовке набора команд с листочка, заставляя их выдавать более-менее то, что мне нужно. Силу интерактивного коммита из коммандной строки, или, допустим, какие делать запросы, чтобы понять текущее состояние, я не освоил до сих пор. Порадовало, что репозиторий можно вертеть как угодно, пересвязывать что угодно с чем угодно, правда, магия для этого нужна соответствующая.

Недавно познакомился с Меркуриалом — тут я даже не пытался ничего учить, сразу графический клиент поставил, пожалел свой мозг. Почитал, как у них переписывается история, чтобы сделать commit amend — это ритуал с тремя получасовыми заклинаниями и одним „расширением“ (установка расширения заключается в том, что ты в конфиге прописываешь его название — типа до этого Меркуриал ничего о нем не знал, а теперь вот узнал). Изучить оба этих инструмента одновременно — ну я не знаю, кем надо быть:



„К чему это я веду?“ — спросит нетерпеливый читатель. Порог вхождения в РСУВ (DVCS) высок. Многие не пользуются ими не потому что думают, что это им не нужно, а потому что это на самом деле сложно. В том числе программисты, которые в большинстве своем тоже люди. Сами создатели больше внимания уделяют внутрненнему устройству, чем командному интерфейсу — ну так где же сторонние разработчики, где энтузиасты? Такой сложной вещи, как управление репозиторием, прямо просится, ну напрашивается же графический клиент! Их есть немало. Я посмотрел на маковский сектор — казалось бы, для людей должны делать.

Первый печальный факт заключается в том, что подавляющее число клиентов только и умеет, что показывать дерево и коммитить. Это уже кое-что — можно, по крайней мере, понять состояние репозитария, но в остальном означает, что чуть-чуть за границей прямолинейной истории коммитов ты опять останешься один на один с командной строкой.

Второй печальный факт заключается в том, что даже показать дерево они нормально не могут — хотя, казалось бы, ну если у твоей программы две функции, ну хоть их-то вылижи основательно.

К примеру, старый gitk прикладывал немало усилий, чтобы запутать своего пользователя:



Такой подход оправдан в случае Виндоуса и Линукса (а как иначе продавать поддержку?), но здесь вызывает вопросы.

На сегодняшний день (1.7.3.5) gitk немного исправился, но картинка все еще не способствует считыванию информации — цвета распределяются по непонятному алгоритму и вообще отвлекают, надписи не выровнены, что затрудняет сканирование:



Но! Самое интересное, что они на этом не остановились. По умолчанию gitk показывает историю в… барабанная дробь… перепутанном виде! Это у них зовется „нестрогая история“ или как-то так. Жму руку, наверное. Предполагается, что это должно упростить восприятие:



И, что характерно, пример подхватили (про это см. также третий печальный факт). Вот, например, пафосный Tower, который дерево рисовать вообще не любит (я его даже не сразу нашел — обычно у него там просто список коммитов размером на полэкрана a la github):



Вот gitx, не такой пафосный и реально с двумя функциями. Они, как и авторы gitk, решили сэкономить десяток-другой пикселей на левом крае в ущерб читаемости. И gitx, и предыдущий Tower дерево „строгой“ истории показывать вообще отказываются.



А вот egit, Эклипсовый плагин, для которого не то что дерево, для него надпись некриво нарисовать проблема. Я к этому был готов, но вот своим оригинальным видением он меня удивил:



Неожиданно неплохо показал себя SourceTree. Дерево у него не лишено самопересечений, но зато суть происходящего не скрыта за месивом кружков и линий.



Мне он очень нравится, но опыт показал, что создать мерж из него, например, не получается. Поэтому только для тупых задач. Зато умеет и git, и Меркуриал, не задает лишних вопросов (куда вы установили дистрибутив git-а?), но предугадывает правильные (имя и емейл для коммитов).

Я даже из интереса сделал свой вариант этого дерева:



Цвета убраны, самопересечений нет, мержи выделены, т.к. это не полноценные коммиты (по сути, не по реализации) — это пока все, что я придумал полезного. Если кто-то может посоветовать еще что-то — буду рад.

И, наконец, третий печальный факт. Есть клиенты, которые умеют чуть больше — наверное, руки дошли, успели. Но их „продвинутый“ функционал — это тот же самый набор консольных утилит, для которых просто есть кнопочки в интерфейсе.



Никто почему-то не додумался до простой мысли, что на основе того конструктора, того АПИ, который представляют собой git и hg, можно и нужно делать удобный, простой и понятный интерфейс, с новыми метафорами, действиями, возможностями; интерфейс, убирающий недостатки, а не повторяющий их; но все как один раз за разом повторяют то, что от бессилия наклепали авторы консольного интерфейса. Я настаиваю, что сегодняшние РСУВ — это не готовые к использованию продукты, а платформы, которые пока еще только ждут своего продукта.