Команды Git


В этой заметке собрал самую полезную информацию из книги Pro Git.

Для начала установим Git:

apt-get install git
yum install git

Git для Windows: https://git-scm.com/

Теперь сгенерируем ключи для работы с git-репозиториями:

ssh-keygen -t rsa

В домашнем каталоге появиться папка .ssh с публичным и приватным ключом. Публичный ключ можно добавить в сервисы вроде Bitbucket или Github.

Настройки

Первым делом нужно указать свое имя и email-адрес:

$ git config --global user.name "User Name"
$ git config --global user.email username@example.com

При использовании параметра --global, настройки сохраняться в файле .gitconfig в корне домашней директории ~/.gitconfig. Также можно передать следующие параметры.

  • --system - сохранится в файле /etc/gitconfig
  • --local - сохранится для текущего проекта в папке .git/config

У файла настроек --local самые высокие приоритеты, а у --system самые низкие.

Код переноса строк

git config --global core.autocrlf true|false|input

true - если в редакторе используется код Windows CRLF, то при добавлении в индекс, он автоматически конвертируется в LF. И наоборот при извлечении.

input - CRLF конвертируется в LF при добавлении в коммит, но при извлечении обратно не конвертируется.

false - отключении данного функционала.

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

git config --global core.editor nano

Подсветка

git config --global core.ui false|auto|always
# false - отключить
# auto - цвет используется при выводе в терминал, но отключается при перенаправлении в именованный канал или файл
# always - цвет используется всегда

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

# список всех настроек
git config --list
# список всех настроек вместе с файлами настроек
git config --list --show-origin
# значение конкретного параметра
git config user.email
# значение конкретного параметра и вывод файла настроек
git config --show-origin user.email

Создание репозитория

# создание репозитория с нуля
mkdir new-project
cd new-project
git init
# создание репозитория в существующем проекте project
cd project
git init
# также можно клонировать существующий репозиторий
git clone <url>
# можно самому задать название создаваемой директории
git clone <url> new-dir-name

Запись изменений в репозиторий

# определение состояния файлов
git status
# сокращенный вывод
git status -s
# добавление файла в индекс
git add file
# сравнение рабочего каталога с содержимым индекса
git diff
# можно проверить файл
git diff file
# сравнение изменений проиндексированных файлов с последним коммитом (также можно использовать --cached)
git diff --staged
git diff --staged file

# коммит (фиксация) изменений
git commit
git commit -m 'комментарий'
# автоматическое добавление всех отслеживаемых файлов в индекс и фиксация
git commit -a -m 'комментарий'

# удаление файла из отслеживаемых файлов и из рабочего каталога
git rm file
# удаление файла из отслеживаемых файлов без удаления из рабочего каталога
git rm --cached file

# удаление папки рекурсивно
git rm -r folder
git rm -r --cached folder

# перемещение файла
git mv file-from file-to
# заменяет следующие 3 команды
mv file-from file-to
git rm file-from
git add file-to

История коммитов

git log
# вывод изменений в каждом коммите
git log -p
# вывод сокращенной статистики
git log --stat
# вывод количества изменений
git log --shortstat
# вывод списка измененных файлов
git log --name-status
# вывод каждого коммита на одной строке
git log --oneline
# вывод в виде ASCII-графа
git log --graph

Изменение формата вывода логов:

git log --pretty=oneline
git log --pretty=format:"%h - %ar %an [%ae] : %s"
# выводит историю слияний в красивом формате ASCII-графа
git log --pretty=format:"%h - %ar %an [%ae] : %s" --graph

Полезные опции:

Опция Описание вывода
%H Хеш коммита
%h Сокращенный хеш коммита
%T Хеш дерева
%t Сокращенный хеш дерева
%P Хеш родителей
%p Сокращенный хеш родителей
%an Имя автора
%ae Электронная почта автора
%ad Дата автора (формат даты можно задать опцией --date=option)
%ar Относительная дата автора
%cn Имя коммитера
%ce Электронная почта коммитера
%cd Дата коммитера
%cr Относительная дата коммитера
%s Содержание

Отмена

# внесение изменений в последний коммит
git commit --amend
git commit --amend -m 'новый комментарий'

# исключение файла из индекса
git reset --HEAD file
# с версии 2.23.0 появилась новая команда
git restore --staged file

# отмена внесенных изменений в файл
git checkout -- file
# с версии 2.23.0 появилась новая команда
git restore file

Удаленные репозитории

При клонировании репозитория по умолчанию создается удаленный репозиторий под названием origin.

# вывод названий
git remote
# вывод названий и адресов
git remote -v

# добавление
git remote add new-remote-repository <url>

# удаление
git remote remove new-remote-repository

# переименование
git remote rename current-name new-name

# просмотр удаленного репозитория
git remote show origin

Получение изменений из удаленного репозитория

Команда fetch забирает все новые коммиты из удаленного репозитория, но не сливает их в локальные ветки.

# получение изменений из всех удаленных репозиториев
git fetch
# получение изменений из origin
git fetch origin

Команду pull можно использовать, если ветка настроена на отслеживание удаленного репозитория:

# данная команда в отличии от fetch сливает все изменения в локальную ветку
git pull

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

git push origin master

Теги

Git использует два основных типа тегов: легковесные и аннотированные.

Легковесный тег — это что-то очень похожее на ветку, которая не изменяется — просто указатель на определённый коммит.

А вот аннотированные теги хранятся в базе данных Git как полноценные объекты. Они имеют контрольную сумму, содержат имя автора, его e-mail и дату создания, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard GPG).

# просмотр списка
git tag
# поиск тега по шаблону
git tag -l "v1.2*"

