1817

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

На реддите в разделе "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. Но это выходит за рамки данной статьи.

Автор поста оценил этот комментарий
Приведите пример: когда вы печатая в консоли команду, делаете это быстрее чем я через GUI? И вот только не надо что-то извращенное с тысячами параметров.
раскрыть ветку (1)
6
Автор поста оценил этот комментарий

Это не так работает. Когда я что-то делаю - я делаю это удобно и быстро, поскольку освоил инструмент. Когда вы что-то делаете, то делаете это удобно и быстро, по той же самой причине. Это не какое то соревнование, это вопрос личного удобства и предпочтений. Мне удобно в консоли, и неудобно в графическом виде.


Тем не менее, кое какой пример я могу привести. Мой рабочий процесс не меняется, независимо от того, где физически находится комп. У меня две вкладки в консоли, и в одной я работаю на локальной машине, делаю git push, потом альт-таб на вторую вкладку и там делаю git pull, но вторая машина находится за сотню километров. Потом я выясняю, что на ней есть проблема, и прямо на ней отлаживаю код, после чего на ней делаю git commit / git push и на локальной - git pull. Смысл консоли в том, что ты работаешь с компами по всему миру одинаково.

показать ответы
2
DELETED
Автор поста оценил этот комментарий
Не то что пост, я даже комменты не понимаю... Может кто русским и простым языком объяснить что такое Git? Часто туда ведет поисковик, но как только туда захожу - перестаю понимать вообще что-либо...
раскрыть ветку (1)
5
Автор поста оценил этот комментарий

окей, мне не лень... git это система контроля версий. Допустим, ты пишешь книгу. У тебя есть папка, где на 1 главу книги - один файл. В процессе написания ты иногда будешь удалять и переписывать большие куски заново. Система контроля версий - это такая штука, которая позволяет сохранять всё что ты написал, в любой момент вернуться назад во времени и достать нужный кусок текста, который ты давно удалил. Например, ты начал писать первую главу и сразу туда вставил сцену секса главного героя. Работая над главой №3 ты решил, что сцену секса надо бы удалить. А через полгода, в процессе работы над 15-й главой, ты такой "Эх, всё-таки я её сюда вставлю!", отматываешь историю на полгода назад, копируешь кусок текста из первой главы, снова перематываешь историю вперед, вставляешь текст в 15 главу.


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


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


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


Есть сайты, где можно сохранять свои проекты, и каждый такой сайт содержит тысячи проектов от разных людей и команд. Один из таких сайтов - github.


===

Заранее предвижу, что за такое объяснение меня поднимут на вилы. Да, на половину написанного можно сказать что это неточно или вообще не так. Задача была передать смысл.

показать ответы
Автор поста оценил этот комментарий
Но это медленнее и может привести к факапам и ошибкам, которые потом РАЗГРЕБАЕТЕ с помощью консоли
раскрыть ветку (1)
5
Автор поста оценил этот комментарий

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


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

показать ответы
Автор поста оценил этот комментарий
Но согласитесь: Вы получили такую ХЕРОВУЮ историю коммитов, подтверждающую, что Вы явно засранец, который с первого раза не может сделать фичи А, B? Если бы Вы сделали это с первого раза или, скажем, делали бы эти фичи по разным веткам, то проблем было меньше и история основной ветки была бы чище (при условии, что ветки потом с помощью rebase сливались)
раскрыть ветку (1)
4
Автор поста оценил этот комментарий

"Вы явно засранец, который с первого раза..." - и вот мы наконец приходим к причине разногласий!


В моей статье есть ссылка, приведу её ещё раз: https://tomayko.com/blog/2008/the-thing-about-git


Git не требует ничего делать "с первого раза". Вы сами можете накладывать на себя такое ограничение, но оно совершенно искусственное. Git это инструмент, просто некоторые к нему относятся с пиететом и прогибают свой рабочий процесс, а некоторые освоили и коммитят как пулемет во время работы, дополняют коммиты, переставляют местами, сливают между собой, делают по 10 раз amend и потом наводят порядок в локальной ветке и делают один раз git push, где идеальная история коммитов.

