Skip to content

Instantly share code, notes, and snippets.

@vchernogorov
Last active March 20, 2024 00:11
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save vchernogorov/030144a7b0832c683adc3e0b502ad3e5 to your computer and use it in GitHub Desktop.
Save vchernogorov/030144a7b0832c683adc3e0b502ad3e5 to your computer and use it in GitHub Desktop.
Git

Общие понятия

  1. Принцип хранения - многие VCS хранят свои данные в виде списка изменений, Git же хранит полные копии файлов, только заменяя неизмененные файлы на ссылки. [2.1]

    • Таким образом Git является своего рода небольшой файловой системой.
    • Такой подход предоставляет ряд преимуществ при восстановлении данных, работе с комитами и т.д., но требует больше места.
  2. Локальные операции - для совершения большинства операций в Git'е необходимы только локальные файлы и ресурсы, т.е. обычно информация с других компьютеров в сети не нужна. [2.2]

    • Данная особенность позволяет спокойно делать коммиты, а затем отправить их, как только станет доступна сеть (в некоторых других VCS это невозможно или же крайне неудобно).
    • Поскольку вся история проекта хранится локально у вас на диске, большинство операций кажутся практически мгновенными.
  3. Состояние файла - в Git'е файлы могут находиться в следующих состояниях: fixed, changed, stagedm untracked, ignored. [2.3]

    • fixed (commited, unmodified, unchanged) - файл уже сохранен в локальной базе. Если fixed файл модифицировать, то он переходит в changed.
    • modified (changed) - файл изменен, но изменение не зафиксировано. Если changed файл проиндексировать (git add), то он переходит в staged.
    • staged - файл изменен, и изменение было зафиксирвано. Если staged файл добавить в коммит (git commit), то он переходит в fixed.
    • untracked - файл не индексирован. Если файл был недавно создан, то он является untracked.
    • ignored - файл игнорируется .gitignore'ом. Если файл находится в .gitignore (или попадает под шаблон), то он является ignored.
  4. Repository - это место, где Git хранит метаданные и базу данных объектов вашего проекта.

    • Это наиболее важная часть Git'а, и именно она копируется, когда вы клонируете репозиторий с другого компьютера.
    • Git хранит все изменения в скрытой папке .git, которая есть в каждом проекте, находящемся под контролем VCS.
  5. Working Directory - это извлечённая из базы копия определённой версии проекта.

  6. Staging Area - это обычный файл, хранящийся в репозитории Git'а, который содержит информацию о том, что должно войти в следующий коммит.

  7. Blob (Binary Large Object) - каждая версия файла представлена блобом.

    • Блоб хранит данные файла, за исключением метаданных.
    • Это бинарный файл, который в Git базе данных указывается как SHA1 хэш этого файла.
  8. Tree - объект, который представляет директорию.

    • Дерево - это бинарный файл, который хранит ссылки к блобам и деревьям, также указывается SHA1 хэшом.
  9. Commit - содержит текущее состояние репозитория.

    • Как и дерево или блоб, коммит хранится в виде SHA1 хэша.
    • Можно понимать коммит, как узел в связном листе.
    • Каждый коммит имеет указатель на своего предка-коммита.
    • Коммит может имет несколько указателей на несколько предков - это значит, что он был создан слиянием веток.
  10. Branch - используется для создания новой ветки разработки.

    • По умолчанию, первая ветка в репозитории - master.
  11. Tag - обозначает значимое имя с указанной версией в репозитории.

    • Теги очень похожи на ветки, но отличие в том, что они неизменяемы. Если сделать тег для коммита, то даже если создать новый коммит от данного, то он не обновится.
  12. Clone - эта операция создает локальный инстанс репозитория.

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

    • Используется для синхронизации между репозиториями.
  14. Push - операция копирования изменений из локального репозтироия в удаленный.

    • Используется для записи изменений в удаленный репозиторий (навсегда, если следовать правилам).
  15. HEAD - указатель, который обычно указывает на последний комит в ветке.

    • Когда вы делаете комит, то голова перемещается на него.
    • Голову можно переместить на любой другой объект кроме комита.
    • ORIG_HEAD - предыдущее состояние HEAD.
  16. Revision - представляет собой версию исходников

    • В Git ревизии представлена коммитами.
  17. URL - место, где находится репозиторий.

    • Хранится в файле конфигураций (git config).

