Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Я могу объединить два комита в один? Нет!
В команде всегда есть некая главная ветка из которой можно взять и делать чуть ли не релиз прямо сейчас. В идеале она всегда находится в адекватном состоянии. Но на практике главная ветка ломается после мержей с другими ветками в которых велись работы по новой фиче, рефакторингу или баг-фиксу. Вот именно эту ветку и называю trunk. Другое удачное название release-brunch.
неудобного/неинтуитивного интерфейса (опять же, по сравнению с другими командами)Удивлен. Чтобы освоить mq мне хватило чтения короткого туториала и далее иногда
hg help mq
. И оно не требует каких-то дополнительных знаний о том, как устроен mercurial, работа идет с привычным, простым и понятным инструментом — набором патчей.hg up
.[phases] publish=False
. histedit требует указания drop для удаляемых изменений, тогда как git обходится обычным удалением строки, что быстрее
в mercurial нет fixup и exec
Ну и нельзя одной командой и переместить изменения, и изменить их порядок следования.
hg edit <rev>
, hg medit <rev>
для редактирования коммита и изменения сообщения соответственно. Если нужно исправить один коммит, то это получается удобнее т.к. не нужно ещё в текстовом редакторе писать операцию, как при обычном histedit
.Эта необходимость указывать символ «d» для удаления отлично помогает от случаев, когда переставлял несколько коммитов и какую-то строчку случайно удалил или забыл вставить. У меня несколько раз точно такое бывало. Да и удаление строки не сказал бы что быстрее :)Я в этом отношении более аккуратен, потому и имею другое мнение.
fixup это же просто fold, как написано в документации, только сообщение одного из коммитов игнорится?Да.
Кейсов для использования exec я что-то не смог представить, приведите пару примеров. Mercurial хорошо поддаётся различному расширению функциональности, поэтому если это реально полезная фича, думаю её добавят.Use-case для exec я тоже не знаю, но зачем‐то же он есть в git. То, что я могу представить проще и безопаснее делать без exec.
Это я что-то вообще не понял. Изменение порядка коммитов это же по сути и есть перемещение части из них?Я имею ввиду, что
A-{B-C,D-E}
можно превратить одной git rebase -i
в A-B-C-E-D
, тогда как с mercurial вам придётся сначала делать A-B-C-D-E
(или A-{B-C,E-D}
), а потом уже только A-B-C-E-D
: histedit не делает rebase.dd
(в любой части строки) vs Rdrop^[
или cwd^[
(но только в начале строки, то есть прибавляется ещё и команда на переход в начало строки) (вместо ^[
подставить ESC). Согласитесь, первое гораздо быстрее остального.<C-k>
для удаления против многоклавиш (вероятно, легче всего <C-d><C-d><C-d><C-d>d
) для замены).<C-y>
, замена потребует больше клавиш (вероятно, наиболее простыми является либо <INS>drop
, либо то же, что и у nano).<C-d>
для удаления всей строки. Для замены на drop вероятно легче всего использовать <C-S-Right>d
.<C-k><C-k>
для удаления до конца строки (т.е. курсор должен быть в начале) и <C-DEL>d
для замены первого слова на d (замечу, что клавиша DEL несколько дальше k и потому первое набирается значительно быстрее).<C-d>
(на самом деле осуществляет комментирование, если судить по этой PDF’ке). Считается, что kate знает, что такое «комментарий» в файле от git rebase. Если нет то, см. следующий абзац.#
: git воспринимает такие строчки как удалённые.hg ci
/git commit
)? Ну вот выяснили вы, что в некоторых случаях удобнее удалить строку, а в некоторых — поставить «d» в начале, и что?git rebase -i
из командной строки то рука вероятно не находилась на мыши. В этом случае, даже стрелочки + <Home>
/<End>
будут быстрее, чем заново искать основную позицию для правой руки (programming dvorak) после использования мыши: в отличие от позиций клавиш дополнительных блоков клавиатуры месторасположение мыши не фиксировано относительно основного блока. С us правда e[dit], f[old] и d[rop] на левой руке, только m[ess] (и p[ick]) нет, с git вообще все действия на ней (кроме p[ick], но последнее уже написано в обоих случаях), но перемещение руки на мышь всё равно остаётся более дорогим действием, чем перемещение на дополнительный блок, а <S-Home>
/<S-End>
— более быстрым, чем выделять мышью (если только не поддерживается тройное нажатие).<Home>
.А вообще, зачем всё это обсуждение таких небольших различий в скорости выполнения действия, которое обычно делается достаточно редко (например, реже чем hg ci/git commit)? Ну вот выяснили вы, что в некоторых случаях удобнее удалить строку, а в некоторых — поставить «d» в начале, и что?Ничего. Ваш изначальный комментарий, ваш ответ и мой ответ на ваш ответ (считать те два мои комментария одним, я просто не успел отредактировать) были гораздо шире и касались более важных вещей. Но на следующем ответе вы уже коснулись только быстроты предпринимаемых действий и я просто продолжил доказательство тезиса, сомнение в котором было вами высказано. В данном случае — что удаление строки быстрее в любом редакторе.
И ещё, я категорически не понимаю, как использование редактора описанным вами способом сочетается с возможностью случайного удаления строки.
Но на следующем ответе вы уже коснулись только быстроты предпринимаемых действий
Я ваше мнение понял, а вы никак не хотите признать что такое использование текстовых редакторов (перемещение клавишами) удобнее не для всех. Мне, например, намного удобнее и привычнее (соответственно, быстрее) указать позицию в редакторе мышью, чем идти к ней стрелками или смотреть точное число строк на сколько надо перейти. Поэтому, хотя при наборе команды в командной строке рука обычно не на мыши, потом для редактирования появившегося файла её в любом случай надо перенести на мышь. Странно, что дело вкуса и (даже больше) привычки вы пытаетесь рассматривать как «тезис», для которого возможно доказательство :)Тезис — не удобство. Тезис — скорость. Я очевидно не смогу доказать, что всем удобнее было бы не использовать мышь в таких случаях. Даже я сам бы с этим не согласился, вспомнив о том, что использовал до изучения Vim. Но можно показать, что неиспользование мыши будет быстрее.
Вырезал (в смысле Ctrl+X, а не удалил) строчку, стал смотреть по графу куда надо вставить, отвлёкся на перемещение другого коммита, про первый забыл (так у меня раз было).Понятно. У меня просто другой порядок действий: сначала смотрю, куда перемещать, потом уже выполняю перемещение. Соответственно к моменту удаления решение уже принято. Как‐то не подумал, что может быть иначе: зачем удалять строчку, если неизвестно надо ли удалять её вообще (может, проще переместить другую)? Да и в части случаев (именно в это время мною обычно используется fixup) я знаю, что с чем буду объединять ещё до фиксации изменения (ещё плюс git: наличие autosquash).
Остальная часть вашего комментария — это факты, которые и так понятно что верны, и смысла их обсуждать нет:Можно было их дополнить (тем же autosquash). Или обсудить необходимость возможности histedit также делать rebase (я считаю это удобным, так как не придётся решать конфликты по два раза (из‐за rebase и из‐за изменения порядка; конфликты разные) в худшем случае, но аргументы против я тоже могу представить).
Тезис — не удобство. Тезис — скорость. Я очевидно не смогу доказать, что всем удобнее было бы не использовать мышь в таких случаях. Даже я сам бы с этим не согласился, вспомнив о том, что использовал до изучения Vim. Но можно показать, что неиспользование мыши будет быстрее.
Нет, не будет. Быстрее то, к чему привык, а для привыкшего к использованию мыши совместно с клавиатурой будет быстрее именно использование мыши.Будет. Я говорю о скорости способа, а не скорости вас настоящего, который может им воспользоваться. При длительном использовании нового способа возникнет новая привычка. Скорость исполнения имеет смысл сравнивать только с учётом её возникновения и по прошествии некоторого времени. А чтобы не делать такое сравнение чисто экспериментальным — надо исходить из расстояний, на которые перемещаются кисти и пальцы и времени на бессознательный поиск новой позиции.
Я сам думал о том, чтобы начать повсеместно использовать vim, видя как некоторые преподы у нас быстро и (на вид) удобно им редактируют файлы, но привычка перевесила это желание :) Тем более, что непосредственно набор кода/текста — занимает относительно небольшую часть времени.У sublime есть Vim-mode, vintage mode или что‐то в этом роде. У самого Vim есть большое количество проблем, связанных с исторически допущенными архитектурными просчётами либо же являющихся данью обратной совместимости (а то и тем, и другим сразу). Насколько я знаю в sublime можно запихать фактически что угодно, что поддерживает Vim, причём написать всё на Python, в Vim добавление части возможностей того же sublime (к примеру, поддержка
<C-S-Key>
или <C-Key>
для не‐ASCII и некоторых ASCII символов) требует неплохого знания C, а то и вдобавок желания провести refactoring.Относительно rebase. Бегло просмотрев документацию, я не совсем понял как происходит собственно rebase. Вот например есть дерево A-{B-C,D-E} и мы хотим сделать A-B-D-E-C. Как достичь этого?У вас другой пример, я ответа на него не знаю. Точнее знаю, но это те же две команды¹, что и с mercurial (вариантов несколько, но все требуют как минимум две команды). В моём (A-{B-C,D-E} → A-B-C-E-D) — это та же команда (
git rebase master
, предполагая, что E — текущая ветка, а C — master), к которой просто добавили --interactive. Останавливаться именно на таком варианте (не прося изменить ветку, на которую происходит перенос той же командой) обычно имеет смысл, так как у меня чаще всего A-B-C — публичная master и менять её категорически не рекомендуется, а D-E, которую хочется превратить в E-D — feature branch. Соответственно, превращать A-B-C в A-B-D-E-C не нужно или даже невозможно (не примет upstream).hg rebase --source D --dest B && hg rebase --source C --dest E
(можно использовать намного меньше символов, но так понятнее)hg rebase --base E --dest C && hg histedit -r B
--source D
и --base E
(а также --rev D..E
) эквивалентны. Git использует только --base
(за исключением формы git rebase --onto master topicA topicB
, эквивалентной hg rebase --rev 'topicA..topicB - topicA' --dest master
).hg log -G
(начиная с версии 2.3, а сегодня кстати выходит 2.7 по плану). Цитата из вики Mercurial: As of Mercurial 2.3, log supports -G without any extensions. The included graphlog extension merely adds glog as an alias to log -G.
Полезности Mercurial