Автор поста оценил этот комментарий
Я не понимаю людей, которые кодят: нахера им консоль для git вообще??? Чтобы почувствовать себе кул хацкерами бл????
раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Для некоторых использовать консоль - это как дышать, и работают они в системе где постоянно открыто несколько терминалов для разных задач. Вы себе наверно представляете, что кто-то кодит в винде в IDE, а потом такой "Пуск - выполнить - CMD" и начинает в консоли git-команды писать )) Короче, всё не совсем так)) Консоль - удобный инструмент, когда умеешь и привык им пользоваться.

показать ответы
65
Автор поста оценил этот комментарий

Чтобы не потерять не закоммиченную работу есть git stash

раскрыть ветку (1)
12
Автор поста оценил этот комментарий

Однажды я потерял незакоммиченную работу при использовании git stash. Не помню как именно, но я это сделал)

показать ответы
21
Автор поста оценил этот комментарий

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

Про бекап копированием проекта под git перед правками вообще что-то невероятное.


Если правильно понял автора, проблема возникает с пониманием самой модели дерева коммитов. Это более чем странно, т.к. все это объясняется на пальцах даже в первоисточнике: https://git-scm.com/book/en/v2/Getting-Started-What-is-Git? на множестве языков, в том числе на русском.

Не почитать git-scm.com очень сложно - ссылки на него есть практически везде, и даже гугл большинство запросов про git заворачивает именно туда.


А сама модель дерева крайне простая:

1- каждый коммит имеет ссылку на предка. Исключение - корень

2 - коммиты идентифицируются по хэшу, который зависит от содержимого

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


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

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

Исключение: если не пользоваться гуглом или не иметь никакого интереса к изучению тех инструментов, что используешь. Но оба этих варианта сами по себе тоже звучат невероятно.


Вторая ошибка - по видимому эти люди до сих пор не пользуются центральными репозиториями: github, gitlab, или любыми аналогами.

Любая копия репы в принципе исключает бекап проекта копированием: даже если полностью убьешь локальную копию репозитория, в любой момент все можно подтянуть из origin.

Сомнительно что игнорирование github/gitlab тут сознательное, потому что даже при сознательном игнорировании бекап копированием все равно не имеет смысла: origin можно поднять в self hosted-репе, или даже в локальной репе в соседней папке - git это вполне допускает.

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

В принципе разработка без центральных реп сейчас немыслима.


Третья ошибка - очевидно, эти люди до сих пор не пользуются GUI-клиентами.

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

Из странного тут - довольно много начинающих разработчиков игнорируют GUI-клиенты. Возможно из-за страха, непонимания, или заблуждений. Не знаю что это, но явление имеет место быть.

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

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

Не знаю какие соображения в таких ситуациях движут людьми. Возможно это страх не освоить git, если пользоваться им через GUI. Но он не имеет под собой оснований: GUI никак не заменяет git, там вызываются все те же операции, что в консоли, просто результат отображается более наглядно, что ускоряет и облегчает работу с git. Собственно в этом и есть предназначение GUI: упростить работу с git, снизить когнитивную нагрузку, уменьшить вероятность ошибок при работе с git. К тому же GUI дает доступ только к основным git-операциям, в основном это управление ветками и коммитами, поиск в истории. Все вспомогательные операции в любом случае нужно выполнять через консоль - GUI никак не освобождает от освоения git, и не мешает этому. Другое дело что не все хотят что-то осваивать, но тут уже что-то сделать сложно: не все хотят учиться, осваивать новое, развиваться.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Если правильно понял автора, проблема возникает с пониманием самой модели дерева коммитов. Это более чем странно, т.к. все это объясняется на пальцах даже в первоисточнике

Проблема в непонятном разрыве между понявшими и непонявшими, при условии что "непонявшие" могут месяцами или даже годами пользоваться Git на определенном уровне, читать документацию и проходить обучалки типа learngitbranching.js.org При этом, у человека есть вся нужная информация, но по какой-то странной причине он не пришёл к некоторым логическим связям.


Вторая ошибка - по видимому эти люди до сих пор не пользуются центральными репозиториями: github, gitlab, или любыми аналогами
Это вообще не имеет отношения к делу. Перед тем как отправить пуш в "центральную" репу, ты работаешь в локальной. И проблемы из-за отсутствия понимания происходят именно там.