Операции

  1. git config - считывание или запись глобальных или локальных конфигураций. [4.1]

    • git config --global user.name "[name]" - указывает символическое имя, которое будет привязываться к каждому комиту.
      • git config --global user.name "CustomName" - добавление имени CustomName в конфиг.
    • git config --global user.email "[email address]" - указывает почту, которая будет привязываться к каждому комиту.
      • git config --global user.name "CustomName@email.com" - добавление почты CustomName@email.com в конфиг.
    • git config --global alias.[name] [alias]|"[composit alias]" - добавляет глобальный алиас (сокращение).
      • git config --global alias.cf config - добавление алиаса, который делает сокращение git cf для команды git config добавления конфигурации.
      • git config --global alias.cfg "config --global" - добавление составного алиаса, который делает сокращение git cfg для команды git config --global добавления глобальной конфигурации.
    • git config --list - перечисляет все ключи конфигураций и их значения.
    • git config --unset --global [config] - удаляет указанный ключ из конфигураций.
      • git config --unset alias.cf - удаление алиаса git cf.
  2. git init - создание пустого репозитория или переинициализация существующего. [4.2]

    • git init - создает репозиторий в текущей папке.
    • git init [directory] - создает директорию "directory" с репозиторием.
  3. git clone - операция клонирования репозитория. [4.3]

    • git clone [repository] - клонирование репозитория, который находится по пути "repository".
      • git clone git@github.com:[username]/[repository].git - клонирование репозитория по ssh ключу.
      • git clone https://github.com/[username]/[repository].git - клонирование репозитория через https протокол.
    • git clone [repository] [directory] - клонирование репозитория, который находится по пути "repository", в указанную директорию "directory".
      • git clone https://github.com/[username]/[repository].git /home/name/projects/project - клонирование репозитория в директорию /home/name/projects/project/.
    • git clone -b [branch] [repository] - клонирование определенной ветки репозитория.
      • git clone -b master git@github.com:[username]/[repository].git - клонирование ветки master.
    • git clone -l [repository] - клонирование локального репозитория.
      • git clone -l /home/name/projects/project/ /home/name/projects/project2/ - клонирование локального репозитория из директории project в директорию project2.
  4. git add - операция индексирования файла. [4.4]

    • git add [modified] - индексирование одного файла "modified", или дирректории "modified", или всех объектов, удовлетворяющих паттерну "modified".
      • git add . - добавляет все файлы в текущей директории и ее поддиректориях.
      • git add .gitignore - добавляет в индекс файл .gitignore.
      • git add project/ - добавляет в индекс файлы из директории project/.
      • git add Documentation/\*.txt - добавляет в индекс все .txt файлы в директории Documentation/.
    • git add -A - добавление в индекс всех modified файлов в проекте.
  5. git status - операция вывода статуса текущего working tree. [4.5]

    • git status [file] - выводит статус по текущему файлу.
      • git status - показывает статус всех modified и staged файлов.
      • git status .gitignore - показывает статус файла .gitignore.
      • git status project/ - показывает статус папки project/.
      • git status Documentation/\*.txt - показывает статус всех .txt файлов в директории Documentation/.
    • git status --ignored - выводит статус также и ignored файлов.
  6. git diff - показывает изменения между элементами. [4.6]

    • git diff [file] - выводит изменения в текущем файле.
      • git diff - показывает статус всех modified файлов.
      • git diff .gitignore - показывает статус файла .gitignore.
      • git diff project/ - показывает статус папки project/.
      • git diff Documentation/\*.txt - показывает статус всех .txt файлов в директории Documentation/.
    • git diff [object] - выводит изменения в текущем объекте.
      • git diff master - показывает изменения между текущей веткой и веткой master.
      • git diff HEAD HEAD^ - показывает изменения между предыдущим комитом и комитом после него.
    • git diff --name-status - выводит только имена файлов, которые являются modified.
  7. git commit - записывает изменения в репозиторий. [4.7]

    • git commit [file] - добавляет staged изменения в текущем файле в репозиторий.
      • git commit - добавляет в репозиторий (делает fixed) все staged объекты.
      • git commit .gitignore - добавляет в репозиторий файл .gitignore.
      • git commit project/ - добавляет в репозиторий папкe project/.
      • git commit Documentation/\*.txt - добавляет в репозиторий все .txt файлы в директории Documentation/.
    • git commit -m '[message]' - сообщение для комита можно ввести в ковычках вместо того, чтобы открывать редактор.
      • git commit -m 'Init commit' - делает комит 'Init commit'.
    • git commit -a - автоматически индексирует измененные файлы, которые ранее были добавлены в репозиторий и делает комит.
    • git commit --amend - добавляет все staged файлы в предыдущий комит, тем самым перезаписывая его хэш.
  8. git reset - передвигает HEAD в указанное состояние. [4.8]

    • git reset -- [file] - отменяет добавление файлов в staged area.
      • git reset - отменяет изменения, добавленые в staged area с помощью git add, и делает их обратно modified.
      • git reset .gitignore - добавляет в репозиторий файл .gitignore.
      • git reset project/ - добавляет в репозиторий папкe project/.
      • git reset Documentation/\*.txt - добавляет в репозиторий все .txt файлы в директории Documentation/.
    • git reset [object] - передвигает HEAD на указанный объект
      • git reset HEAD^ - переводит последние закомиченные fixed изменения в состояние modified.
      • git reset ORIG_HEAD - чтобы обратиться к HEAD, который был до reset, можно написать ORIG_HEAD.
      • git reset 99F99F - переводит все изменения в комитах после комита с текушим хэшом "99F99F" в состояние modified.
      • git reset HEAD@{5} - переводит голову в состояние, в котором она была 5 "передвижений" назад (чтобы узнать где она была 5 шагов назад, стоит посмотреть git reflog).
    • git reset --soft - не затрагивает проиндексированные файлы или рабочую директорию.
      • git reset --soft HEAD^ - переводит последние закомиченные изменения в состояние staged и оставляет рабочую директорию такой, какая она была до reset.
    • git reset --hard - удаляет комит и изменения из рабочей директории.
      • git reset --hard HEAD^ - удаляет из дерева последний комит вместе со всеми изменениями.
    • git reset --hard [remote]/[branch] - полностью перезаписывает текущую локальную историю и изменения в рабочей директории на те, что находятся в указанной удаленный ветке.
      • git reset --hard origin/master - делает текущую ветку идентичной удаленной ветке "master".
    • git reset --merge - не затрагивает проиндексированные файлы или workng tree.
      • git reset --merge ORIG_HEAD - отменяет последнее слияние веток.
  9. git rm - удаляет файлы из рабочей директории и фиксирует изменения. [4.9]

    • git rm [file] - удаляет указанный файл и фиксирует изменения.
    • git rm --cached - переводит файл из состояния committed в состояние untracked.
  10. git mv - перемещает или переименовывает файлы, директории, символически ссылки. [4.10]

    • git mv [file] [file] - изменяет имя указанного файла и фиксирует изменения.
  11. git branch - выводит, создает или удаляет ветки. [4.11]

    • git branch - выводит все локальные ветки в данном репозитории.
    • git branch [branch] - создает новую ветку с указанным именем "branch".
    • git branch -d [branch] - удаляет ветку с указанным именем "branch".
    • git branch --set-upstream-to=[remote]/[branch-remote] [branch-local] - устанавливает связь текущей ветки "branch-local" с веткой "branch-remote" в удаленном репозитории "remote".
  12. git checkout - переключается между элементами или откатывает изменения в файлах в рабочей директории. [4.12]

    • git checkout -- [file] - откатывает изменения в файле.
    • git checkout [object] - переходит на указанный объект.
    • git checkout --track [remote] [branch] - создает новую локальную ветку "branch", идентичную удаленной ветке.
  13. git merge - соединяет две или более истории в одну. [4.13]

    • git merge [object] - сливает историю согласно указанному объекту.
    • git merge -s [strategy] - сливает истории, используя указанную стратегию.
    • git merge --no-commit - сливает истории, не создавая нового комита.
  14. git log - показывает лог комитов. [4.14]

    • git log [object] - показывает историю согласно указанному объекту.
    • git log [file] - показывает комиты, в которых фигурировал данный файл.
    • git log -[N] - ограничивает число выведенных коммитов на N.
  15. git stash - прячет, достает, очищает изменения в рабочей директории. [4.15]

    • git stash - прячет все текущие staged файлы в стэш.
    • git stash pop - достает все файлы из стэша в staged area.
    • git stash list - показывает все файлы в стэше.
    • git stash clear - очищает стэш, удаляя все файлы в нем.
  16. git tag - создает, показывает, удаляет или проверяет теги. [4.16]

    • git tag - выводит все созданные теги.
    • git tag - l [pattern] - выводит все созданные теги, удовлетворяющие указанному паттерну.
    • git tag [name] - создает тег для текущего положения HEAD с именем "name".
    • git tag -d [name] - удаляет тег с именем "name".
    • git tag -a [version] - создает аннотированный тег, который является полноценным объектом.
  17. git fetch - загружает историю из указанного репозитория. [4.17]

    • git fetch [remote] - обновляет все ветки, связанные с данным удаленным репозиторием.
    • git fetch --all - обновляет все ветки, которые имеют привязки к удаленным репозиториям.
  18. git pull - загружает историю из указанного репозитория и сливает ее с локальной историей. [4.18]

    • git pull [remote] [branch] - загружает историю ветки из указанного удаленного репозитория.
    • git pull -r - применяет rebase алгоритм вместо merge при слиянии истории.
  19. git push - загружает историю в удаленный репозиторий. [4.19]

    • git push [remote] [branch] - загружает историю локальной ветки в указанный удаленный репозиторий.
    • git push [remote] :[branch] - удаляет указанную ветку из удаленного репозитория.
  20. git remote - управляет набором отслеживаемых репозиториев. [4.20]

    • git remote - показывает имена подключенных репозиториев.
    • git remote -v - показывает имена и пути подключенных репозиториев.
    • git remote add [name] [path] - до
  21. git show - выводит информацию о различных объектах. [4.21]

    • git show [object] - выводит информацию об указанном объекте.
  22. git cherry-pick - переносит изменения, представленные в указанных комитах. [4.22]

    • git cherry-pick [commit] - применяет указанный комит к текущей ветке.
  23. git rebase - переносит локальные комиты в указанное положение в дереве. [4.23]

    • git rebase [object] - применяет комиты из указанного объекта на текущую ветку.
    • git rebase -i - открывает редактор с выделенными комитами, где можно указать параметры ребейза определенного коммита.
    • git rebase [object] --onto [newbase] - применяет выделенные коммиты в "newbase".
  24. git revert - отменяет существующие комиты. [4.24]

    • git revert [commit] - отменяет изменения, на которые указывает данный объект.
    • git revert --no-commit - отменяет изменения без создания нового комита.
  25. git grep - выводит строки, удовлетворяющие паттерну. [4.25]

    • git grep [pattern] -- [file-pattern] - возвращает все выражения удовлетворяющие "pattern" во всех файлах, удовлетворяющих "file-pattern".
    • git grep -e - означает, что следущий параметр является паттерном.
  26. git clean - удаляет неиндексированные файлы из рабочей директории. [4.26]

    • git clean [file] - удаляет untracked указанный файл.
    • git clean -d - удаляет также и директории.
    • git clean -f - если в конфигурациях поле clean.requireForce не true, то без этого параметра git откажется удалять файлы.
    • git clean -x - игнорирует .gitignore файл, тем самым можно удалять ignored файлы.
  27. git reflog - управляет reflog информацией. [4.27]

    • git reflog [ref] - выводит reflog указанного ref.

