🐙 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