narical

На Пикабу
поставил 98 плюсов и 38 минусов
отредактировал 0 постов
проголосовал за 0 редактирований
Награды:
10 лет на Пикабу
5620 рейтинг 25 подписчиков 6 подписок 5 постов 2 в горячем

Как начать понимать Git

На реддите в разделе "ProgrammerHumor" к бувально каждой шутке про git верхним, максимально заплюсованным комментом идёт ссылка на сайт https://ohshitgit.com/

Русская версия этой странички недавно была опубликована в виде поста на пикабу, что побудило меня написать данный текст. Он в первую очередь для тех, кто давно уже (месяцы или даже больше года) пользуется Git, но всё ещё регулярно копирует всю папку с проектом перед выполнением "страшных" команд. У меня этот период занял года два, а потом наконец случилось "просветление".

Причиной просветления послужил сайт think-like-a-git.net

Автор данного сайта обнаружил интересную закономерность. Люди в интернете, объясняя как работает Git, часто используют фразы наподобие: "Git становится намного понятнее, как только ты понимаешь, что...." - и далее часть фразы, которая вообще никак твоё понимание не увеличивает. То есть, существует странный понятийный разрыв - люди, которые поняли Git, не могут донести своё понимание, и это системная проблема. И тогда этот замечательный человек создал целый сайт, который коротко (относительно) и с юмором пробивает эту понятийную стену у тех, кто за много месяцев использования и чтения документации так и не пришёл в довольно очевидным вещам своим умом.

Когда я прочитал этот сайт, я сидел с открытым ртом и мыслью "Так вот оно что!". При этом, сайт не сообщает какой-то секретной новой информации. Он просто соединяет кусочки этой информации в голове читателя так, что происходит такой ощутимый щелчок, когда все части головоломки встают на свое место. И ты просто внезапно осознаешь, что фраза "git cтановится понятнее, когда ты его понял" перестаёт выглядеть для тебя бессмысленной тарабарщиной)))

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

Далее я кратко попробую сказать, о чем говорится на сайте "Think like a git", но не надейтесь что моё ультракороткое изложение может его заменить. ИДИТЕ И ЧИТАЙТЕ САЙТ.

Итак, о чем же Think-like-a-git?

Коммиты никуда не исчезают. Если вы сделали коммит - ваши данные в безопасности. Если вы в проекте из 1000 коммитов случайно сделали git reset --hard на первый коммит - вы не сделали ничего даже отдалённо ужасного. У вас есть определенная проблема - в выдаче команды git log вы видите один единственный начальный коммит, и не видите остальных коммитов, которые включают в себя (допустим) пару лет разработки. Но они там есть. Просто они недоступны. Но не в смысле "шеф, всё пропало!"-недоступны, а скорее "придется потратить полминутки, чтобы вернуть всё как было".

Представьте себе такой мысленный эксперимент. Мы берем Git-репозиторий, состоящий из файла text.txt. Копируем туда первую главу "Войны и мира", коммитим с комментарием "Глава 1". Потом берем, удаляем всё из файла, вставляем туда 2-ю главу и делаем git commit --amend, исправляя комментарий на "Глава 2". И так делаем 10 раз подряд. Команда git log покажет нам историю, состоящую из единственного сиротливого коммита, и если мы откроем файл - там одна только 10 глава. Потеряли ли мы первые девять глав? НЕТ! Они все остались в репозитории.

Можно подумать, что опция --amend переписывает последний коммит, но подумайте вот о чем. Имя коммита - это хэш от его содержимого+комментария+хэш родительского коммита. Как только вы редактируете хоть один символ и делает git commit --amend, вы получаете совершенно другой хэш. И совершенно другой коммит. Вы создаёте новый коммит каждый раз при --amend, но все предыдущие версии коммита никуда не пропадают и остаются лежать там же, рядышком, ожидая когда они вам понадобятся. И их содержимое реально (и несложно) достать обратно.

Вернемся к первому примеру, где мы сделали git reset --hard на первый коммит и "потеряли" 2 года разработки. Мы знаем, что где-то внутри репозитория есть второй коммит, который идет после первого, затем, третий, и так далее, вплоть до тысячного. Чтобы вернуть доступ ко всей истории, нам достаточно переключиться на последний коммит - и git немедленно "увидит" все предшествующие. Всё что нужно узнать - это имя, оно же хэш, последнего коммита.

А потом - прикрепить к нему ссылку с именем.

