From Novosibirsk, Russia? Our tiny company is looking for current or future rock-star developers.

December 15, 2007

Девять причин перейти на Git

Обновление: см. также пост «Всё, что нужно знать про Git».

Когда-то я рекомендовал CVS, если вы пользуетесь системой контроля версий в основном для резервного копирования, и что-нибудь вроде Mercurial, если видите в этом искусство.

Теперь всё изменилось. Я однозначно рекомендую одну систему контроля версий для любых потребностей: Git.

Причины:

0. Я бы даже не стал упоминать это, но ведь кто-нибудь спросит. Git — распределенная система контроля версий (разумеется). Дальнейшее описывает, почему он лучше Mercurial, Bazaar, darcs и др.

1. Репозиторий остаётся в ваших руках. В CVS, например, файлы имели вразумительный формат, и к ним по большой потребности можно было применить /dev/hands или /usr/bin/perl (что мно-о-ого раз спасало автора этих строк).

Ваши возможности в Git на порядок больше, поскольку весь его высокоуровневый интерфейс — это всего лишь набор скриптов, использующих утилиты низкого уровня в лучших традициях Unix. Теми же утилитами удобно править базу данных и вам. (В крайнем случае можно и руками — вся база хранится в зазипованых текстовых файлах простого формата, имя которых является SHA1-хешем содержимого.)

2. За git-commit --interactive можно продать душу. Этот минималистский консольный интерфейс для выбора входящих в коммит изменений лучше всех виденных мною GUI.

3. Двусторонняя синхронизация с CVS и Subversion. Если работодатель или автор любимого плагина имеет консервативные взгляды, вас это не остановит. (Правда, commit'ы в CVS экспортируются наполовину вручную.)

4. Man, it's sane. Логичный и предсказуемый. Скажем, мне нравится концепция index'а (и записи в него по git-add) и отслеживания перемещений по содержимому (команды вроде svn mv всегда доставляли одни проблемы). Естественно, это субъективная оценка.

5. Теперь есть адекватная версия для Windows. Разумеется, это не преимущество перед другими, но до появления MinGW-порта круг применений был ограничен. (Не попадайтесь на провокации и не качайте версию, которая пытается скомпилировать Git при инсталляции! Это всё проделки Ктулху. Инсталлятор нормальных бинарников работает отлично.)

6. Git умеет строить из себя CVS-сервер, так что ваша любимая IDE будет с ним общаться, как с родным. (С другой стороны, под OS X мне удобнее пользоваться командной строкой, чем поддержкой в IDE.)

7. Git имеет красивый веб-интерфейс out of the box. Я привык выбирать продукты, хорошо работающие из коробки, и это для меня хороший знак. (Ср. с убогой умолчательной темой у Mercurial.)

8. Формат репозитория дружелюбен к rsync, обычному HTTP и backup'ам. Коммиты только добавляют новые файлы, не изменяя существующих. (Не считая файлов-ссылок вроде HEAD и refs/heads/master, но их мало и они очень маленькие.) Файлы репозитория можно раздавать через HTTP любым веб-сервером. Эффективно работает rsync. (Однако: после push'а изменений через тупой протокол на сервере нужно выполнить специальную команду Git, обновляющую некоторые файлы.)

9. Как следует из пункта 1, с использованием низкоуровневых утилит можно писать свои скрипты, делающие что-то интересное и новое. Многие этим воспользовались, так что у Git есть расширения (например, для patch queues, если вам сиё актуально) и альтернативные интерфейсы.

Одним словом, что бы вы ни думали про ядро Linux, за создание Git Линуса Торвальдса точно можно уважать.

Недостаток один — в процессе работы (иногда) требуется вовлечение мозга. Впрочем, всё реже и реже — например, магическое заклинание «git-reset --hard HEAD^» / «git-commit -c ORIG_HEAD» теперь стало частью «git-commit --amend». В любом случае, перед применением Git вам придется разобраться в его внутренностях (вся информация есть в tutorial'е и в man'ах).

Смотрим и наслаждаемся: Linus Torvalds on git (Google Tech Talk).

11 comments:

Yuri Baburov said...

Фактически, все твои причины перейти на Git -- это незнание преимуществ других систем контроля версий.

Для bazaar выполнены все тобой перечисленные пункты, кроме интерактивного "минималистского консольного интерфейса". Но я не знаю, зачем такой интерфейс мне мог бы быть нужен.
Минус -- работает bazaar медленнее для больших проектов или огромных changeset'ов.
Плюсы (для меня) -- написан на python, имеет плагины на питоне и не требует "В любом случае, перед применением Git вам придется разобраться в его внутренностях (вся информация есть в tutorial'е и в man'ах)".

