Команды GIT

git init . - инициализировать гит в текущей директории, создастся папка .git с структурой git
git add file - пометить файл к сохранению в репозиторий (коммита), если не указывать файл, пометит всю директорию
git rm - удалить из гита и рабочей директории файл
git restore - восстановить удаленный файл из рабочей директории (он сохранен в гите)
git ls-files --stage - просмотр индекс файла, хеш совпадает с именем папки+файла в /objects
git cat-file -p <хеш> - узнать тип файла
git cat-file blob/commit <хеш> - отобразить содержимое файла из (лежит в objects)
git status - отобразить все 3 набора файлов, коммиты, добавленные к коммиту файлы и недобавленные
git commit -m "Коммент" - сохранить отмеченные файлы в репозиторий, создастся файл коммита и файл tree с снимком индекса на момент коммита
git log - история коммитов ветки текущей ветки в виде графа
git log --graph - история коммитов текущей ветки в виде графа
git log --all --graph --oneline - история коммитов всех веток в виде компактного графа
git blame file1 - история изменений файла с хешем коммита, датой и автором изменений
git branch - отобразить список всех веток
git checkout <хеш коммита> - переключиться на указанную ветку/коммит, файлы в директории с его версией и если создать коммит, он не будет привязан ни к чему/доступен по идентификатору
git switch - - вернуться к основной ветке
git switch -c - создать ветку
git checkout -b "branch1" - создать ветку branch1
git clone https://github.com/lepkov/devops-school-git - клонировать удаленный репозиторий к себе в текущую директорию
git reflog - история переключения всех указателей
git tag sometext - для создания указателя (который не двигается как ветка) на текущий коммит
git show-ref - перечень хранимых указателей
git reset --hard - перемещает HEAD на указанный коммит и возвращает состояние директории на тот момент, откат изменений залогирован, это нужно например, когда хотим откатить слияние веток, коммит останется, но из истории будет удален
git checkout - переставляет указатель HEAD
git remote -v - список удаленных репозиториев
git fetch --all - подтянуть все изменения в локальном репозитории из удаленного, --all подтянет все изменения из всех веток, не будет ошибки, что нет какого-то коммита
git pull = git fetch + git merge
git push - отправка изменений загруженной ветки
git push --set-upstream origin master-patched - залить в репозиторий origin, создавая ветку master-patched, когда например пуш в основную запрещен
git am --show-current-patch - просмотр и применение патчей

Типовой сценарий

Добавляем все изменения к отправке, смотрим, что к отправке только то, что нужно, комитим с комментарием, без каких-либо проверок/хуков, пушим свой коммит в удаленный репозиторий

git add .
git status
git commit -m "BugFix" --no-verify
git push

Откатиться на 1 коммит назад

Если коммит не удался, а вы уже запушили его в удаленный репозиторий - не беда, делаем 2 простых команды и его как не бывало

git reset --hard HEAD~1
git push --force

Важно в конце файлов делать переход на новую строку, это не вызовет проблем в дальнейшем с построчной обработкой файлов.

Merge vs Rebase

git merge bugfix_branch - слияние в рамках линейной истории, новые объекты не создаются (режим fast forward), переключается указатель на текущую ветку (master) или слияние в рамках нелинейной истории, создаётся новый коммит, который объединяет обе ветки, будет 2 родителя
git chekout new_feature > git rebase master > git merge - слияние нелинейной истории, коммит будет перенесен как патч в конец ветки master, родитель будет один


Ручной черипик (вам это не нужно, это я для себя)

Нужно для переноса определенного коммита в ветку, в моём случае release
Хеш коммита, скажем = 123456

git branch feature-branch/1 origin/release
git checkout feature-branch/1
git pull
git fetch --all
git cherry-pick -m1 123456
git push -f https://github.com/repo-name.git feature-branch/1:feature-branch/1

Ссылки

.gitignore для разных проектов Нужно, чтобы случайно не выложить данные с sensitive data так сказать, пароли, логины и т.д.
Скрипт для запуска GitHub Action вручную Нужно для дебага/тестирования экшенов, внес измненеия > запустил экшен скриптом > посмотрел, что получилось

Поделиться