Если свести весь сайт "Think-like-a-git" к одной короткой фразе, то она будет следующей: "Ссылка обеспечивает к коммиту доступ". Создали ветку на коммите - и всё, информация никуда не денется и останется доступной. Снова вернемся ко второму примеру, с 10 главами "Войны и мира". Через git reflog получаем список всех 10 коммитов, которые находятся в репозитории. В каждом - по одной главе книги. Переключаемся на коммит, помеченный как "Глава 1", по его хэшу - git checkout %хэш_1%, и прикрепляем к нему ссылку любого типа. Можно создать ветку: git switch -c chapter_1. Можно создать тэг: git tag chapter_1

После повторения процедуры для всех десяти коммитов, мы можем перейти на ветку "master" и продолжить работу, но если нам вдруг понадобится текст глав с 1 по 9, достаточно посмотреть список веток/тегов и переключиться на нужный.

Обычно, если пользуешься Git из консоли - достаточно регулярно делать git log. Если даже случайно что-то напортачишь - достаточно пролистать историю консоли выше, скопипастить там имя нужного коммита, к которому потерян доступ, и всё починить в течение буквально нескольких секунд. И где-то на этом моменте страх что-то испортить начинает исчезать.

Проблема "запутанной рабочей копии"

Ещё одна вещь, о которой я хотел бы рассказать. Опять же, тщательно и подробно она описана вот тут (ОПЯТЬ ЖЕ, ИДИТЕ И ЧИТАЙТЕ!). Если коротко и сумбурно - опция git add --patch, или же коротко git add -p - позволяет добавлять в индекс файл "покусочно". И если вы не пробовали эту опцию - с высокой степенью вероятности, вы полюбите её с первого взгляда и больше git add без неё использовать не будете. Она прогоняет все изменения в каждом файле, кусок за куском, и спрашивает вас - "добавить этот кусок в index?". Вы просто отвечаете y/n. Очень часто это позволяет выявить (и не добавлять в коммит) ненужные вещи, вроде лишних вставок пустых строк или debug-код, который вы в процессе работы написали, но в коммите он строго говоря не нужен.

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

По-умолчанию, для нового файла в проекте опция --patch не работает, Git добавляет такой файл в index только целиком. Если вы хотите новый файл разбить по нескольким коммитам - необходимо сперва этот файл добавить с опцией -N, она же --intent-to-add - после чего опция --patch для него заработает.

Использование git diff / git show для быстрого включения в работу

Это просто маленький лайфхак, пишу его для тех, кто не в курсе. Допустим, вы работали над проектом, вечером в пятницу не успели ничего доделать (и в рабочем каталоге творится какая-то каша, и программа даже не компилится - ай яй яй, нехорошо так делать!).

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

Второй пример. Вам надо продолжить работу над проектом после перерыва в несколько месяцев. Вы открываете проект, там несколько десятков файлов лютого, запутанного кода. Вы не понимаете, как он работает и что он делает, несмотря на то, что это ваш собственный код. git diff пишет, что рабочий каталог без изменений (к счастью!).

Первое действие - git log, и читаем комментарии к коммитам. В памяти постепено начинает всплывать, над какими функциями вы работали, когда последний раз трогали этот проект.

Второе действие - git show HEAD и читаем последний коммит. Затем git show HEAD~1 и читаем предпоследний. И ещё один. Если коммиты сделаны по всем правилам - небольшие и содержат только одно небольшое изменение - то проект читается как открытая книга. И через короткий промежуток времени в голове восстанавливается тот рабочий контекст, в котором вы вносили последние изменения в проект. Можно продолжать работать.

Как можно потерять сделанную работу?

Главная опасность - это потерять несохранённые изменения. Если у вас в рабочем каталоге накопилось изменений на кучу коммитов, в процессе разбивки кода по коммитам можно знатно обосраться и случайно сбросить несохранённые изменения. Если и есть причина перед работой с Git сделать копию проекта - то это она :) Я предпочитаю в таких случаях сделать огромный коммит со всеми изменениями в кучу, добавить ему ветку или тэг типа saved_commit, после чего сделать git reset HEAD~ (при этом все изменения снова окажутся в рабочем каталоге) и начать распихивать всё по коммитам. В случае проблем:
1) git reset --hard сбрасывает рабочий каталог (уничтожит всю сделанную работу, если не сохранить её в коммит предварительно!)
2) git checkout saved_commit заново заполняет рабочий каталог плодами многочасового труда
3) git reset master возвращает указатель на ветку master, рабочий каталог содержит все изменения из saved_commit,

