Данный гист содержит базовые понятия состовляющих 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]
- Любое ответвление автоматически является бекапом проекта.
- В больше части этих систем можно работать с несколькими удаленными репозиториями, таким образом, можно одновременно работать по-разному с разными группами людей в рамках одного проекта.