Из странного тут - довольно много начинающих разработчиков игнорируют GUI-клиенты. Возможно из-за страха, непонимания, или заблуждений. Не знаю что это, но явление имеет место быть.
То есть, начинающие разработчики игнорируют графический интерфейс из-за страха перед ним, и вместо этого предпочитают удобную и нестрашную консоль? Мы точно в одинаковом мире живем?)


то зальют какие-то левые правки, то весь проект попытаются снести под ноль - десятки тысяч измененных файлов заливают, и искренне не понимают что здесь не так

Ну, значит эти люди СОВСЕМ не умеют пользоваться инструментом, и скорее всего в реальной жизни их от этого мгновенно отучат. Нормальные люди перед коммитом несколько раз перепроверят git diff и git diff --staged

2
Автор поста оценил этот комментарий
Я ни слова не сказал про статью, не надо видеть, то чего нет. Хорошая статья, но первое что необходимо усвоить: не надо доверять на 100% гиту, как и любой другой технологии. А без понимания основ, так вообще патч Бармина на проде можно запустить
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

4
Автор поста оценил этот комментарий
Может для понимания оно и нужно, только вот по моему долгому опыту разработки:
Если нет сабмодулей и не пользуешься stash достаточен git gui: большинство операций в нем: забрать, слить себе в лок. ветку (конфликты разрешаю в файлах, а не в git gui), добавить в индекс, закоммитить, запушить.
Поясните, когда ведется разработка, КОМУ КОГДА понадобиться что-то еще???? Как может случиться какая-то срань, если выполнять только такие команды?? Reset branch или ammend - нахера???
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Нахера amend?! Что, вы не сталкивались с ситуациями, когда

- в коммит случайно попал лишний код

- часть кода была забыта и не добавлена в коммит

- опечатка в комментарии к коммиту

ну и другие подобные ситуации...


что, никогда не было?

показать ответы
36
Автор поста оценил этот комментарий

git push --force

Всегда так делаю со своей фича веткой в процессе ревью. Позволяет причесать историю уже после публикации. А вот с чужими ветками такого делать нельзя. Ну и конечно должно быть правилами в вашем scm сервере (гитлаб, гитхаб или еще чего) запрещено коммитить напрямую в мастер, дабы подобной командой по запаре не затереть все изменения.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

показать ответы
6
Автор поста оценил этот комментарий

Скидывал несколько раз разное в stash, делал изменения, вызвал stash pop и напоролся на адский конфликт, который было не разгрести?

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

что-то подобное. stash pop я не пользуюсь, только stash apply, от греха подальше. но не уберегло.

показать ответы
10
Автор поста оценил этот комментарий
Коммиты не теряются :D А ещë merge и rebase ничего не смогут сломать :D Я после гениальных мержей и форс пуша разгребал три дня проект до нормального состояния, мастеру пришëл полный пиздец. И смеженнын ветки вообще не совпадают между собой, рабочий функционал откатился на месяц, новый и концепты въехали в релиз, большинство коммитов склеены, полная жопа. После этого мержи в мастер и релиз были запрещены вообще всем до трёх апрувов (от двух лидов и сиай сервера), запрет на удаление любых веток, сквош коммитов и форс пушей. А то начитаются статей в интернетах и черри пикают в мастер
раскрыть ветку (1)
3
Автор поста оценил этот комментарий

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

показать ответы
4
Любитель VPN
Автор поста оценил этот комментарий

Мне крайне сложно представить ситуацию, когда человек сам не справился с гитом, и тут пост на Пикабу внезапно изменит его мир

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Сайт think-like-a-git внезапно изменил мой личный мир. Пост посвящен ему. Может, и кому другому поможет, а?


добавлю - через примерно 2 года использования Git, хоть и нерегулярного

0
Автор поста оценил этот комментарий

Мне кажется, что вот это как раз отличный пример неправильной работы с гитом. Разные фичи разрабатываются в разных ветках, чтобы мержить можно было в разном порядке и без описанной выше чехарды с файлами. Если одна фича зависит от другой - ее ветка должна базироваться на ветке той фичи, а не на мастере/девелопе. Это полностью решает проблемы с "закоммитили лишнее" и "недокоммитили нужное". Если нужна чистота коммитов в ветках (религия или лиды запретили сквош), то можно, конечно, вместо коммита перед переключением на другую ветку совать все в стеш. Чуть менее удобно, но в итоге есть несколько стешей, в которых лежат нужные изменения для разных фич

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

