Git (произн. «гит») — распределённая система управления версиями. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. Система спроектирована как набор программ, специально разработанных с учётом их использования в скриптах. Это позволяет удобно создавать специализированные системы контроля версий на базе Git или пользовательские интерфейсы.
Система управления версиями (от англ. Version Control System, VCS или Revision Control System) — программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое. Такие системы наиболее широко используются при разработке программного обеспечения для хранения исходных кодов разрабатываемой программы. Однако они могут с успехом применяться и в других областях, в которых ведётся работа с большим количеством непрерывно изменяющихся электронных документов.
Ядро Git представляет собой набор утилит командной строки с параметрами. Все настройки хранятся в текстовых файлах конфигурации.
Репозиторий Git представляет собой каталог файловой системы, в котором находятся файлы конфигурации репозитория, файлы журналов, хранящие операции, выполняемые над репозиторием, индекс, описывающий расположение файлов, и хранилище, содержащее собственно файлы. Структура хранилища файлов не отражает реальную структуру хранящегося в репозитории файлового дерева, она ориентирована на повышение скорости выполнения операций с репозиторием.
По умолчанию репозиторий хранится в подкаталоге с названием «.git» в корневом каталоге рабочей копии дерева файлов, хранящегося в репозитории.
Создание локального репозитория в текущем каталоге
$ git init
Клонирование удаленного репозитория в локальный каталог [с указанным имени]
$ git clone https://github.com/userName/originName.git [newLocalName]
Задаем имя пользователя и электронную почту.
Глобально для всех проектов текущего пользователя:
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com
Для конкретного проекта (эти настройки переопределят глобальные):
$ git config --local user.name "John Doe" $ git config --local user.email johndoe@example.com
Зачастую, у вас имеется группа файлов, которые вы не только не хотите автоматически добавлять в репозиторий, но и видеть в списках неотслеживаемых. К таким файлам обычно относятся автоматически генерируемые файлы (различные логи, результаты сборки программ и т.п.). В таком случае, вы можете создать файл .gitignore с перечислением шаблонов соответствующих таким файлам. Вот пример файла .gitignore:
*.[oa] *.log
Первая строка предписывает Git'у игнорировать любые файлы заканчивающиеся на .o или .a — объектные и архивные файлы, которые могут появиться во время сборки кода. Вторая - то же самое, для файлов заканчивающихся на «.log
».
Исключаем папки и файлы, начинающиеся с двух подчёркиваний и содержимое virt.py3
:
__*/* __* virt.py3/*
$ git help
Вывести информацию обо всех изменениях, внесенных в дерево директорий проекта:
$ git status
Краткий вывод:
$ git status --short $ git status --s
Обозначения в выводе команды git status -s
:
M
- (modified) отслеживаемые, изменились с прошлого коммита, еще не добавленыD
- (deleted) отслеживаемые, удалены после прошлого коммита, еще не добавлены?
- (untracked) неотслеживаемые, не запрещены к добавлению!
- (ignored) неотслеживаемые, запрещены к добавлению (например, в .gitignore)$ git add . $ git add -all $ git add -A $ git add -update $ git add -u
git add .
– Добавляет файлы M
, D
, ?
.-all
, -A
– Эти варианты эквивалентны и добавляют M
, D
, ?
. Без точки — из всей рабочей области. С точкой — только текущий путь: git add -A .
= git add .
+ git add -u .
git add .
-update
, -u
– Git обновляет (update) статус уже отслеживаемых файлов т.е. M, D.git add *
– Этот синтаксис лучше не использовать, т.к. он пытается добавить M
, ?
, !
, причём последнее приводит к ошибке.$ git commit $ git commit -a $ git commit -m "text"
git commit
– Если индекс не пустой, то на его основе будет совершен коммит, после чего пользователя попросят прокомментировать вносимые изменения.-a
– Совершит коммит, автоматически индексируя изменения в файлах проекта. Новые файлы при этом индексироваться не будут! Удаление же файлов будет учтено.-m «text»
– Комментируем коммит прямо из командной строки вместо текстового редактора. git commit -m "Название коммита"
git commit --amend -m "Новое название коммита"
. Для изменения имени других коммитов, нужно сделать:
git commit --amend -c <commit ID>
Переименовывать или перемещать файлы и папки нужно из git
. Подробнее см. справку.
$ git mv old_filename new_filename
$ git rebase -i HEAD~2
pick
. Вам необходимо изменить слово pick
на букву s
у второй строки. Это означает, что данный коммит будет объединен с предыдущим коммитом – это написано в комментариях.git rm FILE1 FILE2
– Удалить файл(ы) из индекса и дерева одновременно.git reset
– Сбросить весь индекс. git reset –soft HEAD^
– переходим к работе над уже совершенным коммитом, сохраняя все состояние проекта и проиндексированные файлы.git reset –hard HEAD~3
– Никто и никогда не увидит три последних коммита. revert
– отмена изменений, произведенных в прошлом отдельным коммитом. Для использования команды необходимо, чтобы состояние проекта не отличалось от состояния, зафиксированного последним коммитом.git revert config-modify-tag
– отменяем коммит, помеченный тегом.git revert 12abacd
– отменяем коммит, используя его хэш.git log
– Разнообразная информация о коммитах в целом, по отдельным файлам и различной глубины погружения в историю.git diff
– Отличия между деревьями проекта; коммитами; состоянием индекса и каким-либо коммитом.git diff
– Изменения, не внесенные в индекс.git diff –cached
– Изменения, внесенные в индекс.git diff HEAD
– Изменения в проекте по сравнению с последним коммитом.git diff HEAD^
– Изменения в проекте по сравнению с предпоследним коммитом.git branch
– Создание, перечисление и удаление веток git branch
– Просто перечислит существующие ветки, отметив активную.git branch new-branch
– Создаст новую ветку new-branch.git branch -d new-branch
– Удалит ветку, если та была залита (merged) с разрешением возможных конфликтов в текущую.git branch -D new-branch
– Удалит ветку в любом случае.git branch -m new-name-branch
– Переименует ветку.git branch –contains v1.2
– Покажет те ветки, среди предков которых есть определенный коммит.git checkout
– Переключение между ветками, извлечение отдельных файлов из истории коммитовgit checkout [branch_name]
– Переключает на ветку branch_name
.git checkout -b [branch_name]
– Создаёт ветку branch_name
и переключает на неё. git rebase
– Построение ровной линии коммитов git cherry-pick
– Применение к дереву проекта изменений, внесенных отдельным коммитом git tag
– Тэги как способ пометить уникальный коммит git merge [branch_name]
– Сливает текущую ветку с branch_name
. git rebase
– Второй способ объединения изменений в ветках.git rebase [branch_name]
– Вливает текущую ветку в branch_name
.
– $ git remote add origin https://github.com/userName/originName.git
$ git remote -v
$ git push -u origin master
В дальнейшем нам потребуется только последний пункт.
gitg
: wiki.gnome.org/Apps/Gitggitk
, git gui
: git-scm.com/