2013-08-31

Advanced Mercurial

Очень много людей вокруг, активно используют Mercurial, но при этом ограничиваются базовыми вещами типа push/pull/commit/update да и те выполняются через tortoisehg. Я в начале августа выступал с рассказом о чрезвычайно полезных фичах, про которые, когда начал пользоваться, думаешь: как же я жил без этого раньше. Слайды оформлю в виде шпаргалки.

GitFlow

Тут важен даже не инструмент, а сам подход. Есть перевод на русский. Зачем это нужно становится понятно, когда в одном проекте начинают работать человек пять. Мы медленно пришли к понимаю необходимости.

Rebase

Крайне полезный инструмент, который может показаться немного не интуитивным. Рассмотрим ситуацию: вы пилите фичу в отдельной ветке, регулярно пуша изменения в центральный репозиторий и периодически подтягивая из него изменения. История может выглядеть так.

В случае же с ребейзом история начинает выглядеть так. Ценой сохранения изменений локально можно сохранить историю чистой не подмешивая в diff изменения из других веток. Главным минусом тут является отсутствие пуша в центральный репозиторий. Жесткий диск может полететь, наводнение, метеорит. Про это же говорят в JetBrains, но Мэт готовит достойный ответ: эволюционирующая история, которая пока в процессе разработки.

Стриптиз

Иногда нужно удалить ветку, совсем удалить, на случай если вы закоммитили "launch codes for the nuclear arsenal". Для этого есть команда hg strip abcd1234. Которая удалит ветку. Если вдруг ветка ушла в центральный репозиторий, то придется выполнить стрип всей команде.

Если вы, выполнив эту команду, вдруг передумали или стрипнули лишнего и хотите все вернуть взад как было, то не беда: после стрипа меркуриал пишет что-то вроде saved backup bundle to A:\Work\Temp\.hg\strip-backup\e0d0e313de56-backup.hg. Многие, если не все, необратимые команды делают бекап, который можно восстановить командой: hg unbundle "A:\Work\Temp\.hg\strip-backup\e0d0e313de56-backup.hg". Кавычки нужны, если есть пробелы.

Просто удалить коммиты, оставив файлы в неизменном состоянии позволит hg strip -k abcd1234. Часто пользовался этим ключом, пока не узнал про следующую фишку.

Amend

Этот ключ добавили совсем недавно, позволяет обновить предыдущий коммит (если он еще не запушен): добавить или удалить файлы, изменить текст коммита. Команда hg commit --amend -m "Текст сообщения". Если не указать текст, то откроется текстовый редактор с предыдущим сообщением.

Сдвиг по фазе

Мощная архитектурная фича, которая сейчас пронизывает очень многие и позволяет реализовать много интересных вещей. В репозитории есть три фазы.
public - коммит ушел наружу или пришел снаружи, его нельзя менять (например через --amend или ребейзить)
draft - коммит находится только в текущем репозитории и его можно покойно менять
secret - коммиты исключаются из синхронизации с центральным репозиторием. Поднять фазу на более публичную можно, опустить - нет (на самом деле можно, но через --force "да я понимаю что я делаю").

А хто это наделал?

Командой annotate можно посмотреть кому принадлежит конкретная строка, когда и в какой ревизии она была изменена, посмотреть текст сообщения чтобы понять зачем это было написано. IntellijIDEA позволяет это делать прям в исходнике. Это стало просто must have фичей. Тем не менее это можно сделать через tortoisehg нажав неприметную кнопочку. Ну или через консоль в конце концов.

Cherry Picking

Совсем недавно узнал про эту очень полезную штуку: командой graft можно скопировать и замерджить изменения из произвольного чейнджсета. Можно передавать багфиксы без мерджа двух веток. При этом нужно поддерживать чистоту коммитов (чтобы не перенсти чего-нибудь лишнего либо, наоборот, недонести). При этом tortoisehg нарисует пунктирную линию.

Поиск по ревизии или фрагменту сообщения

В tips and tricks написано про log -k. Удобно искать номера тикетов и числовой номер ревизии по хэшу. В последних tortoisehg можно нажать View-Filter toolbar и вводить поисковый запрос в поле. Раньше как-то с этим были проблемы, в последнем всё работает.

Игнорим хлам

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

Shelve

Фича tortoisehg, позволяет сохранить незакоммиченные изменения в отдельное хранилище, если, например, потребовалось посреди работы срочно переключиться на другую ветку, а коммитить текущие изменения не хочется. У самого меркуриала есть плагины shelve и attic, которые, увы, не идут в стандартной поставке.

Консоль под рукой

Опять же в tortoisehg есть консоль, которая позволит пользоваться нереализованными еще в интерфейсе фишками типа --amend. Весьма неочевидно что в окне лога можно набирать и выполнять консольные команды.

Не забываем закрывать ветки

Влитые и мертвые ветки нужно закрывать как можно раньше, чтобы не получалось такого. Ценой потери хэшей можно изредка сортировать репозиторий. Хотя, спустя какое-то время история уходит вперед и это безобразие перестает мозолить глаза в повседневной работе. Так что опционально.

Прочее

Как хранить документацию, схему базы, зачищать лишние бинарные файлы.