"Фича" это условное понятие. И мне совершенно не жалко скинуть ссылку из поста ещё раз.


https://tomayko.com/blog/2008/the-thing-about-git


"Правильно" и "неправильно" это оценочные суждения. Удобно и эффективно - вот что имеет значение. Git позволяет забыть о системе контроля версий и просто херачить код, не отвлекаясь. Бывает, что в середине работы над чем-то ты понимаешь, что тебе надо поменять имя какой-то функции везде... Потом понимаешь, что требуется допилить вон тот класс... потом - что для красивой реализации задуманного надо еще третий класс доработать... В целом - это нормальный рабочий процесс, и в нём нет ничего "неправильного". Например, в моём случае у меня может быть изменение в модели, изменение в классе, отвечающем за настройки, изменения в XML-файлах с интерфейсом, изменения с локализацией... Я просто делаю это всё вместе, а потом, когда всё заработало - я берусь за git и начинаю логически распределять по коммитам всё. Сперва всё, что связано с моделью - коммит. Потом настройки, который учитывают новую модель - коммит. Затем - файлы интерфейса, поскольку это гора XML который засоряет коммит с кодом, если их объединить... Затем - отдельно - локализацию. И после всего этого у меня в выдаче diff ещё остаётся всякий мусор типа временных дебагов и лишних переносов строк которые случайно затесались. Я весь день не трогаю гит, а потом за 20 минут все изменения очень красиво оформляю по нескольким тематическим коммитам, следят чтобы каждый из них оставлял программу в работоспособном состоянии. И потом один раз git push и работа закончена, всякие дебаги остаются в коде если я прикидываю что они мне еще понадобятся (но в коммит они не идут, просто сидят в рабочей директории)

показать ответы
0
Автор поста оценил этот комментарий

Если на удаленной машине ведется разработка, то там есть все необходимые GUI инструменты.
Если это боевой сервер, то использование гита на нем человеком это хороший способ убить все. Системы развертывания придумали как раз для этого.


Если 10 раз сделать commit --amend, гуя покажет все 10 коммитов? Если в гуях ткнуть мышкой коммит и сбрость на него ветку через reset --hard, покажут они все повисшие в воздухе коммиты?

Покажет. А за гит commit --amend в компаниях разрабатывающих софт, сильно бьют по голове. И на то есть причины.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Если на удаленной машине ведется разработка, то там есть все необходимые GUI инструменты

Удалённая машина - это "малина" без гуёв, выполняющая определенные функции.


А за гит commit --amend в компаниях разрабатывающих софт, сильно бьют по голове
За amend после пуша - да. За локальные amend - нет. Хоть ты об-amend-ься

1
Автор поста оценил этот комментарий

>  то что попало в комит никогда не будет удалено.


git gc говорит вам: ха-ха

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

rm -rf %каталог_проекта% тоже говорит "ха-ха", но пост в целом не об этом. Пост в целом "пройдите по ссылке и узнаете много полезного, в том числе про gc и когда он срабатывает"

показать ответы
21
Автор поста оценил этот комментарий

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

Про бекап копированием проекта под git перед правками вообще что-то невероятное.


Если правильно понял автора, проблема возникает с пониманием самой модели дерева коммитов. Это более чем странно, т.к. все это объясняется на пальцах даже в первоисточнике: https://git-scm.com/book/en/v2/Getting-Started-What-is-Git? на множестве языков, в том числе на русском.

Не почитать git-scm.com очень сложно - ссылки на него есть практически везде, и даже гугл большинство запросов про git заворачивает именно туда.


А сама модель дерева крайне простая:

1- каждый коммит имеет ссылку на предка. Исключение - корень

2 - коммиты идентифицируются по хэшу, который зависит от содержимого

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


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

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

Исключение: если не пользоваться гуглом или не иметь никакого интереса к изучению тех инструментов, что используешь. Но оба этих варианта сами по себе тоже звучат невероятно.


