Данный гист содержит базовые понятия состовляющих Git и его процессов, а так же сборник доступных команд.
-
-
Save vchernogorov/030144a7b0832c683adc3e0b502ad3e5 to your computer and use it in GitHub Desktop.
-
Принцип хранения - многие VCS хранят свои данные в виде списка изменений, Git же хранит полные копии файлов, только заменяя неизмененные файлы на ссылки. [2.1]
- Таким образом Git является своего рода небольшой файловой системой.
- Такой подход предоставляет ряд преимуществ при восстановлении данных, работе с комитами и т.д., но требует больше места.
-
Локальные операции - для совершения большинства операций в Git'е необходимы только локальные файлы и ресурсы, т.е. обычно информация с других компьютеров в сети не нужна. [2.2]
- Данная особенность позволяет спокойно делать коммиты, а затем отправить их, как только станет доступна сеть (в некоторых других VCS это невозможно или же крайне неудобно).
- Поскольку вся история проекта хранится локально у вас на диске, большинство операций кажутся практически мгновенными.
-
Состояние файла - в 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.
-
Repository - это место, где Git хранит метаданные и базу данных объектов вашего проекта.
- Это наиболее важная часть Git'а, и именно она копируется, когда вы клонируете репозиторий с другого компьютера.
- Git хранит все изменения в скрытой папке .git, которая есть в каждом проекте, находящемся под контролем VCS.
-
Working Directory - это извлечённая из базы копия определённой версии проекта.
-
Staging Area - это обычный файл, хранящийся в репозитории Git'а, который содержит информацию о том, что должно войти в следующий коммит.
-
Blob (Binary Large Object) - каждая версия файла представлена блобом.
- Блоб хранит данные файла, за исключением метаданных.
- Это бинарный файл, который в Git базе данных указывается как SHA1 хэш этого файла.
-
Tree - объект, который представляет директорию.
- Дерево - это бинарный файл, который хранит ссылки к блобам и деревьям, также указывается SHA1 хэшом.
-
Commit - содержит текущее состояние репозитория.
- Как и дерево или блоб, коммит хранится в виде SHA1 хэша.
- Можно понимать коммит, как узел в связном листе.
- Каждый коммит имеет указатель на своего предка-коммита.
- Коммит может имет несколько указателей на несколько предков - это значит, что он был создан слиянием веток.
-
Branch - используется для создания новой ветки разработки.
- По умолчанию, первая ветка в репозитории -
master.
- По умолчанию, первая ветка в репозитории -
-
Tag - обозначает значимое имя с указанной версией в репозитории.
- Теги очень похожи на ветки, но отличие в том, что они неизменяемы. Если сделать тег для коммита, то даже если создать новый коммит от данного, то он не обновится.
-
Clone - эта операция создает локальный инстанс репозитория.
- Она не только создает копию рабочей версии проекта, но и закачивает всю историю репозитория.
-
Pull - операция копирования изменений из удаленного репозитория в локальный.
- Используется для синхронизации между репозиториями.
-
Push - операция копирования изменений из локального репозтироия в удаленный.
- Используется для записи изменений в удаленный репозиторий (навсегда, если следовать правилам).
-
HEAD - указатель, который обычно указывает на последний комит в ветке.
- Когда вы делаете комит, то голова перемещается на него.
- Голову можно переместить на любой другой объект кроме комита.
- ORIG_HEAD - предыдущее состояние HEAD.
-
Revision - представляет собой версию исходников
- В Git ревизии представлена коммитами.
-
URL - место, где находится репозиторий.
- Хранится в файле конфигураций (
git config).
- Хранится в файле конфигураций (
-
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.
-
git init- создание пустого репозитория или переинициализация существующего. [4.2]git init- создает репозиторий в текущей папке.git init [directory]- создает директорию "directory" с репозиторием.
-
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.
-
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 файлов в проекте.
-
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 файлов.
-
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.
-
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 файлы в предыдущий комит, тем самым перезаписывая его хэш.
-
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- отменяет последнее слияние веток.
-
git rm- удаляет файлы из рабочей директории и фиксирует изменения. [4.9]git rm [file]- удаляет указанный файл и фиксирует изменения.git rm --cached- переводит файл из состояния committed в состояние untracked.
-
git mv- перемещает или переименовывает файлы, директории, символически ссылки. [4.10]git mv [file] [file]- изменяет имя указанного файла и фиксирует изменения.
-
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".
-
git checkout- переключается между элементами или откатывает изменения в файлах в рабочей директории. [4.12]git checkout -- [file]- откатывает изменения в файле.git checkout [object]- переходит на указанный объект.git checkout --track [remote] [branch]- создает новую локальную ветку "branch", идентичную удаленной ветке.
-
git merge- соединяет две или более истории в одну. [4.13]git merge [object]- сливает историю согласно указанному объекту.git merge -s [strategy]- сливает истории, используя указанную стратегию.git merge --no-commit- сливает истории, не создавая нового комита.
-
git log- показывает лог комитов. [4.14]git log [object]- показывает историю согласно указанному объекту.git log [file]- показывает комиты, в которых фигурировал данный файл.git log -[N]- ограничивает число выведенных коммитов на N.
-
git stash- прячет, достает, очищает изменения в рабочей директории. [4.15]git stash- прячет все текущие staged файлы в стэш.git stash pop- достает все файлы из стэша в staged area.git stash list- показывает все файлы в стэше.git stash clear- очищает стэш, удаляя все файлы в нем.
-
git tag- создает, показывает, удаляет или проверяет теги. [4.16]git tag- выводит все созданные теги.git tag - l [pattern]- выводит все созданные теги, удовлетворяющие указанному паттерну.git tag [name]- создает тег для текущего положения HEAD с именем "name".git tag -d [name]- удаляет тег с именем "name".git tag -a [version]- создает аннотированный тег, который является полноценным объектом.
-
git fetch- загружает историю из указанного репозитория. [4.17]git fetch [remote]- обновляет все ветки, связанные с данным удаленным репозиторием.git fetch --all- обновляет все ветки, которые имеют привязки к удаленным репозиториям.
-
git pull- загружает историю из указанного репозитория и сливает ее с локальной историей. [4.18]git pull [remote] [branch]- загружает историю ветки из указанного удаленного репозитория.git pull -r- применяет rebase алгоритм вместо merge при слиянии истории.
-
git push- загружает историю в удаленный репозиторий. [4.19]git push [remote] [branch]- загружает историю локальной ветки в указанный удаленный репозиторий.git push [remote] :[branch]- удаляет указанную ветку из удаленного репозитория.
-
git remote- управляет набором отслеживаемых репозиториев. [4.20]git remote- показывает имена подключенных репозиториев.git remote -v- показывает имена и пути подключенных репозиториев.git remote add [name] [path]- до
-
git show- выводит информацию о различных объектах. [4.21]git show [object]- выводит информацию об указанном объекте.
-
git cherry-pick- переносит изменения, представленные в указанных комитах. [4.22]git cherry-pick [commit]- применяет указанный комит к текущей ветке.
-
git rebase- переносит локальные комиты в указанное положение в дереве. [4.23]git rebase [object]- применяет комиты из указанного объекта на текущую ветку.git rebase -i- открывает редактор с выделенными комитами, где можно указать параметры ребейза определенного коммита.git rebase [object] --onto [newbase]- применяет выделенные коммиты в "newbase".
-
git revert- отменяет существующие комиты. [4.24]git revert [commit]- отменяет изменения, на которые указывает данный объект.git revert --no-commit- отменяет изменения без создания нового комита.
-
git grep- выводит строки, удовлетворяющие паттерну. [4.25]git grep [pattern] -- [file-pattern]- возвращает все выражения удовлетворяющие "pattern" во всех файлах, удовлетворяющих "file-pattern".git grep -e- означает, что следущий параметр является паттерном.
-
git clean- удаляет неиндексированные файлы из рабочей директории. [4.26]git clean [file]- удаляет untracked указанный файл.git clean -d- удаляет также и директории.git clean -f- если в конфигурациях поле clean.requireForce не true, то без этого параметра git откажется удалять файлы.git clean -x- игнорирует .gitignore файл, тем самым можно удалять ignored файлы.
-
git reflog- управляет reflog информацией. [4.27]git reflog [ref]- выводит reflog указанного ref.
-
VCS (Version Control System) - система контроля версий, регистрирующая изменения в одной или нескольких файлах с тем, чтобы в дальнейшем была возможность вернуться к определенным старым версиям этих файлов. [1.1]
- Позволяет разработчкам работать одновременно над одним проектом.
- Предотвращает случайные изменения в файлах.
- Управляет историей проекта.
- Существует два типа VCS: CVCS и DVCS.
- VCS может хранить изменения локально или удаленно.
-
CVCS (Central Version Control System) - централизованная система контроля версий, которая подразумевает, что существует сервер, на котором хранятся все файлы под контролем VCS, и ряд клиентов получают копии файлов из него. [1.2]
- Имеет преимущество над локальными VCS.
- Администрирование единой VCS намного легче, чем локальные базы на каждом клиенте.
- Однако такой подход является не безопасным, т.к. CVCS в единственном экземпляре.
-
DVCS (Distributed Version Control System) - распределенная система контроля версий подразумевает, что у клиентов находится полная копия репозитория с сервера, что позволяет легко восстановить рабочий прототип, если с ним что-то случится. [1.3]
- Любое ответвление автоматически является бекапом проекта.
- В больше части этих систем можно работать с несколькими удаленными репозиториями, таким образом, можно одновременно работать по-разному с разными группами людей в рамках одного проекта.