18 декабря 2014 г.

Git: Справочник основных команд

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

Для изучения Git с нуля рекомендую прочитать официальное руководство Pro Git (http://git-scm.com/book/ru) или интерактивный русскоязычный тур Git How To (http://githowto.com/ru).

Установка Git

Установка из исходных кодов описана в официальном руководстве Git (http://git-scm.com/book/ru).

Установка в Ubuntu

$ sudo apt-get install git

Установка в Fedora

$ yum install git-core

Установка в OpenSUSE

$ zypper in git-core

Установка в Mac с помощью графического инсталятора Git

http://sourceforge.net/projects/git-osx-installer/

Установка в Mac с помощью MacPorts

$ sudo port install git-core +svn +doc +bash_completion +gitweb

Установка в Windows

http://msysgit.github.com/

Первичная настройка

В состав Git входит утилита git config, которая позволяет просматривать и устанавливать параметры, контролирующие все аспекты работы Git и его внешний вид. Эти параметры могут быть сохранены в трёх местах:

  • Файл /etc/gitconfig содержит значения, общие для всех пользователей системы и для всех их репозиториев. Если при запуске git config указать параметр --system, то параметры будут читаться и сохраняться именно в этот файл.
  • Файл ~/.gitconfig хранит настройки конкретного пользователя. Этот файл используется при указании параметра --global.
  • Конфигурационный файл в каталоге Git'а (.git/config) в том репозитории, где вы находитесь в данный момент. Эти параметры действуют только для данного конкретного репозитория. Настройки на каждом следующем уровне подменяют настройки из предыдущих уровней, то есть значения в .git/config перекрывают соответствующие значения в /etc/gitconfig.

В системах семейства Windows Git ищет файл .gitconfig в каталоге $HOME (C:\Documents and Settings\$USER или C:\Users\$USER для большинства пользователей). Кроме того Git ищет файл /etc/gitconfig, но уже относительно корневого каталога MSys, который находится там, куда вы решили установить Git, когда запускали инсталлятор.

Установка имени и электронной почты

Установка имени и адреса электронной почты. Каждый коммит в Git'е содержит эту информацию, и она включена в передаваемые коммиты и не может быть далее изменена:

git config --global user.name "Your Name"
git config --global user.email "your_email@whatever.com"

Параметры установки окончаний строк

Также, для пользователей Unix/Mac:

git config --global core.autocrlf input
git config --global core.safecrlf true

Выбор редактора

По умолчанию Git использует стандартный редактор, установленный в системе. Для выбора другого редактора необходимо выполнить команду:

$ git config --global core.editor emacs

Утилита сравнения

По умолчанию Git использует стандартную утилиту сравнения, для её смены необходимо выполнить команду:

$ git config --global merge.tool vimdiff

Просмотр настроек

Просмотр всех настроек выполняется командой git config --list:

$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

Также вы можете проверить значение конкретного ключа, выполнив git config {ключ}:

$ git config user.name
Scott Chacon

Псевдонимы в Git

Можно настроить псевдонимы (alias) для любой команды с помощью git config.

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

Это означает, что, например, вместо набирания git commit, вам достаточно набрать только git ci.

Основные команды

Получение справки

$ git help <команда>
$ git <команда> --help
$ man git-<команда>

Создание репозитория в существующем каталоге

$ git init

Клонирование существующего репозитория

$ git clone <адрес репозитория>

Например:

$ git clone git://github.com/schacon/grit.git

Клонирование в другой каталог осуществляется командой:

$ git clone git://github.com/schacon/grit.git <имя другого каталога>

Определение состояния файлов

$ git status

Отслеживание новых файлов

$ git add <имя файла>

Игнорирование файлов

Настройки игнорирования файлов, которые не должны обрабатываться git, находятся в файле .gitignore: в корне репозитория. Пример файла .gitignore:

# комментарий — эта строка игнорируется
# не обрабатывать файлы, имя которых заканчивается на .a
*.a
# НО отслеживать файл lib.a, несмотря на то, что мы игнорируем все .a файлы с помощью предыдущего правила
!lib.a
# игнорировать только файл TODO находящийся в корневом каталоге, не относится к файлам вида subdir/TODO
/TODO
# игнорировать все файлы в каталоге build/
build/
# игнорировать doc/notes.txt, но не doc/server/arch.txt
doc/*.txt
# игнорировать все .txt файлы в каталоге doc/
doc/**/*.txt

Просмотр индексированных и неиндексированных изменений

Для просмотра непроиндексированных изменений:

$ git diff

Для просмотра проиндексированных изменений, которые войдут в следующий коммит:

git diff --cached

Для просмотра изменений в отдельном файле:

git diff <имя файла>

Фиксация изменений

$ git commit -m "Комментарий"

Внимание!

Изменения, для которых не выполнена команда git add не будут зафиксированы.

Игнорирование индексации

Добавление параметра -a в команду git commit заставляет Git автоматически индексировать каждый уже отслеживаемый на момент коммита файл, позволяя вам обойтись без git add:

git commit -a -m "Комментарий"

Удаление файлов

Полное удаление файла и из под наблюдения Git и с жесткого диска:

git rm <имя файла>

Если файл был изменён и уже проиндексирован, необходимо использовать принудительное удаление с помощью параметра -f.

Удаление файла и из под наблюдения Git, но с жесткого диска:

git rm --cached <имя файла>

Перемещение файлов

$ git mv <имя файла> <новое имя файла>

Эквивалентно выполнению следующих команд:

$ mv <имя файла>  <новое имя файла>
$ git rm <имя файла>
$ git add <новое имя файла>

Просмотр истории коммитов

По умолчанию, без аргументов, git log выводит список коммитов созданных в данном репозитории в обратном хронологическом порядке. То есть самые последние коммиты показываются первыми.

git log

Вывод в собственном формате:

git log --pretty=format:"%h - %an, %ar : %s"

Команда log содержит много других дополнительных параметров. Подробнее о них написано в официальном руководстве Git (http://git-scm.com/book/ru).

Изменение последнего коммита

git commit --amend

Отмена индексации файла

git reset HEAD <имя файла>

Отмена изменений файла

git checkout -- <имя файла>

Просмотр меток (тегов)

$ git tag

Поиск меток(тегов) по шаблону:

$ git tag -l 'v1.4.2.*'

Создание легковесных меток(тегов)

git tag <метка>

Создание аннотированных меток(тегов)

git tag -a <метка> -m '<комментарий>'

Выставление меток(тегов) позже

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

$ git log --pretty=oneline
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

Для отметки коммита укажите его контрольную сумму (или её часть) в конце команды:

$ git tag -a v1.2 -m 'version 1.2' 9fceb02

Обмен метками(тегами)

По умолчанию, команда git push не отправляет метки на удалённые серверы. Необходимо явно отправить (push) метки на общий сервер после того, как они были созданы. Это делается так же, как и выкладывание в совместное пользование удалённых веток — нужно выполнить `git push origin [имя метки].

Чтобы отправить все метки за один раз, нужно использовать опцию --tags:

$ git push origin --tags

Удаление меток(тегов)

git tag -d <имя метки>

Отображение удалённых репозиториев

$ git remote -v

Добавление удалённых репозиториев

$ remote add [сокращение] [url]:

Извлечение данных из удаленного репозитория

Без слияния:

$ git fetch [имя удал. сервера]

Со слиянием:

$ git pull [имя удал. сервера]

Отправка данных в удаленный репозиторий

git push [удал. сервер] [ветка]

Инспекция удалённого репозитория

$ git remote show [удал. сервер]

Удаление и переименование удалённых репозиториев

Переименование:

$ git remote rename <старое имя> <новое имя>

Удаление:

$ git remote rm <имя репозитория>

Создание новой ветки

$ git branch <имя ветки>

Чтобы создать ветку и сразу же перейти на неё, необходимо выполнить команду git checkout с ключом -b:

$ git checkout -b <имя ветки>

Переход на другую ветку

$ git checkout <имя ветки>

Слияние веток

$ git merge <имя ветки>

Удаление ветки

$ git branch -d <имя ветки>

Для удаления не слитых веток необходимо использовать команду с аргументом -D:

$ git branch -D <имя ветки>

Состояние веток

Показать текущую ветку:

$ git branch

Показать последний коммит на каждой из веток:

$ git branch -v

Посмотреть ветки, которые уже слиты с текущей:

$ git branch --merged

Посмотреть ветки, которые ещё не слиты с текущей:

$ git branch --no-merged

Перемещение изменений между ветками

При помощи команды rebase можно взять все изменения, которые попали в коммиты на одной из веток, и повторить их на другой. Для этого сначала надо переместиться на ветку (команда git checkout  <имя ветки>), в которую будут переноситься изменения, а затем выполнить команду:

$ git rebase <имя ветки из которой переносятся изменения>

Отслеживание веток

$ git checkout -b [ветка] [удал. сервер]/[ветка]

Для Git версии 1.6.2 или более поздних, можно также воспользоваться сокращением --track:

$ git checkout --track origin/serverfix

Чтобы настроить локальную ветку с именем, отличным от имени удалённой ветки, можно легко использовать первую версию с другим именем локальной ветки:

$ git checkout -b sf origin/serverfix

Удаление веток на удалённом сервере

$ git push [удал. сервер] :[ветка]

Прятанье

$ git stash

Вывести список спрятанного:

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051... Revert "added file_size"
stash@{2}: WIP on master: 21d80a5... added number to log

Применить спрятанное:

$ git stash apply stash@{2}

Создание ветки из спрятанных изменений:

$ git stash branch <имя ветки>

Примечание

В статье описаны основные команды Git. Это далеко не полный перечень его возможностей. Исчерпывающую информацию по работе и настройке Git можно получить в официальном руководстве Pro Git (http://git-scm.com/book/ru).