tech-tips/Программное обеспечение/Версионирование кода/git/Шпаргалка по командам.md

329 lines
8.2 KiB
Markdown
Raw Normal View History

---
source: https://eax.me/git-commands/
tags: ["git", "git-config", "git-submodule"]
---
## Основные команды
Создать новый репозиторий:
```shell
git init project-name
```
Если вы планируете клонировать его по ssh с удаленной машины, также скажите:
```shell
git config --bool core.bare true
```
…иначе при `git push` вы будете получать странные ошибки вроде:
```
Refusing to update checked out branch: refs/heads/master
By default, updating the current branch in a non-bare repository
is denied, because it will make the index and work tree inconsistent
with what you pushed, and will require 'git reset --hard' to match
the work tree to HEAD.
```
Клонировать репозиторий с удаленной машины:
```shell
git clone git@bitbucket.org:afiskon/hs-textgen.git
```
Если хотим пушить один код в несколько репозиториев:
```shell
git remote add remotename git@gitlab.example.ru:repo.git
```
Добавить файл в репозиторий:
```shell
git add text.txt
```
Удалить файл:
```shell
git rm text.txt
```
Текущее состояние репозитория (изменения, неразрешенные конфликты и тп):
```shell
git status
```
Сделать коммит:
```shell
git commit -a -m "Commit description"
```
Сделать коммит, введя его описание с помощью $EDITOR:
```shell
git commit -a
```
Замержить все ветки локального репозитория на удаленный репозиторий (аналогично вместо origin можно указать и remotename, см выше):
```shell
git push origin
```
Аналогично предыдущему, но делается пуш только ветки master:
```shell
git push origin master
```
Запушить текущую ветку, не вводя целиком ее название:
```shell
git push origin HEAD
```
Замержить все ветки с удаленного репозитория:
```shell
git pull origin
```
Аналогично предыдущему, но накатывается только ветка master:
```shell
git pull origin master
```
Накатить текущую ветку, не вводя ее длинное имя:
```shell
git pull origin HEAD
```
Скачать все ветки с origin, но не мержить их в локальный репозиторий:
```shell
git fetch origin
```
Аналогично предыдущему, но только для одной заданной ветки:
```shell
git fetch origin master
```
Начать работать с веткой some_branch (уже существующей):
```shell
git checkout -b some_branch origin/some_branch
```
Создать новый бранч (ответвится от текущего):
```shell
git branch some_branch
git checkout -b some_branch # сразу переключиться на неё
```
Переключиться на другую ветку (из тех, с которыми уже работаем):
```shell
git checkout some_branch
```
Получаем список веток, с которыми работаем:
```shell
git branch # звездочкой отмечена текущая ветвь
```
Просмотреть все существующие ветви:
```shell
git branch -a # | grep something
```
Замержить some_branch в текущую ветку:
```shell
git merge some_branch
```
Удалить бранч (после мержа):
```shell
git branch -d some_branch
```
Просто удалить бранч (тупиковая ветвь):
```shell
git branch -D some_branch
```
История изменений:
```shell
git log
```
История изменений в обратном порядке:
```shell
git log --reverse
```
История конкретного файла:
```shell
git log file.txt
```
Аналогично предыдущему, но с просмотром сделанных изменений:
```shell
git log -p file.txt
```
История с именами файлов и псевдографическим изображением бранчей:
```shell
git log --stat --graph
```
Изменения, сделанные в заданном коммите:
```shell
git show d8578edf84
```
Посмотреть, кем в последний раз правилась каждая строка файла:
```shell
git blame file.txt
```
Удалить бранч из репозитория на сервере:
```shell
git push origin :branch-name
```
Откатиться к конкретному коммиту (хэш смотрим в «git log»):
```shell
git reset --hard d8578edf8
```
Аналогично предыдущему, но файлы на диске остаются без изменений:
```shell
git reset --soft d8578
```
Попытаться обратить заданный commit:
```shell
git revert d8578ed
```
Просмотр изменений (суммарных, а не всех по очереди, как в «git log»):
```shell
git diff # подробности см в "git diff --help"
```
Используем vimdiff в качестве программы для разрешения конфликтов (mergetool) по умолчанию:
```shell
git config --global merge.tool vimdiff
```
Отключаем диалог «какой mergetool вы хотели бы использовать»:
```shell
git config --global mergetool.prompt false
```
Отображаем табы как 4 пробела, например, в «git diff»:
```shell
git config --global core.pager 'less -x4'
```
Создание глобального файла .gitignore:
```shell
git config --global core.excludesfile ~/.gitignore_global
```
Разрешение конфликтов (когда оные возникают в результате мержа):
```shell
git mergetool
```
Создание тэга:
```shell
git tag some_tag # за тэгом можно указать хэш коммита
```
Удаление untracked files:
```shell
git clean -f
```
«Упаковка» репозитория для увеличения скорости работы с ним:
```shell
git gc
```
Иногда требуется создать копию репозитория или перенести его с одной машины на другую. Это делается примерно так:
```shell
mkdir -p /tmp/git-copy
cd /tmp/git-copy
git clone --bare git@example.com:afiskon/cpp-opengl-tutorial1.git
cd cpp-opengl-tutorial1.git
git push --mirror git@example.com:afiskon/cpp-opengl-tutorial2.git
```
Дополнение: Также в 6-м пункте [Мини-заметок номер 9](https://eax.me/mini-notes-issue-9/) приводится пример объединения коммитов с помощью `git rebase`, а в 10-м пункте [Мини-заметок номер 11](https://eax.me/mini-notes-issue-11/) вы найдете пример объединения двух репозиториев в один без потери истории.
## Работа с сабмодулями
Добавить сабмодуль:
```shell
git submodule add <https://github.com/glfw/glfw> glfw
```
Инициализация сабмодулей:
```shell
git submodule init
```
Обновление сабмодулей, например, если после git pull поменялся коммит, на который смотрит сабмодуль:
```shell
git submodule update
```
Удаление сабмодуля производится так:
- Скажите `git rm --cached имя_сабмодуля`;
- Удалите соответствующие строчки из файла `.gitmodules`;
- Также грохните соответствующую секцию в `.git/config`;
- Сделайте коммит;
- Удалите файлы сабмодуля;
- Удалите каталог `.git/modules/имя_сабмодуля`;