---
title: "Git: основные команды"
category: Программирование
tags: программирование, git
monofontoptions:
- Scale=0.8
...
## Ссылки
* [GitHowTo](https://githowto.com/ru/changes_not_files)
* [ProGit](https://git-scm.com/book/ru/v2)
* [Git Pocket Guide](https://github.com/maxliscia/git-pocket)
## Установка
В Debian/Ubuntu:
```sh
sudo apt-get install git
```
## Термины
| Термин | Англ | Определение |
| ------ | ------ | ----------------------- |
| Рабочий каталог | working directory | Набор файлов в текущем каталоге |
| Индекс | index, staging area | Область с файлами, подготовленными для фиксации |
| SHA-1 | SHA-1 | Уникальный идентификатор, отражающий информацию об истории |
| Ветка | branch | Именованная последовательность в истории изменений |
| Фиксация (коммит) | commit | Набор файлов, записанных в историю одновременно |
| `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке |
| Метка | tag | Именованная ссылка на некоторую фиксацию в истории |
## Состояния
Файлы в рабочем каталоге могут отслеживаться системой контроля версий
(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме
обозначены зелёным фоном, могут быть неизменёнными (unmodified),
изменёнными (modified) или подготовленными к фиксации (staged).
```plantuml
@startuml
participant untracked as "Неотслеживамые\n(untracked)"
participant unmodified as "Неизменённые\n(unmodified)" #99FF99
participant modified as "Изменённые\n(modified)" #77FF77
participant staged as "Подготовленные к фиксации\n(staged)" #55FF55
untracked -> staged : git add
unmodified -> modified : редактирование
modified -> staged : git add
staged -> unmodified : git commit
modified -> untracked: git rm --cached
unmodified -> untracked: git rm --cached
staged -> untracked: git rm --cached
@enduml
```
## Настройка
| Команда | Ключи | Описание |
| ---- | ---------- | ------------ |
| `git config` | `--global user.name "John Doe"` | Имя текущего пользователя |
| `git config` | `--global user.email "mail@example.com"` | Почта текущего пользователя |
| `git config` | `--list` | Вывод текущей конфигурации |
| `git config` | `--global --list` | Вывод глобальной конфигурации |
## Инициализация
| Команда | Ключи | Описание |
| ---- | ------ | ------------ |
| `git init` | `
` | Создать пустой репозиторий в каталоге `` |
| `git clone` | `` `` | Создать в каталоге `` копию репозитория, находящегося по адресу `` |
| `git clone` | `--recursive ` `` | Создать в каталоге `` копию репозитория, находящегося по адресу ``, с учётом подмодулей |
## Подмодули
| Команда | Ключи | Описание |
| ---- | ------ | ------------ |
| `git submodule` | `add ` | Добавить в каталог `` текущего рапозитория подмодуль, находящийся по адресу `` |
| `git submodule` | `update --recursive --remote` | Обновить подмодули |
| `git submodule` | `sync --recursive` | Заменить адреса подмодулей на указанные в файле `.gitmodules` |
Удаление подмодуля:
```sh
git submodule deinit
git rm
```
## Фиксация
| Команда | Ключи | Описание |
| ---- | ------ | ------------ |
| `git add` | `` | Подготовить файл `` к фиксации |
| `git commit` | | Зафиксировать подготовленные файлы |
| `git commit` | `-a` | Зафиксировать все отслеживаемые файлы, которые были изменены |
| `git rm` | `` | Remove files from the working tree and from the index |
| `git rm` | `-f ` | Force deletion of files from disk |
| `git rm` | `-r --cached ` | Untrack file (without deleting) |
## Информация
| Команда | Ключи | Описание |
| ---- | ---- | ------------ |
| `git status` | `-s` | Вывод информации о рабочем каталоге в краткой форме |
| `git log` | `--oneline` | Вывод журнала изменений в краткой форме |
| `git ls-files` | | Вывод списка отслеживаемых и подготовленных файлов |
## $push branches (see tags for pushing tags)
| Команда | Ключи | Описание |
| ---- | ------ | ------------ |
| `git push` | ` ` | Push branch to remote |
| `git push` | ` --all` | Push all branches to remote |
| `git push` | `--d ` | `--delete` remote branch |
## $remote
- Remote connections are like bookmarks named after remote repos
- `git clone` automatically creates a remote connection usually called `origin`
| Команда | Ключи | Описание |
|---------|-------|----------|
| `git remote` | `-v` | List remote repository endpoints |
| `git branch` | `-r` | List remote repository branches |
| `git remote` | `add ` | Create namespaced connection to a remote repository |
| `git remote` | `rename ` | Rename connection |
| `git remote` | `rm ` | Remove connection |
| `git remote` | `add origin ` | Set remote origin |
Reference: https://git-scm.com/docs/git-remote
**Remove remote origin:**
```shell
# Remove `origin` settings from .git/config
git remote rm origin
# Remove `FETCH_HEAD` which still points to remote
git rm .git/FETCH_HEAD
```
## $fetch-pull
| Команда | Ключи | Описание |
|---------|-------|----------|
| `git fetch` | `` | Fetch all branches from remote (without merge) |
| `git fetch` | ` ` | Fetch specific branch |
| `git merge` | `/` | Merge fetched remote |
| `git pull` | `` | Fetch and merge in one command |
Reference: https://git-scm.com/docs/git-fetch, https://git-scm.com/docs/git-pull
## $branch
| Команда | Ключи | Описание |
|---------|-------|----------|
| `git branch` | | List branches |
| `git branch` | `` | Create new branch |
| `git checkout` | `` | Switch to branch, or commit |
| `git branch` | `-m ` | Rename branch |
| `git merge` | `` | Merge changes from `` to current branch |
| `git branch` | `-d ` | `--delete` branch |
Reference: https://git-scm.com/docs/git-branch
## $diff
| Команда | Ключи | Описание |
|---------|-------|----------|
| `git diff` | | Compare **`working directory`** and **`index`** |
| | `–-cached` | Compare **`index`** and **`latest commit`** |
| | `HEAD` | Compare **`latest commit`** and **`working directory`** |
| | `--stat` | Optional short format |
| | ` ` | 2 points in time to compare |
| | ` | ` | Compare whole directory or limit to file |
Reference: https://git-scm.com/docs/git-diff
**Examples:**
```shell
## compare changes made to README.md between working tree (default) and latest commit (HEAD)
$ git diff --stat HEAD ./path/README.md
## compare changes made to README.md between 2 specific points in time (e.g. 2 commits)
$ git diff --stat a649900 24bdd58 ./path/README.md
```
## $tag
| Команда | Ключи | Описание |
|---------|-------|----------|
| `git tag` | | List tags |
| `git tag` | `` | Create tag, from latest commit, lightweight |
| `git tag` | `-a -m ""` | Create tag, with `--annotate`, from latest commit |
| `git tag` | `-a -m "" ` | Create tag, with `--annotate`, from specific commit |
| `git tag` | `-d ` | `--delete` tag |
| `git show` | `` | Show tag data and message |
| `git checkout` | `` | Switch to specific point tag (not editable) |
| `git push` | ` ` | Push specific tag to `` (recommended) |
| `git push` | ` --tags` | Push all tags to `` (only if necessary) |
Инициализация репозитория в каталоге `dir`:
```sh
git init dir
```
Клонирование репозитория `repo`, принадлежащего пользователю `user`,
с сервера `gitlab.2` в каталог `dir`:
```sh
git clone git@gitlab.2:user/repo.git dir
```
Просмотр состояния рабочего каталога и репозитория:
```sh
git status
```
Краткая форма вывода состояния:
```sh
git status -s
```
Добавление файла `README.md` под версионный контроль и подготовка
к фиксации:
```sh
git add README.md
```
Удаление файла `README.md` из индекса репозитория:
```sh
git rm --cached README.md
```
Зафиксировать файлы, подготовленные к фиксации:
```sh
git commit
```
Зафиксировать все отслеживаемые файлы, которые были изменены:
```sh
git commit -a
```
Отправить все ветки репозитория на сервер с меткой `origin`:
```sh
git push origin
```