# создание аннотированного тега
git tag -a v1.2 -m "новый тег v1.2"
# просмотр созданного тега
git show v1.2
# создание легковесного тега
git tag v1.3
# добавление тега в указанный коммит
git tag -a v1.1 [хеш-сумма коммита]

# отправка тега в удаленный репозиторий
git push origin v1.2
# отправка всех добавленных тегов
git push origin --tags
# отправка лишь аннотированных тегов
git push origin --follow-tags

# удаление тега
git tag -d v1.1
# удаление тега из удаленного репозитория
git push origin --delete v1.1

# переход на указанный тег
git checkout v1.2

Псевдонимы

Можно создать псевдоним для какой-то сложной команды, которую трудно запомнить.

# нелегко набирать каждый раз подобную команду
git log --pretty=format:"%h - %ar %an [%ae] : %s" --graph
# можно создать псевдоним hist
git config --global alias.hist 'log --pretty=format:"%h - %ar %an [%ae] : %s" --graph'
# предыдущая команда упрощается до такой команды
git hist

Работа с ветками

Ветка в Git — это простой перемещаемый указатель на один из коммитов. По умолчанию, имя основной ветки в Git — master. Она создается при выполнении команды git init. Как только вы начнёте создавать коммиты, ветка master будет всегда указывать на последний коммит. Каждый раз при создании коммита указатель ветки master будет передвигаться на следующий коммит автоматически.

# создание новой ветки
git branch new-branch
# переключение на новую ветку
git checkout new-branch
# предыдущие две команды можно объединить в одну
git checkout -b new-branch

# начиная с версии 2.23 для создания ветки можно использовать команду
git switch new-branch
# а для создания новой ветки и переключения можно выполнить команду
git switch -c new-branch

# удаление ветки new-branch
git branch -d new-branch

# все коммиты новой ветки new-branch можно слить в master при помощи следующей команды
# сначала переключаемся в ветку master
git checkout master
# потом выполняем команду слияния
git merge new-branch

# вывод списка веток
git branch
# вывод последнего коммита на каждой из веток
git branch -v
# вывод всех веток, которые слиты в текущую ветку
git branch --merged
# вывод всех веток, которые еще не слиты в текущую ветку
git branch --no-merged
# вывод всех веток, которые были слиты в ветку master
git branch --merged master
# вывод всех веток, которые не слиты в ветку master
git branch --no-merged master

Переименование ветки

Только нельзя переименовать ветку, которая используется другими участниками.

# переименование на локальном репозитории
git branch --move bad-branch-name good-branch-name
# отправляем в удаленный репозиторий исправленное название ветки
git push --set-upstream origin good-branch-name
# осталось удалить старую ветку bad-branch-name на удаленном репозитории
git push origin --delete bad-branch-name

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

Ветки слежения — это ссылки на определённое состояние удалённых веток. Это локальные ветки, которые нельзя перемещать; Git перемещает их автоматически при любой коммуникации с удаленным репозиторием, чтобы гарантировать точное соответствие с ним. Можно представить их как закладки для напоминания о том, где ветки в удалённых репозиториях находились во время последнего подключения к ним. Имена веток слежения имеют вид remote/branch.

Предположим другой человек запушил в удаленный репозиторий новую ветку task:

git push origin task

эту ветку мы можем получить командой

git fetch origin

Таким образом мы получили на локальном репозитории ссылку на удаленную ветку origin/task. Чтобы слит все правки в текущую ветку можно выполнить команду

git merge origin/task

Или же в своем репозитории можно создать полноценную ветку task на основе удаленной ветки origin/task

# это более универсальная команда
# здесь мы можем менять название создаваемой локальной ветки
git checkout -b task origin/task

# тот же результат можно получить сокращенной командой
git checkout --track origin/serverfix

# вот еще короткая команда
# это сработает, если имеется только одна удаленная ветка с таким названием
git checkout task

Получение локальной ветки из удалённой ветки автоматически создаёт то, что называется веткой слежения (а ветка, за которой следит локальная называется upstream branch). Ветки слежения — это локальные ветки, которые напрямую связаны с удалённой веткой.

Если, находясь на ветке слежения, выполнить git pull, то Git уже будет знать с какого сервера получать данные и какую ветку использовать для слияния.

Информацию о ветках слежения можно получить командой

git branch -vv

Команда git fetch получает с сервера все изменения, которых у вас ещё нет, но не будет изменять состояние вашей рабочей копии. Эта команда просто получает данные и позволяет вам самостоятельно сделать слияние. Тем не менее, существует команда git pull, которая в большинстве случаев является командой git fetch, за которой непосредственно следует команда git merge. Если у вас настроена ветка слежения, git pull определит сервер и ветку, за которыми следит ваша текущая ветка, получит данные с этого сервера и затем попытается слить удалённую ветку.

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

Первое, что сделает reset — переместит то, на что указывает HEAD. Только изменяется не сам HEAD (что происходит при выполнении команды checkout); reset перемещает ветку, на которую указывает HEAD. Таким образом, если HEAD указывает на ветку master (то есть вы сейчас работаете с веткой master), выполнение команды git reset 9e5e6a4 сделает так, что master будет указывать на 9e5e6a4.

# отменяются предыдущие коммиты
# индекс и рабочий каталог не меняются
git reset --soft [хеш-сумма коммита]

# отменяются предыдущие коммиты
# меняется индекс, но не меняется рабочий каталог
git reset --mixed [хеш-сумма коммита]
# по умолчанию используется --mixed
git reset [[хеш-сумма коммита]

# отменяются предыдущие коммиты
# меняется и индекс, и рабочий каталог
# т.е. удаляются все данные предыдущих коммитов
git reset --hard [хеш-сумма коммита]

Прежде чем написать комментарий, нужно авторизаться на сайте