329 lines
8.2 KiB
Markdown
329 lines
8.2 KiB
Markdown
|
---
|
|||
|
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/имя_сабмодуля`;
|