Unknown said...

Я как раз против VCS, написанных на Питоне, после плотного общения с Mercurial. Для меня Toolkit Design («The Unix Way») — большое преимущество Git.

Пункт «может строить из себя CVS-сервер» для Bazaar не выполнен, или я что-то упустил. Я полагаю, что эмуляция CVS-сервера — очень умный и правильный подход к интеграции с IDE вроде Eclipse (к которому полноценный не-CVS team provider еще никто не смог написать).

Кроме того, я уже сказал, что Git даёт ощущение владения репозиторием, которого не было ни с какой другой VCS.

Yuri Baburov said...

>Пункт «может строить из себя CVS-сервер» для Bazaar не выполнен, или я что-то упустил.
1) Я упустил. Но потом оказалось, что есть средство, которое развивается:
https://launchpad.net/bzrcvsserve
Кроме того, давным давно уже есть tailor для синхронизации разных репозиториев друг с другом.
2) А вообще, я не понимаю, как ты в CVS commit сможешь отобразить перемещение файла в другой каталог.
3) Есть GUI для bazaar. Есть плагин для eclipse. Свои преимущества, как видишь.
>Для меня Toolkit Design («The Unix Way») — большое преимущество Git.
1) выдача bazaar -- текстовая. есть специальные опции для этого. никто тебе не мешает сделать the unix way.
2) почему это ты не ставишь питон на один уровень с перлом и башем? тоже вполне себе скриптовый язык.

Unknown said...

Да, bzrcvsserve — это правильно. Как там с перемещениями, не знаю. Git'у не нужно сообщать о перемещениях, поэтому с ним такой проблемы нет.

Toolkit Design — это не парсинг текстовой выдачи, это набор низкоуровневых команд для работы с объектной базой, ссылками и индексом Git, а также для его сетевых операций.

Например, git-commit — это sh-скрипт, который использует git-rev-parse, git-runstatus, git-diff-files, git-update-index, git-var, git-commit-tree и git-update-ref..

Anonymous said...

По поводу пункта 2 - darcs record гораздо удобнее, чем git-commit --interactive или hg record.

Многого стоит одно то, что Enter не надо после каждой команды нажимать.

Michael Shigorin said...

buriy
> это незнание преимуществ
> других систем контроля версий.
Извините, но у безобразия по имени bazaar/bzr преимуществ попросту нет. Все это знают, вот никто и не пользуется, кроме упёртого Марка.

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

Только полный страус может хвалить это убунтушное поделие, столкнувшись с git.

Про питон помолчу, а то совсем обидно получится.

Yuri Baburov said...

michael,
у этого bzrобразия тоже есть преимущества.
если он тебя не устраивает -- не пользуйся.
аналогично с питоном. я бы спросил, какой твой любимый язык программирования, и с радостью его обосрал, только это не сделает мне чести.
могу обосрать и git, потому что я им тоже пользуюсь.

так что, всё ещё думаешь, что есть смысл кидаться какашками, обезьянка?

Michael Shigorin said...

Уважаемый просто лось, мы с Вами на брудершафт не пили. И консультироваться у Вас о том, чем мне пользоваться или не пользоваться -- не вижу смысла.

Пользоваться этим поделием доводится при взаимодействии с ltsp upstream, который угодил в заложники калоникала.

Преимуществ у bzr перед git мне неизвестно. Вообще. Откопать хотя бы одно предлагаю в качестве домашнего задания.

"Оно используется в launchpad" -- не преимущество, а данность; мало того, аккурат там и наблюдался наиболее феерический repo corruption (можете спросить у народа с #ltsp -- половина тоже убунтушников, но явно поумней и о гите они вздыхали).

Перед тем, как "обсирать" что-либо -- подумайте о том, что я как раз на питоне писал тогда, когда Вы, сударь, пешком под первый курс ходили. И не имею любимого языка, а применяю с десяток сообразно задаче (чаще всего это шелл, ruby и scheme).

Чести же человеку с таким культурным уровнем, как Ваш -- не сделает уже ничто, боюсь. Ну вот разве что можете починить свои #34956 и мож #143977, прежде чем высовываться на публику со своим базарным флажочком.

Michael Shigorin said...

Хотя... Юрий, предлагаю дружно вспомнить, что люди важнее технологий.

Простите мне обидные слова. Не стоит оно того.

EKryukov said...

А в чем преимущество Git перед SVN?

Unknown said...

О том, почему DVCS - хорошо, лучше всего узнать из techtalk'а Линуса Торвальдса, на который есть ссылка в конце поста.