diamond АШ Tlg

Краткая шпаргалка по командам git

Справочник для тех кто уже умеет в GIT, но подзабыл нужные команды

Содержание

Начальная настройка

git config --list Посмотреть текущие настройки
git config --global user.name "Immanuel Kant"
git config --global user.email Immanuel.Kant@kaliningrad.ru
Имя пользователя и email
git config --global core.editor nano Текстовый редактор для заполнения коммита
git config --global core.autocrlf true
git config --global core.safecrlf true
Windows: символы окончания строки, для 1С:EDT
git config --global core.autocrlf input
git config --global core.safecrlf true
Linux: символы окончания строки, для 1С:EDT
git config --global core.quotePath false Если есть русские буквы в путях, для 1С:EDT
git config --global core.longpaths true Windows: длинные имена файлов, для 1С:EDT
git config --global https.postBuffer 1048576000 При проблемах с удалённым репозиторием, рекомендуется для 1С:EDT
git config --global init.defaultBranch main Политкоректность вместо master

Инициализация репозитория с нуля

git init Cоздается репозитарий, но контроля версий ещё нет - нужен первый коммит
git add *.c
git add LICENSE
git commit -m "Первый коммит"
Добавили кое-какие файлы в индекс и сделали коммит

Клонирование из существующего репозитория

git clone https://github.com/libgit2/libgit2 [new name] Через HTTPS (github, gitlab, gitflic и т.д.)
git clone git://github.com/libgit2/libgit2 Через GIT, подобие SSH на порту 9418, без аутентификации, readonly
git clone ssh://user@server/path/to/repo.git
git clone user@server:/path/to/repo.git
Через SSH
git clone ~/git/project.git Из локальной папки
git clone file:///srv/git/project.git Из файловой шары на сервере

Посмотреть текущий статус

git status Подробный статус
git status -s Сокращенный статус

Добавить файлы в отслеживаемые

git add new_file Добавить 1 файл
git add * Добавить все файлы, кроме игнорируемых

Игнорировать файлы

Создать файл .gitignore

*.[oa]          # игнорить все файлы с расширением .o и .a
!*.a            # отслеживать даже если попал в список выше
*.zip           # игнорить все .zip
/TODO           # игнорить только в корневой папке, но не вложенных
build/          # игнорить все файлы в каталоге build
doc/**/*.txt    # игнорить все файлы txt в каталоге doc

Просмотр изменений

git diff Посмотреть все
git diff --staged Посмотреть индексированные

Коммит

git commit Во внешнем текстовом редакторе, для ввода многострочных комментариев
git commit -m 'task #12345' С однострочным комментарием
git commit -a Заодно делает и add

Удалить файл из отслеживаемых

git rm test.cpp До staging
git rm -f test.cpp После staging (индексирования)

Переименовать файл

git mv old_name new_name Эквивалент mv old_name new_name, git rm old_name, git add new_name

Просмотр коммитов

git log В обратной хронологии подробно
git log --pretty-oneline В одну строку
git log --since=2.weeks За последние 2 недели

Откатить коммит

git commit --amend "Забыть" последний коммит и заменить его новым

Отмена индексации файла

git status
git reset HEAD test.cpp
Сначала посмотреть cтатус - там подсказка
git restore --staged test.cpp То же самое по-новому

Откат изменений файла до последнего коммита

git status
git checkout -- test.cpp
Сначала посмотреть cтатус - там подсказка
git restore test.cpp То же самое по-новому

Работа с удаленными репозиториями

git remote -v Просмотр удаленых репозитариев
git remote add origin https://github.com/test/test.git Добавить удаленный репозитарий origin
git fetch origin Получение изменений из репы. Ветка master теперь у нас виден как origin/master
git pull Получили изменений, при этом сразу делается попытка слияния (!). То же самое что git fetch, git merge. Настройка: git config --global pull.rebase "true"
git push origin master Отправка ветки master в репу origin
git remote show origin Расскажет подробно какие ветки там живут и какие ветку и куда будут посланы при git push и git pull
git remote rename old_repo new_repo Переименование удаленной репы. old_repo/master станет new_repo/master
git remote remove my_repo Удаление репы