Вторая ошибка - по видимому эти люди до сих пор не пользуются центральными репозиториями: github, gitlab, или любыми аналогами.

Любая копия репы в принципе исключает бекап проекта копированием: даже если полностью убьешь локальную копию репозитория, в любой момент все можно подтянуть из origin.

Сомнительно что игнорирование github/gitlab тут сознательное, потому что даже при сознательном игнорировании бекап копированием все равно не имеет смысла: origin можно поднять в self hosted-репе, или даже в локальной репе в соседней папке - git это вполне допускает.

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

В принципе разработка без центральных реп сейчас немыслима.


Третья ошибка - очевидно, эти люди до сих пор не пользуются GUI-клиентами.

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

Из странного тут - довольно много начинающих разработчиков игнорируют GUI-клиенты. Возможно из-за страха, непонимания, или заблуждений. Не знаю что это, но явление имеет место быть.

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

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

Не знаю какие соображения в таких ситуациях движут людьми. Возможно это страх не освоить git, если пользоваться им через GUI. Но он не имеет под собой оснований: GUI никак не заменяет git, там вызываются все те же операции, что в консоли, просто результат отображается более наглядно, что ускоряет и облегчает работу с git. Собственно в этом и есть предназначение GUI: упростить работу с git, снизить когнитивную нагрузку, уменьшить вероятность ошибок при работе с git. К тому же GUI дает доступ только к основным git-операциям, в основном это управление ветками и коммитами, поиск в истории. Все вспомогательные операции в любом случае нужно выполнять через консоль - GUI никак не освобождает от освоения git, и не мешает этому. Другое дело что не все хотят что-то осваивать, но тут уже что-то сделать сложно: не все хотят учиться, осваивать новое, развиваться.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Потому что GUI-клиенты показывают дерево коммитов наглядно

Если 10 раз сделать commit --amend, гуя покажет все 10 коммитов? Если в гуях ткнуть мышкой коммит и сбрость на него ветку через reset --hard, покажут они все повисшие в воздухе коммиты? Я вот сейчас пошёл, запустил тот гуй который у меня есть (gitk) и сделал. Не показывают. Просто вот у меня была история коммитов, херак и половины истории нет. Дальше что? Как ваши интуитивные гуи помогают исправить ситуацию? Как они помогают ПОНЯТЬ что вообще происходит? Я спрашиваю не про себя - я то разобрался года два назад, вот только теперь руки дошли статью тиснуть. Я про новичков. Ситуация осложняется, когда такие новички делают неудачный merge и не могут конфликты разрешить, всё в кашу.


Я не сомневаюсь, что гуев много. Что в некоторых есть и вариант показать все коммиты вообще (по аналогии с reflog), и мышкой выделить висящий в воздухе и создать на нём ветку. В моём такого сходу не нашёл.


консоль это круто, по-хакерски

Консоль это единственный интерфейс для огромного числа серверов, куда надо заходить и работать с Git-репой удалённо. Консоль это неотъемлимая часть Linux-систем, под которыми люди работают. В ней нет ничего "крутого", это просто часть рабочей среды многих программистов.
показать ответы
0
Автор поста оценил этот комментарий

часть кода была забыта и не добавлена в коммит

Я наверное когда коммит делаю, то делаю его с явной целью: что-то добавить/изменить/удалить. КАК МОЖНО СЦУКО ЗАБЫТЬ КАКОЙТО КОД??????

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

У тебя фича, разбросанная по десятку файлов. Помимо этой фичи, в этих файлах есть и другие изменения, которые относятся к другой фиче. В итоге в коммит идет примерно ~30% от того, что выдаёт git diff

показать ответы
Автор поста оценил этот комментарий

- в коммит случайно попал лишний код

НИКОГДА: перед коммитом я проверяю его в окне изменений! Вы что там, издеваетесь надо мной что ли?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Все проверяют, я тоже. Но бывает такое, что ты проглядел строчку которая логически относится к другому коммиту. Например, ты делаешь фичу, и разбиваешь её логически по нескольким коммитам. И вот в коммит попала строчка, которая относится к фиче, но ты хочешь чтобы эта строчка была в следующем коммите.

0
DELETED
Автор поста оценил этот комментарий

