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

Вот некоторые вещи, которые вы, вероятно, не знаете о Git.

Я не буду углубляться в эту тему, поскольку это не цель. Эта статья больше похожа на базовые (полезные) знания высокого уровня о том, как Git работает с некоторыми полезными командами, но не более того. Если вы хотите углубиться, у вас есть официальная документация и множество ресурсов по этой теме.

Хранилище данных

Во-первых, Git посвящен хранению информации.

По своей сути Git похож на хранилище значений ключей. Поскольку ценность вас довольна, данные, которые вы хотите сохранить.

Ключ - это хэш ваших данных, например уникальный идентификатор того, что представляет ваш контент. Затем вы можете использовать ключ для получения содержимого, например идентификатора. Если быть точным, ключ - это SHA1 данных. SHA1 - это криптографическая хеш-функция, что означает, что с учетом данных она создает 40-значное шестнадцатеричное число (те, которые вы можете увидеть, когда выполняете git log). Функция SHA1 гарантирует одинаковый вывод для одного и того же ввода.

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

Вы можете увидеть, как Git создает хеш некоторого контента, поиграв с ним, например, с помощью этой команды:

> echo “Hello World” | git hash-object --stdin

Он подскажет вам:

557db03de997c86a4a028e1ebd3a1ceb225be238

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

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

Поскольку хэши SHA1 основаны на содержимом и идентичны, если содержимое также идентично, Git будет знать, был ли файл изменен или нет. Это очень удобно для фиксации, поэтому переключение между ветвями выполняется СУПЕР БЫСТРО.

Совершить

Анатомия

Коммит - это снимок кода. Он указывает на дерево и содержит разницу между двумя состояниями (предыдущая фиксация и новая) и некоторые метаданные, например:

  • автор и коммиттер
  • Дата
  • сообщение
  • родитель коммита (много родителей, если это слияние)

SHA1 фиксации - это хэш всей информации. А поскольку этот хеш уникален для своего содержимого, фиксация не может быть изменена. Если вы измените какие-либо данные о коммите, у него будет новый SHA1. Даже если файлы не изменятся, дата создания изменится.

Коммит - это снимок кода.

Все это должно быть вам знакомо, кроме «родителя коммита». Да, все коммиты имеют родительский коммит, кроме первоначального. Это означает, что при создании нового проекта и первом коммите вы «инициализируете» свой репозиторий git, но после этого все новые коммиты будут иметь предыдущий как родительский, все они связаны друг с другом.

Вы можете спросить Git, что изменилось со «вчера» с git log --since="yesterday" или «две недели назад» с git log --since="2 weeks ago".

Отмена фиксации

При отмене фиксации с использованием git revert Git в основном создает новую фиксацию, полностью противоположную изменениям целевой фиксации. Исходная фиксация все еще находится в истории и останется такой же. При возврате история не меняется. Обычно он используется, если вы хотите отменить фиксацию, которая была отправлена ​​и опубликована.

Откат - это создание фиксации с изменениями, противоположными целевой фиксации.

Рабочие области Git

Git содержит 3 рабочие области: рабочую область, промежуточную область и репозиторий.

Рабочая область

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

Плацдарм

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

Репозиторий

Это безопасное место, содержащее все файлы, о которых знает Git. Он содержит все ваши коммиты.

Спрятать

  • Сохраните незавершенную работу
  • Безопасен от разрушительных операций
  • У вас может быть много тайников

По умолчанию Git хранит все измененные отслеживаемые файлы, но вы также можете указать поиск неотслеживаемых файлов с помощью команды git stash --include-untracked или с помощью флага --all, который добавит все файлы, за исключением игнорируемых.

Вы даже можете указать имя для своего тайника, выполнив git stash save “My super stash name”, и создать ветку из вашего тайника с помощью git stash branch <optional branch name>.

Вы сможете увидеть все свои текущие тайники, выполнив git stash list, и очистить все свои тайники с помощью git stash clear.

использованная литература

ветви

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

Голова

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

Это указатель, поэтому он указывает на имя текущей ветки, но может указывать и на конкретную фиксацию (отсоединенная HEAD).

Ваш HEAD будет перемещаться, когда вы фиксируете в текущей активной ветке или когда вы проверяете новую ветку.

Ребазинг

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

Источники