--- 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 glfw ``` Инициализация сабмодулей: ```shell git submodule init ``` Обновление сабмодулей, например, если после git pull поменялся коммит, на который смотрит сабмодуль: ```shell git submodule update ``` Удаление сабмодуля производится так: - Скажите `git rm --cached имя_сабмодуля`; - Удалите соответствующие строчки из файла `.gitmodules`; - Также грохните соответствующую секцию в `.git/config`; - Сделайте коммит; - Удалите файлы сабмодуля; - Удалите каталог `.git/modules/имя_сабмодуля`;