Ну я по паре интерактивных уурсов гит изучал лет 14(? Не помню точно) и отлично сработало.

Чтобы не запарывать репу надо включать адекватные ограничения: никаких пушей в мастер/мейн, никаких мержей в обход CI, ветка перед мержем сквошить и зате  удалять, ну я бы хорс пуш заодно запретил.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Про запарывание репы - речь исключительно про локальную репу. То есть, даже без всяких удаленных веток, без пушей и прочего. Когда ты у себя локально напорчтачил и потом удаляешь папку с проектом и рядом берешь её копию и переименовываешь. Не все могут похвастаться, что разобрались с git в 14 лет, будьте снисходительнее к людям.

показать ответы
9
Автор поста оценил этот комментарий

Хули его понимать. Вот комит, вот башка. Следущий комит прилепиться туда куда указывает башка. Башка переместится на новый комит. Есть ветка - тупо указатель на комит. Если башка указывает на тот же комит на который указывает ветка, то ветка переместится вслед башкой. Слияние веток создаёт новый комит. Правила перемещения башки и ветки такое же. Ветку можно переместить на любой комит. От того куда вы её переместите не зависит ровно ничего, но вот если вы работаете не один то можете получить геморрой разной степени, который будет решаться согласно выше озвученным правилам. Гит старается помочь нескольким разрабам изменять один файл. Если изменили одну и ту же строчку - при объединении будет конфликт. Чтобы решить конфликт нужно выбрать правильное исправление, оставить оба или сдать другое отличное от обоих. В результате будет комит. Локальные и удаленные ветки это практически одно и тоже, гит помогает следить и актуализировать локальную и удалённую ветку. Название локальной и удаленной ветки могут быть разными, это ни на что не влияет - главное что они связаны, для любой ветки можно указать любую удалённую.


В общем: всё есть комит. Гит это очень простой концепт.


Самый приятный бонус: то что попало в комит никогда не будет удалено.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Гит очень простой концепт, когда его понял. Именно про это и статья, верно?)

4
DELETED
Автор поста оценил этот комментарий

По мне лучше пара интекактивных курсов и понимание будет лучше

https://learngitbranching.js.org/

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

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

@narical, я нашел русский перевод сайта Think Like (a) Git в вебархиве: https://web.archive.org/web/20131018020857/http://git.geekjo...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

 

Почему я беру слово "перевод" в кавычки? Потому что оригинал понять намного легче, и для понимания "перевода" ты его сперва переводишь обратно на английский и потом пытаешься понять. 

 

Пример переведенного текста:

 

ЛСД и бензопила


Это не совсем подходит под пример, но я думаю что вполне подходит под то, что Git это мощный и странный инструмент, и нужно медитировать, чтобы достичь в нем просветления.

И затем вдруг откуда невозьмись появился git rebase --interactive, который был просто копией git commit --amend под кислотой и держал бензопилу –полностью безумный и довольно опасный, но способный открыть новые горизонты сознания.

-Райан Томаяко, The Thing About Git, апрель 2008.


Короче говоря, "переведенный" сайт читать практически невозможно, и использовать его за основу чтобы исправить перевод - тоже лишено смысла. Надо с нуля всё переводить.

0
Автор поста оценил этот комментарий

Вот-вот.

но всё ещё регулярно копирует всю папку с проектом перед выполнением "страшных" команд.

всё-таки не повредит. А то сидишь потом "ну да.. где-то там есть мой код, но как достать его я не знаю".

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Вот! Чтобы научиться и не бояться - надо начать с понимания
0
Автор поста оценил этот комментарий

Самое тупое объяснение из разряда "должно всё объяснять, но ничего не объясняет", которое я слышал звучит как-то так: "Главное понять, что гит оперирует с изменениями, а не с файлами". Вообще абсолютно пустая фраза, которая не объясняет даже то, почему гит не может трекать пустые папки.


Из статья фрагмент про git add --patch нужно добавить, что в 2023-м году почти любой редактор, а тем более IDE позволяет отдельно добавлять изменённые фрагменты файла в индекс без прохождения викторины в консоли. А некоторые GUI-оболочки позволяют добавлять даже отдельные строчки.


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