Работа с тегами

git tag Посмотреть список тегов
git tag -a v1.4 -m "Версия 1.4" Создать тег v1.4
git tag v1.4 То же самое, создать тег v1.4 но без описания
git tag -d v1.4 Удалить тег
git push origin v1.4 Отправить тег v1.4 в удалённую репу (он не передается сам)
git push origin --tags Отправить все теги в удалёную репу
git push origin --delete v1.4 Удалили тег из удалённой репы
git checkout -b version1.3 v1.2 Загрузить с тэга v1.2 и создать + переключиться в ветку version1.3

Список веток разработки

git branch * - покажет HEAD
git branch --all включая на сервере в репах
git branch -v с инфой о последних коммитах
git branch --merged только слитые с текущей
git branch --no-merged неслитые с текущей

Новая ветка, переключение на ветку

git branch test2 создали новую ветку test2, HEAD указывает на текущий коммит (например master)
git log --oneline --decorate посмотрели куда указыает HEAD
git checkout test2 переключились на ветку test2, HEAD теперь указывает на test2
git switch test2 новый синтаксис вместо checkout
git switch -c test2 Создать ветку test2 и переключится на неё
git checkout -b test2 Создать ветку test2 и переключится на неё (старый синтаксис)

Переименование ветки

git branch --move old-name new-name Перерименовали локально
git push --set-upstream origin new-name Отправили новое имя на сервер
git push origin --delete old-name Удалили старое имя с сервера
git branch -move master main Переименование главной ветки. ВНИМАНИЕ: скорее всего сломает настроенный CI/CD на сервере, не надо так делать

Статус отслеживания веток

git branch -vv Список локальных отслеживаемых веток и инфа о состоянии

Удаление ветки на сервере

git push origin --delete fix19803 Удалили на сервере ветку fix19803

Слияние веток (merge)

git checkout master Сначала перешли на ветку master, куда и будем сливать
git merge hotfix fast-forward: master и hotfix указывают на один коммит, без нового коммита слияния. Если с коммитом слияния и возник конфликт, то выдаст ошибку и пометит в исходниках где и что отличается
git merge @{u} Слить c апстримом (аналог, например вместо git merge origin/master)
git branch -d hotfix Теперь можно удалить ветку hotfix т.к. она больше не нужна
git mergetool Для разрешения конфликтов слияния

Перебазирование (rebase)

Команда rebase вместо слияния последовательно применяет коммиты из текущей ветки разработки к другой ветке. Смысл в том, чтобы видеть линейную историю разработки и все коммиты без ветвлений.

НЕ ДЕЛАТЬ ПЕРЕМЕЩЕНИЯ КОММИТОВ, УЖЕ ОТПРАВЛЕНЫХ НА СЕРВЕР В РЕПУ!!! ИНАЧЕ ДРУГИМ РАЗРАБОТЧИКАМ ПРИДЕТСЯ ЗАНОВО СЛИВАТЬ СВОИ РАЗРАБОТКИ И ДЕЛАТЬ git pull --rebase

Пример последовательности действий:

git checkout fix19803 Переключились на ветку fix19803
git rebase develop добавили коммиты из ветки fix19803 в хвост к develop
git checkout develop Переключились на ветку develop
git merge fix19803 Передвинули develop на fix19803

Каскадное перебазирование из дерева веток:

git rebase --onto develop branch1 branch2 Переключить на branch2, найти изменения относительно branch1 и прицепить их на develop, но при этом коммиты из branch1 не добавляется к develop
git checkout develop Переключились на ветку develop
git merge branch2 Передвинули develop на branch2
git rebase develop branch1 Cделали перемещение без переключения на branch1
git branch -d branch2
git branch -d branch1
Удаляем за ненадобностью