Система контроля версий

  1. VCS (Version Control System) - система контроля версий, регистрирующая изменения в одной или нескольких файлах с тем, чтобы в дальнейшем была возможность вернуться к определенным старым версиям этих файлов. [1.1]

    • Позволяет разработчкам работать одновременно над одним проектом.
    • Предотвращает случайные изменения в файлах.
    • Управляет историей проекта.
    • Существует два типа VCS: CVCS и DVCS.
    • VCS может хранить изменения локально или удаленно.
  2. CVCS (Central Version Control System) - централизованная система контроля версий, которая подразумевает, что существует сервер, на котором хранятся все файлы под контролем VCS, и ряд клиентов получают копии файлов из него. [1.2]

    • Имеет преимущество над локальными VCS.
    • Администрирование единой VCS намного легче, чем локальные базы на каждом клиенте.
    • Однако такой подход является не безопасным, т.к. CVCS в единственном экземпляре.
  3. DVCS (Distributed Version Control System) - распределенная система контроля версий подразумевает, что у клиентов находится полная копия репозитория с сервера, что позволяет легко восстановить рабочий прототип, если с ним что-то случится. [1.3]

    • Любое ответвление автоматически является бекапом проекта.
    • В больше части этих систем можно работать с несколькими удаленными репозиториями, таким образом, можно одновременно работать по-разному с разными группами людей в рамках одного проекта.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment