🐙 Git та GitHub CLI
Базові й розширені команди Git для керування версіями, гілками, віддаленими репозиторіями, stash, тегами та GitHub CLI.
🔹 Базові команди
| Команда | Приклад | Опис | 
|---|---|---|
| git add | Додати файл до індексу (staging area) | |
| git add file.txt | Підготувати конкретний файл до наступного коміту | |
| git add . | Підготувати всі зміни у поточній директорії та нижче | |
| git add -p | Інтерактивно вибрати, які частини файлів додати (корисно для часткових комітів) | |
| git clone | Клонувати репозиторій у нову директорію | |
| git clone -b branch_name URL | Клонувати лише вказану гілку (замість стандартної) | |
| git clone --depth 1 URL | Клонувати лише останній коміт, створивши неглибоку копію для економії часу й місця | |
| git commit | Зафіксувати зміни у репозиторії | |
| git commit -m "Initial commit" | Створити коміт із повідомленням без відкриття редактора | |
| git commit -a -m "Fix bugs" | Підготувати й закомітити всі відслідковувані змінені файли з повідомленням | |
| git commit --amend | Оновити останній коміт (змінити повідомлення або додати зміни) | |
| git commit --fixup abc1234 | Створити fixup-коміт для автоматичного squash під час інтерактивного rebase | |
| git config | Отримати або налаштувати параметри репозиторію чи глобальні параметри | |
| git config --global user.name "Name" | Встановити глобальне ім’я користувача Git | |
| git config --global user.email "email@example.com" | Встановити глобальний email у Git | |
| git config --list | Вивести всі налаштування Git (ім’я, email, редактор тощо) | |
| git diff | Показати різницю між комітами, комітом і робочою директорією тощо | |
| git diff HEAD | Показати зміни з останнього коміту (непідготовлені) | |
| git diff --staged | Показати зміни, які увійдуть у наступний коміт | |
| git diff --word-diff HEAD~1 | Показати відмінності на рівні слів | |
| git grep | Шукати всередині файлів репозиторію | |
| git grep "functionName" | Знайти всі згадки  | |
| git grep -n "TODO" | Знайти рядки з  | |
| git grep -i "login" | Шукати слово  | |
| git init | Створити новий порожній Git-репозиторій або реініціалізувати існуючий | |
| git init my-project | Ініціалізувати новий репозиторій у директорії my-project | |
| git init --bare | Ініціалізувати bare-репозиторій | |
| git log | Показати журнал комітів | |
| git log --oneline | Показати історію комітів у компактному однорядковому форматі | |
| git log --graph --all | Показати всі гілки у вигляді графа комітів | |
| git log -p --stat | Показати патч і статистику змін файлів у комітах | |
| git reset | Зняти файли з індексу, зберігши зміни у робочій директорії | |
| git reset HEAD file.txt | Прибрати файл з індексу (зміни залишаться) | |
| git reset --hard HEAD~1 | Повернутися на один коміт назад і видалити всі зміни (необоротно!) | |
| git reset --soft HEAD~1 | Скасувати останній коміт, але залишити зміни для повторного коміту | |
| git reset --mixed HEAD~1 | Скасувати коміт, залишивши зміни неіндексованими у робочій директорії | |
| git show | Показати різні типи об’єктів | |
| git show <commit_hash> | Показати зміни й повідомлення конкретного коміту | |
| git show HEAD~1 | Показати попередній коміт перед поточним | |
| git show --stat | Показати підсумок змін файлів у останньому коміті | |
| git status | Показати статус робочої директорії | |
| git status -s | Показати статус у скороченому форматі | |
| git status -b | Показати поточну гілку та стан файлів | 
🌿 Гілки та злиття
| Команда | Приклад | Опис | 
|---|---|---|
| git branch | Створювати, перелічувати або видаляти гілки | |
| git branch new-feature | Створити нову гілку  | |
| git branch -d old-feature | Видалити локальну гілку  | |
| git checkout | Перемикати гілки або відновлювати файли з іншого коміту | |
| git checkout main | Перемкнутися на гілку  | |
| git checkout -b new-branch | Створити й перемкнутися на нову гілку  | |
| git switch | Перемикати гілки (спрощена альтернатива checkout) | |
| git switch main | Перемкнутися на гілку  | |
| git switch -c feature-x | Створити й перемкнутися на нову гілку  | |
| git switch new-feature | Перемкнутися на існуючу гілку  | |
| git merge | Об’єднати зміни з іншої гілки в поточну | |
| git merge new-feature | Злити гілку  | |
| git merge --no-ff new-feature | Завжди створювати merge-коміт (навіть якщо можливий fast-forward) | |
| git merge --abort | Скасувати злиття та повернути зміни, якщо виникли конфлікти | |
| git rebase | Перенести або повторно застосувати коміти на нову базу | |
| git rebase main | Перенести ваші коміти поверх гілки  | |
| git rebase -i HEAD~3 | Інтерактивно відредагувати останні 3 коміти | |
| git rebase --abort | Зупинити й скасувати rebase, що триває | |
| git rebase -i --autosquash HEAD~5 | Автоматично об’єднати коміти, позначені як fixup або squash під час інтерактивного rebase | |
| git cherry-pick | Застосувати конкретні коміти з іншої гілки | |
| git cherry-pick <hash> | Застосувати конкретний коміт (за хешем) у поточну гілку | |
| git cherry-pick --continue | Продовжити cherry-pick після розв’язання конфліктів | |
| git cherry-pick A^..B | Застосувати діапазон комітів від  | 
📡 Віддалені репозиторії
| Команда | Приклад | Опис | 
|---|---|---|
| git remote | Керувати посиланнями на віддалені репозиторії (наприклад, GitHub) | |
| git remote -v | Показати віддалені репозиторії та їх URL | |
| git remote add origin URL | Додати віддалений репозиторій з назвою  | |
| git pull | Завантажити й автоматично об’єднати зміни з віддаленої гілки | |
| git pull origin main | Отримати й злити зміни з віддаленої гілки  | |
| git pull --rebase origin main | Отримати й застосувати rebase поточної гілки поверх віддаленої замість merge | |
| git push | Відправити локальні зміни у віддалений репозиторій | |
| git push origin main | Відправити локальну гілку  | |
| git fetch | Завантажити зміни з віддаленого репозиторію без злиття | |
| git fetch origin | Отримати всі оновлення з  | |
| git fetch origin main | Отримати лише гілку  | |
| git fetch --all | Отримати оновлення з усіх віддалених | |
| git fetch --prune | Очистити видалені гілки — прибрати локальні посилання на гілки, які видалили віддалено | |
| git fetch --dry-run | Показати, що буде отримано, без фактичного завантаження | |
| git fetch origin +main | Примусово оновити локальну tracking-гілку ( | 
📦 Stash і очищення
| Команда | Приклад | Опис | 
|---|---|---|
| git stash | Тимчасово зберегти незакомічені зміни (робочий прогрес) | |
| git stash | Зберегти змінені та підготовлені файли, повернувши директорію до останнього коміту | |
| git stash apply | Застосувати останній stash (залишивши його збереженим) | |
| git stash pop | Застосувати й видалити останній stash | |
| git stash list | Показати список усіх збережених stash | |
| git stash branch feature-fix | Створити нову гілку й застосувати до неї останній stash | |
| git clean | Назавжди видалити не відслідковувані файли (поза Git) | |
| git clean -f | Видалити не відслідковувані файли у поточній директорії | |
| git clean -fd | Видалити не відслідковувані файли та папки | |
| git clean -n | Попередній перегляд того, що буде видалено (dry run) | 
🏷️ Теги
| Команда | Приклад | Опис | 
|---|---|---|
| git tag | Створювати, перелічувати або видаляти теги для позначення точок історії (наприклад, релізів) | |
| git tag -a v1.0 -m "Version 1.0" | Створити анотований тег  | |
| git tag -d v1.0 | Видалити локальний тег  | |
| git push | Відправити коміти, гілки та теги з локального у віддалений репозиторій | |
| git push origin --tags | Відправити всі локальні теги у віддалений репозиторій (корисно після створення кількох тегів) | |
| git push origin v1.0 | Відправити конкретний тег (наприклад,  | |
| git push origin :refs/tags/v1.0 | Видалити віддалений тег  | 
🛠️ Розв’язання конфліктів
| Команда | Приклад | Опис | 
|---|---|---|
| git mergetool | Відкрити візуальний інструмент для розв’язання merge-конфліктів | |
| git mergetool --tool=meld | Використати конкретний інструмент (наприклад, Meld) для виправлення конфліктів | |
| git rerere | Дозволити Git запам’ятати, як ви розв’язували конфлікти раніше | |
| git config --global rerere.enabled true | Увімкнути автоматичне повторне використання рішень для конфліктів | |
| git rerere status | Показати, для яких файлів збережені рішення конфліктів | |
| git rerere diff | Показати, які зміни Git зберіг для повторного використання | 
⚙️ Розширені команди
| Команда | Приклад | Опис | 
|---|---|---|
| git bisect | Використати бінарний пошук, щоб знайти коміт, який призвів до багу | |
| git bisect start | Почати бінарний пошук між відомим добрим і поганим комітом, щоб знайти баг | |
| git bisect bad | Позначити поточний коміт як “поганий” (містить баг) | |
| git bisect good <commit> | Позначити відомий “добрий” коміт, де бага не було | |
| git blame | Показати, хто востаннє змінив кожен рядок файлу, з ревізією й автором | |
| git blame file.txt | Показати автора й інформацію про коміт для кожного рядка у файлі | |
| git blame -L 10,20 file.txt | Показати blame-інформацію лише для рядків 10–20 | |
| git blame --show-email file.txt | Показати email-адреси авторів поряд зі змінами рядків | |
| git reflog | Перегляд і керування журналом посилань (reflog) переміщень гілок і HEAD | |
| git reflog show main@{1.week.ago} | Подивитися, куди вказувала гілка  | |
| git reflog expire --expire=30.days --dry-run | Попередньо переглянути, які записи reflog старші за 30 днів можна видалити (без змін) | |
| git reflog delete HEAD@{2} | Видалити конкретний запис reflog (обережно, може вплинути на відновлення) | |
| git submodule | Додати, ініціалізувати, оновити або переглянути підмодулі (репозиторії в репозиторії) | |
| git submodule add URL path | Додати зовнішній репозиторій як підмодуль у вказаному шляху | |
| git submodule update --init | Ініціалізувати й завантажити всі підмодулі, зазначені в репозиторії | |
| git submodule foreach git pull | Запустити  | |
| git submodule sync --recursive | Синхронізувати URL підмодулів після змін у файлі  | |
| git submodule update --remote --merge | Оновити підмодулі до останнього коміту їх віддалених гілок | |
| git archive | Створити архів (zip, tar тощо) файлів із конкретного коміту чи гілки | |
| git archive --format=zip HEAD > archive.zip | Створити ZIP-архів файлів проєкту з HEAD | |
| git archive -o release.tar.gz HEAD | Створити стиснутий  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Створити стиснутий  | |
| git gc | Очистити непотрібні файли та оптимізувати репозиторій для продуктивності | |
| git gc --aggressive | Виконати повне очищення й оптимізацію (може бути повільним, але ефективним) | |
| git gc --prune=now | Видалити всі недосяжні об’єкти негайно (небезпечна дія, якщо не впевнені) | |
| git shortlog | Короткий підсумок авторів та їх комітів | |
| git shortlog -e | Показати список авторів з email-адресами (наприклад, щоб проаналізувати внески) | |
| git shortlog -s -n | Показати кількість комітів кожного автора, відсортовану за кількістю | |
| git shortlog -sne | Те саме, але також включає імена й email — корисно для детального відстеження активності | |
| git revert | Створити новий коміт, що відміняє зміни попереднього коміту без переписування історії | |
| git revert HEAD | Відмінити останній коміт, створивши новий, що скасовує його зміни | |
| git revert <commit_hash> | Відмінити конкретний коміт за хешем, безпечно створивши новий, що його скасовує | 
🐙 GitHub CLI
ghдозволяє керувати GitHub із терміналу.
| Команда | Приклад | Опис | 
|---|---|---|
| gh auth login | Автентифікуватися на GitHub-хості, щоб команди CLI могли працювати з вашим акаунтом | |
| gh auth login --with-token < mytoken.txt | Увійти за допомогою персонального токена доступу, збереженого у файлі ( | |
| gh auth login --hostname enterprise.internal | Автентифікація на GitHub Enterprise-сервері (не github.com) | |
| gh repo clone | Клонувати репозиторій GitHub на локальну машину | |
| gh repo clone user/repo | Клонувати репозиторій  | |
| gh repo clone cli/cli -- --depth=1 | Клонувати репозиторій, завантаживши лише останній коміт (швидша й легша копія) | |
| gh repo clone cli/cli workspace/cli | Клонувати репозиторій у власну папку  | |
| gh issue list | Вивести список issues у GitHub-репозиторії з можливістю фільтрації | |
| gh issue list --assignee "@me" | Вивести список issues, призначених вам | |
| gh issue list --state all | Вивести всі issues незалежно від стану (відкриті чи закриті) | |
| gh issue list --search "error no:assignee sort:created-asc" | Вивести issues, що містять слово “error”, без виконавців, відсортовані за датою створення | |
| gh pr create | Створити pull request на GitHub через CLI | |
| gh pr create --title "..." | Створити pull request із вказаним заголовком | |
| gh pr create --project "Roadmap" | Прив’язати pull request до проєкту GitHub із назвою “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Створити PR із гілки  | |
| gh repo create | Створити новий GitHub-репозиторій із CLI | |
| gh repo create my-project | Створити новий репозиторій з назвою  | |
| gh repo create my-project --public --clone | Створити публічний репозиторій та клонувати його локально | |
| gh repo create my-project --private --source=. --remote=upstream | Створити приватний віддалений репозиторій із поточної папки та додати remote з назвою  | 
💡 Git-аліаси (зручні скорочення)
Налаштуйте зручні псевдоніми для прискорення виконання поширених команд Git:
git config --global alias.br branch                                       # скорочення для: git branch
git config --global alias.ci commit                                       # скорочення для: git commit
git config --global alias.co checkout                                     # скорочення для: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # гарний граф історії
git config --global alias.last "log -1 HEAD"                              # показати останній коміт
git config --global alias.st status                                       # скорочення для: git status🚀 Розширені Git-команди для професіоналів
| Команда | Приклад | Опис | 
|---|---|---|
| git filter-repo | Потужний та швидкий інструмент для переписування історії Git з метою видалення чи зміни файлів, авторства або шляхів; замінює git filter-branchіз кращою швидкістю та безпекою | |
| git filter-repo --path secret.txt --invert-paths | Ефективно переписати історію репозиторію, щоб видалити конфіденційні файли чи каталоги без проблем продуктивності  | |
| git filter-repo --replace-text replacements.txt | Масово замінити рядки або шаблони по всій історії (наприклад, очистити креденшіали) | |
| git filter-repo --subdirectory-filter src | Витягти історію підкаталогу в новий репозиторій зі збереженням метаданих комітів | |
| git worktree | Керування кількома робочими деревами, прив’язаними до одного репозиторію, що дозволяє паралельно працювати над різними гілками без клонування | |
| git worktree add ../feature feature-branch | Створити додаткове робоче дерево, прив’язане до того самого репозиторію, для паралельного checkout різних гілок | |
| git worktree list | Перелічити всі активні worktree, їхні шляхи та пов’язані гілки | |
| git worktree remove ../feature | Видалити прив’язане worktree, коли воно більше не потрібне, із безпечним очищенням | |
| git replace | Створити тимчасові посилання, які замінюють існуючі об’єкти, дозволяючи безпечні локальні маніпуляції з історією та тестування | |
| git replace <old_commit> <new_commit> | Тимчасово замінити один коміт іншим у локальному репозиторії для тестування чи патчингу без переписування історії | |
| git replace --list | Показати всі активні replacement-посилання | |
| git replace -d <replace_ref> | Видалити конкретне replacement-посилання для повернення до попередньої поведінки | |
| git stash | Тимчасово зберегти незакомічені зміни у стек, щоб перемикати контекст без створення незавершених комітів | |
| git stash push -p | Інтерактивно вибрати частини змін для збереження у stash із точним контролем | |
| git stash push -m "WIP selective stash" | Створити stash із власним повідомленням для зручної ідентифікації | |
| git stash apply stash@{2} | Застосувати конкретний stash зі списку, не видаляючи його | |
| git rebase | Повторно застосувати коміти поверх іншої бази, забезпечуючи чистішу, лінійну історію проєкту та інтерактивне редагування історії | |
| git rebase --interactive --autosquash | Запустити інтерактивний rebase із автоматичним reorder і squash комітів, позначених як fixup чи squash | |
| git rebase -i --autosquash HEAD~10 | Автоматично впорядкувати й об’єднати fixup/squash-коміти для очищення історії перед push | |
| git commit --fixup <commit> | Створити fixup-коміт, який буде автоматично об’єднано під час інтерактивного rebase | |
| git commit --squash <commit> | Створити squash-коміт для об’єднання з вказаним комітом під час rebase | |
| git bisect | Інструмент бінарного пошуку для ефективного виявлення коміту, який запровадив баг, шляхом тестування комітів і поступового звуження діапазону | |
| git bisect run | Автоматизувати процес bisect, запустивши тестовий скрипт на кожному коміті, щоб швидко знайти проблемний коміт | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Автоматично виконувати bisect за допомогою тест-скрипта, значно прискорюючи пошук багів | |
| git bisect visualize | Відкрити графічний інструмент для візуалізації процесу bisection | |
| git bisect reset | Вийти з режиму bisect і повернутися до оригінального HEAD | |
| git commit | Фіксувати зміни у репозиторії з розширеними опціями amend, sign, fixup і кастомізації повідомлень для підтримки якісної історії проєкту | |
| git commit --gpg-sign | Створити коміт, підписаний вашим GPG-ключем, для криптографічної перевірки автентичності | |
| git commit -S -m "Signed commit" | Підписати коміти GPG-ключем для перевірки цілісності та авторства | |
| git config --global user.signingkey <key_id> | Налаштувати GPG-ключ для підпису комітів глобально | |
| git log --show-signature | Перевірити й показати інформацію про GPG-підпис комітів | |
| git reflog | Зберігати журнал оновлень HEAD і гілок, важливий для відновлення втрачених комітів і розуміння локальної історії | |
| git reset --hard HEAD@{3} | Скинути поточну гілку до попереднього стану з reflog, щоб відновити або скасувати зміни | |
| git reflog expire --expire=now --all | Негайно очистити всі записи reflog (обережно!) | 
🧰 Поради та автоматизація професійних робочих процесів
| Тема | Команди / Приклад | Пояснення та поради | 
|---|---|---|
| Агресивне очищення репозиторію | git gc --aggressive --prune=now | Виконує глибоке збирання сміття та обрізає недосяжні об’єкти негайно. Використовується під час техобслуговування | 
| Паралельні робочі дерева гілок | git worktree add ../feature-branch feature | Мати кілька робочих дерев для одночасної розробки функцій без накладних витрат на клонування | 
| Чиста, лінійна історія | git rebase -i --autosquash | Перед push виконайте інтерактивний rebase з autosquash, щоб зберігати історію чистою та читабельною | 
| Безпечні коміти | git commit -S | Підписуйте коміти GPG-ключем для підвищення довіри у спільних репозиторіях (часто обов’язково в корпоративному середовищі) | 
| Автоматизований bisect | git bisect run ./test-script.sh | Автоматизуйте пошук багів, запускаючи тест-скрипт на кожному коміті під час bisect | 
| Кеш розв’язання конфліктів | git config --global rerere.enabled true | Увімкніть повторне використання рішень конфліктів, щоб прискорити повторне злиття чи rebase | 
| Спільні псевдоніми та хуки | Зберігайте загальні Git-аліаси та хуки комітів у спільному репозиторії чи CI-пайплайні для підтримки стандартів команди | 
Додаткові ресурси
🧠 Порада
Не намагайтеся запам’ятати все. Використовуйте --help, досліджуйте й регулярно практикуйтеся:
git help <command>
git status🌐 Корисні посилання
📘 Офіційна документація Git — докладний посібник для всіх команд Git:
https://git-scm.com/docs
📙 Learn Git Branching — інтерактивний візуальний курс для оволодіння концепціями гілок:
https://learngitbranching.js.org
📕 Книга Pro Git (безкоштовна, автори: Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (офіційна компактна шпаргалка):
https://education.github.com/git-cheat-sheet-education.pdf