Вторая опасность, о которой неоднократно писали в комментариях - это делать git push --force. Но это выходит за рамки данной статьи.

Показать полностью

Хотите усомниться в собственной вменяемости?

Просто по-быстренькому нагуглите плотность "Литола-24".

У меня всё. Даже теги не представляю какие поставить, но пикабу требует.

upd: пожалуй, обновлю пост уточнением. Очевидно, существует проблема. Она не очень большая и (скорее всего) не очень важная, но я всё равно пытаюсь привлечь к ней внимание.

upd2: штош. пост заминусован, и ни один из этих десятков сайтов не будет исправлен. Не big deal, но воспользоваться силой пикабу чтобы донести хотя-бы до некоторых из тех самых копирайтеров - не удалось.

Нужна ваша помощь, Пикабу!

Так вышло, что я столкнулся с мошенничеством на одном из сайтов частных объявлений и думаю пойти написать заявление в полицию. Останавливает только то, что меня просто отфутболят. Очень буду рад, если со мной свяжется кто-нибудь с успешным опытом подачи заявления (чтобы завели номер КУСП и "началось" официальное расследование). Ну и советы знающих людей будут не лишними.


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


Всегда считал себя осторожным человеком, но как оказалось - попасться может каждый. Мой самый первый совет, который бы совершенно точно спас меня. Перед тем, как отправить деньги - погуглите название магазина, ник продавца, все что указано в качестве его данных... В моём случае ответ был В ПЕРВОЙ ССЫЛКЕ выдачи гугла.

Пожалуйста, не сбивайте моноколесников!

Очень странно, что приходится писать это.

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


В 2 часа ночи на субботу, 17 ноября 2018г, на Литейном проспекте Санкт-Петербурга недалеко от уже поднятого Литейного моста, на узком тротуаре я остановился перед группой людей, судя по всему вышедших после бара покурить. Проезжая часть в этом месте отгорожена забором, поэтому я просто остановился в ожидании, когда меня заметят и пропустят. Ребята разошлись чуть в стороны, давая мне проехать, и когда я уже проехал мимо - один из шедших навстречу ударил сбоку по моноколесу ногой, выбивая его из-под меня. Колесо улетело вперед, покрутилось волчком и упало, я удачно спрыгнул с него и удержал равновесие. Мало того, что при таком падении на гранитные плиты можно переломаться и разбить голову - через 5-7 минут после падения на колесе сгорел контроллер. Колесо стоит 40 тысяч (модель KingSong ks14d на 350 Вт*ч) - это примерно моя месячная зарплата, в лучшем случае.


Я надеюсь, что этот текст прочитает очевидец события и передаст мой привет тому парню.


Увидев меня впервые в жизни, чувак, ты за несколько секунд принял решение меня покалечить и уничтожить чужую вещь, на которую я зарабатывал месяц. Ты так же бьешь ногой велосипедистов и проезжающие машины?


Я очень рад, что колесо сгорело не сразу, дав мне возможность отъехать подальше. И что я, обернувшись, не смог понять кто ты среди этой толпы в 10-12 человек. Возможно, в этом случае я бы уже сидел в полиции, а ты - в больничке. Может и наоборот. В любом случае, результат этой ситуации был бы хуже либо для одного, либо для обоих - и ни одного положительного момента. Это было плохое решение, успей вспомнить об этом в следующий раз, когда решишь поступить так же.


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


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


Господа, моноколесо это не безобидная игрушка, это наш транспорт. Мы используем его для перемещений по городу и поездок на работу. Мы - не "хипстеры", а обычные взрослые люди (ценник на минимально хорошее колесо начинается примерно с 40 т.р.) - возрастной состав питерского сообщества моноколесников располагается в вилке от 30 до 50 лет примерно. И вы можете сильно прогадать с оценкой нашей скорости, если вдруг решите прыгнуть с целью испугать - столкновение на скорости 30 км/ч ничего хорошего не принесет обоим.

Показать полностью

Про радиоуправляемые вертолёты

В очередной раз, в комментах к посту о подарке на 23 февраля я натыкаюсь на фразы вроде "игрушка на один день", "только пыль собирает", "быстро надоедает" и так далее. Причина очень проста - в 90% случаев дарят неправильный вертолёт!

Если на пикабу поискать посты по тегу "радиоуправляемый вертолет", то можно легко убедиться - все подаренные людям вертолёты выглядят одинаково: у них 2 винта и палка-балансир. Что это значит? Тут понадобится небольшой ликбез.