Ну и главные проблемы обычно возникают при слияниях, о чём в статье вообще ничего не написано.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну и главные проблемы обычно возникают при слияниях, о чём в статье вообще ничего не написано

Потому что статья не об этом

0
Автор поста оценил этот комментарий

Это почти как статьи "переходите на vim" - самый тру текстовый редактор

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Примерно бесконечно далеко от истины.

1
Автор поста оценил этот комментарий

Если для целей тестирования - нет, не нужно. Тестировщикам не требуется лезть в код  с целью что-то в нём переключать или вообще менять.

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

Гит - это для разработки. Даже не обязательно программ. Просто для разработки. Когда у тебя есть что-то (цифровое, естесно), что будет изменяться со временем. И тебе надо бы ставить "точки", фиксирующие какие-то изменения, на всякий случай, для истории. Если у тебя такого продукта нет - тебе просто не на чем будет применять этот гит.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Гит не только для разработки. Я видел упоминания, что его используют для написания книг, для чертежей/моделирования

0
Автор поста оценил этот комментарий
У тебя фича, разбросанная по десятку файлов.

Звучит как код с высокой связностью. Не уверен, что это хорошо и что такое вообще надо куда-то коммитить без рефактора.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Или же звучит как "массовый рефакторинг который внезапно затронул весь проект") Обязательно надо было докопаться?

показать ответы
0
Автор поста оценил этот комментарий

Допустим ситуация:

Сидите вы, работаете- один коммит сделали, второй, третий, четвертый. А рядом мелкий сын крутится. Только вы отвернулись, а он залез в консоль и ввёл

reset --hard @~3.

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

reset --hard ORIG_HEAD

Эта команда переместит HEAD на прежнюю вершину ветки (4-й коммит) и вернет всё, как было, только похерятся незакомиченные изменения в рабочей папке. Да, git никуда не удалил эти коммиты, просто сделал их недоступными. Но где-то через месяц они будут удалены

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Мне кажется, что такой сын и git prune не погнушается... А если два раза reset --hard @~3 сделать - ORIG_HEAD уже не спасёт?

показать ответы
0
Автор поста оценил этот комментарий

Я веду программирование на 2 курсе и то не могу понять этот git

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Если интересно - могу в телеге скажем объяснить (в рамках своих знаний конечно)

показать ответы
0
Автор поста оценил этот комментарий
1) 3 проекта в опыте
ни разу не было работы с гитом
2) Инфа в инете быстро устаревает
3) на пикабу живые люди с живым опытом
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Хорошо, вот я ответил: #comment_273942047

2
DELETED
Автор поста оценил этот комментарий
Не то что пост, я даже комменты не понимаю... Может кто русским и простым языком объяснить что такое Git? Часто туда ведет поисковик, но как только туда захожу - перестаю понимать вообще что-либо...
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Поисковик ведет на github. Отличия между git и github лучше всего объяснили в этом посте: Разница между Git и Github

1
Автор поста оценил этот комментарий

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

Коммиты никуда не исчезают..."

Я думал сейчас объяснят доступным языком для не- it-шников. А тут первое слово и сразу хз что такое "коммит")))

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Цитата с сайта:


Who This Site Is For 


"Advanced beginners" with Git. You should know how to create a repository, add and commit files to it, and you should probably have some idea of why you might want to use a branch.

If you're still struggling with what version control software is for, this site may not be that useful to you.


Так что и статья, и сайт для определенного круга людей.

показать ответы
0
Автор поста оценил этот комментарий

> Второе действие - git show HEAD и читаем последний коммит. Затем git show HEAD~1 и читаем предпоследний. И ещё один.

git log -p

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Смысл был не в этом.

0
Автор поста оценил этот комментарий

Потратьте 8 часов времени на https://gitexercises.fracz.com/

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это мне сейчас было?

показать ответы
0
Автор поста оценил этот комментарий

Не против, если я попытаюсь адаптировать написанное и утащить в какой-нибудь пост на других ресурсах?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

0
Автор поста оценил этот комментарий
Мне как тестеру желательно знать что такое гит
а вот обязательно ли? Есть тут тестеры? Скажите оно надо?
раскрыть ветку (1)
Автор поста оценил этот комментарий

В современном мире гугл даёт ответы в миллион раз быстрее чем люди в комментариях.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества