--- 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 ``` Подробнее: https://help.github.com/articles/set-up-git/ ## Термины | Термин | Определение | |--------------------|-------------| | Рабочий каталог | Набор файлов в текущем каталоге | | Индекс | Область с файлами, подготовленными для фиксации | | SHA-1 | Уникальный идентификатор, отражающий информацию об истории | | Ветка | Именованная последовательность в истории изменений | | Коммит \| Фиксация | Набор файлов, записанных в историю одновременно | | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке | | Метка | Именованная ссылка на некоторую фиксацию в истории | ## Состояния Файлы в рабочем каталоге могут отслеживаться системой контроля версий (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 ``` ## $getting-started | Command | Options | Description | |------------|--------------|---------------------------------------------------------| | `git config` | `--global user.name "Cooper Black"` | Set global user name | | `git config` | `--global user.email "cooper@black.com"` | Set global user email | | `git config` | `--list` | Display configuration | | `git config` | `--global --list` | Display global configuration | | `git init` | | Make current directory a git repository | | `git remote` | `add origin `| Set remote origin | | `git ls-tree` | `-r --name-only` | List files being tracked | Reference: https://git-scm.com/docs/git-config ## $clone | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git clone` | `` | Clone remote repository into current directory | | `git clone` | `--recursive ` | Clone remote repository with submodules | Reference: https://git-scm.com/docs/git-clone ## $submodule | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git clone` | `--recursive ` | Clone remote repository with submodules | | `git submodule` | `add ` | Add submodule | | `git submodule` | `update --remote` | Update submodules | | `git submodule` | `status --recursive` | List submodules | **Remove submodule:** ```shell $ git submodule deinit $ git rm ``` Reference: https://git-scm.com/docs/git-submodule ## $commit | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git add` | `` | Add files to staging area | | `git commit` | `-m "" -m "<body>"` | Commit with message (includes "added" files only) | | `git rm` | `<filenama>` | Remove files from the working tree and from the index | | | `-f` | Force deletion of files from disk | | `git rm` | `-r --cached <filename>` | Untrack file (without deleting) | Reference: https://git-scm.com/docs/git-commit **Untrack hidden files, or update list of tracked files, after adding `.gitignore`:** ```shell # remove all $ git rm -r --cached . # add all again, now gitignore will take effect (try to add .gitignore from the start next time) $ git add . ``` ## $push branches (see tags for pushing tags) | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git push` | `<remotename> <branchname>` | Push branch to remote | | `git push` | `<remotename> --all` | Push all branches to remote | | `git push` | `--d <remotename> <branchname>` | `--delete` remote branch | Reference: https://git-scm.com/docs/git-push ## $remote - Remote connections are like bookmarks named after remote repos - `git clone` automatically creates a remote connection usually called `origin` | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git remote` | `-v` | List remote repository endpoints | | `git branch` | `-r` | List remote repository branches | | `git remote` | `add <name> <url>` | Create namespaced connection to a remote repository | | `git remote` | `rename <oldname> <newname>` | Rename connection | | `git remote` | `rm <name>` | Remove connection | 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 | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git fetch` | `<remote>` | Fetch all branches from remote (without merge) | | `git fetch` | `<remote> <branch>` | Fetch specific branch | | `git merge` | `<remote>/<branch>` | Merge fetched remote | | `git pull` | `<remote>` | Fetch and merge in one command | Reference: https://git-scm.com/docs/git-fetch, https://git-scm.com/docs/git-pull ## $branch | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git branch` | | List branches | | `git branch` | `<branchname>` | Create new branch | | `git checkout` | `<sha-1>` | Switch to branch, or commit | | `git branch` | `-m <branchname> <newname>` | Rename branch | | `git merge` | `<branchname>` | Merge changes from `<branchname>` to current branch | | `git branch` | `-d <branchname>` | `--delete` branch | Reference: https://git-scm.com/docs/git-branch ## $status | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git status` | `-s` | Show the working tree status, with `--short` format | | `git log` | `--oneline` | Show commit logs, with `--oneline` format | | `git ls-files`| | Show information about files in the index and the working tree | Reference: https://git-scm.com/docs/git-status ## $diff | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git diff` | | Compare **`working directory`** and **`index`** | | | `–-cached` | Compare **`index`** and **`latest commit`** | | | `HEAD` | Compare **`latest commit`** and **`working directory`** | | | `--stat` | Optional short format | | | `<sha-1> <sha-1>` | 2 points in time to compare | | | `<dir> | <file>` | 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 | Command | Options | Description | |-------------|-------------|---------------------------------------------------------| | `git tag` | | List tags | | `git tag` | `<v1.0.0>` | Create tag, from latest commit, lightweight | | `git tag` | `-a <v1.0.0> -m "<msg>"` | Create tag, with `--annotate`, from latest commit | | `git tag` | `-a <v1.0.0> -m "<msg>" <SHA-1>` | Create tag, with `--annotate`, from specific commit | | `git tag` | `-d <v1.1.0>` | `--delete` tag | | `git show` | `<v1.0.0>` | Show tag data and message | | `git checkout` | `<v1.0.0>` | Switch to specific point tag (not editable) | | `git push` | `<remote> <tag>` | Push specific tag to `<remote>` (recommended) | | `git push` | `<remote> --tags` | Push all tags to `<remote>` (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 ```