Возможности вертолётов (и то, насколько быстро они надоедают) зависит от количества каналов управления. Например, надпись 3CH означает "3-channel" - три канала управления. Основная масса подаренных вертолётов - как раз из таких. Дело в том, что с ростом количества каналов управления растёт и цена - причём по экспоненте. Но дело не только в цене - чаще всего в продаже кроме 3CH-моделей ничего и нет!

Итак, различия в каналах управления и масштаб цен:

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

3CH (1500-2500р) - умеет вверх-вниз, наклон вперед-назад и повороты. При наклоне вперед - летит вперед, аналогично работает "задний" ход. Обычно у него два винта с балансиром, а задний винт горизонтальный - за счёт него вертолёт наклоняется. Именно такие обычно дарят :)

4CH с балансиром (2500-3000р) - умеет вверх-вниз, наклоны вперед/назад и влево/вправо. У него один основной винт с балансиром, а задний винт вертикальный и служит для противодействия крутящему моменту основного винта. Несмотря на кажущиеся незначительными отличия от 3CH, управляется абсолютно по-другому. Именно такой стоит дарить взрослому человеку.

4CH без балансира (4000р) - всё то же самое, что и вариант выше, только балансира нет :) Может сделать мёртвую петлю. А ещё новичок не сможет на нём летать. Совсем.

6CH (6000р) - выглядит так же, как предыдущий вариант. Основной винт, задний винт. Может ВСЁ. Развивает огромные скорости. Может летать (и висеть) "кверх ногами". Может зависать вертикально (основной винт в вертикальной плоскости!). Может делать бочку.

Итак, какие проблемы есть у 3CH-вертолётов?
1) Они СКУЧНЫЕ - из-за своей конструкции они крайне стабильны и управляемы, так что и ребенок справится. Они легко висят на одном месте в воздухе, могут лететь только вперед и назад, причём довольно медленно - около 0.8-1 м/с.
2) Инфракрасный пульт управления - радиус действия ограничен считанными метрами, требуется прямая линия видимости.
3) Встроенный аккумулятор - 5 минут полёта, после чего 40 минут зарядка.

Ничего удивительного, что о таких вертолётах говорят - "игрушка на пару дней". Кстати, чтобы скомпенсировать простоту и "скучность", на 3CH-модели часто навешивают разные штуки для развлечения - водяная пушка (подлететь и стрельнуть водой в лицо), пушка с мыльными пузырями, корзинка на лебедке (можно поднимать/опускать), видеокамера с управлением с iOS/Android и трансляцией видео на экран устройства.

Что может предложить 4CH-вертолёт?
Самое главное - он не скучный и не надоедает за пару дней. В отличие от 3CH, которые висит в воздухе "сам", 4CH-модель надо научиться удерживать в нужной точке, прилагая для этого определенные усилия. Поначалу, пока нет навыка, вертолёт постоянно бьется об стены и пол.

Взлёт - удар. Взлёт - удар. Взлёт - удар и сломанная лопасть.
Замена лопасти, взлёт и снова удар. Процесс полёта доставляет огромное удовольствие - ты постепенно одерживаешь верх над машиной, учишься её контролировать, удары становятся реже. В отличие от 3CH, можно развивать огромные скорости (в 5-8 раз быстрее) и улетать на десятки метров - управление по радио-каналу. Сел аккумулятор после 7 минут полёта? Они сменные, у тебя ещё 3 штуки есть! Вставил свежий, летаешь дальше - а разряженный в это время заряжается. 4 аккумулятора - это примерно полчаса полёта.

Скажу честно - с теми вертолётами, которые обычно дарят в подарок, это не идёт ни в какое сравнение: просто земля и небо.

Я лично рекомендую для начинающих (и в подарок!) модель WLToys V911-Pro - она очень популярна, дешева (~2500р) и к ней всегда можно найти недорогие запасные части. Обращаю внимание, что существуют разные варианты комплектации - RTF это полный, с пультом в комплекте, а есть ещё BNF для людей, у которых уже есть подходящий пульт.

Сам я обитаю в Питере на "Большевиках" - если кто заинтересован, можно со мной встретиться и пару раз треснуть об стену мой 911й :)

P.S. пост ни в коем разе не рекламный, я не имею отношения к компании WLToys (кроме личного опыта владения упомянутым вертолётом), просто у них самые дешевые "четырехканальники" с доступными запчастями.
Показать полностью
Отличная работа, все прочитано!