Git и GitHub команди: Пълно практическо ръководство за ежедневието
Научете основните и по-редките команди в Git и GitHub, подредени от практическа гледна точка за всеки програмист и DevOps инженер.
Предварителни изисквания
- Основна грамотност с команден ред / терминал
Когато става въпрос за работа с код, всеки програмист рано или късно се сблъсква с момента, в който трябва да синхронизира промените си, да оправи някой заплетан клон или просто да върне изгубена работа. Вместо да губим време в търсене из нета на точния синтаксис, нека съберем на едно място най-важните Git и GitHub команди – подредени логично от всекидневните задачи до по-специфичните ситуации.
В това ръководство ще разгледаме всичко, което ви трябва, за да работите уверено през терминала.
1. Всекидневни команди
Това е вашият основен работен цикъл: провери какво е сменено, подготви промените, запиши ги (commit) и ги изпрати към отдалеченото репо.
-
Състояние на репото
Описание: Кои файлове са променени, кои са подготвени за запис.git status -
Подготви всички промени
Описание: Добавя всички нови и променени файлове в следващия запис.git add . -
Запиши (commit)
Описание: Създава запис с кратко описание на промяната.git commit -m "<описание на промяната>" -
Подготви и запиши в една стъпка
Описание: Работи само за вече следени файлове. Нови файлове не влизат.git commit -am "<описание>" -
Изпрати към GitHub
Описание: Качва локалните записи в отдалеченото репо.git push -
Изтегли и слей промените
Описание: Взима новото от GitHub и го слива в текущия клон.git pull -
Изтегли с пренареждане
Описание: Подрежда твоите записи върху чуждите вместо merge запис. Дава по-чиста история.git pull --rebase -
Какво съм променил
Описание: Показва промените, които още не са подготвени.git diff -
Какво ще бъде записано
Описание: Показва само подготвените промени.git diff --staged -
История на записите
Описание: Компактен списък с един ред на запис.git log --oneline
2. Нов проект към GitHub
Ако имате локална папка, която все още не е Git репо, първо създайте празно репо в GitHub (без README), след което изпълнете тази последователност.
-
Пълна последователност
Описание: Замени адреса със своя от зеления бутон Code в GitHub. Може и SSH адрес:git@github.com:<потребител>/<репо>.git.# влез в папката на проекта cd <път/до/проекта> git init -b main git add . git commit -m "Първоначален запис" git remote add origin https://github.com/<потребител>/<репо>.git git push -u origin main -
Същото с GitHub CLI в една команда
Описание: Създава репото в GitHub, връзва го като origin и качва. Изисква предварителноgh auth login. Смени--privateс--publicза публично репо.# след git init и първия commit gh repo create <име-на-репо> --private --source=. --remote=origin --push -
Преди първия commit: добави .gitignore
Описание: Така паролите, node_modules и временните файлове не влизат в репото. Файлът се пише ръчно, а това е пример за съдържание.printf "node_modules/\n.env\n*.log\n.DS_Store\n" > .gitignore
3. Съществуващ проект към GitHub
Ако папката вече е Git репо с история, а в GitHub е създадено празно репо, време е да ги свържете.
-
Свържи с GitHub и качи
Описание: Преименува текущия клон на main и го качва заедно с цялата история.git remote add origin https://github.com/<потребител>/<репо>.git git branch -M main git push -u origin main -
Вече има зададен remote с грешен адрес
Описание: Ако git remote add върне грешка, че origin съществува, смени адреса му.git remote set-url origin https://github.com/<потребител>/<репо>.git -
Провери към какво е свързано репото
Описание: Показва адресите за теглене и изпращане.git remote -v -
Качи и всички останали клонове
Описание: Изпраща всички локални клонове наведнъж.git push -u origin --all -
Качи и таговете
Описание: Таговете не се качват с обикновения push.git push origin --tags -
Изтегли чуждо репо
Описание: Създава папка с цялото репо и история.git clone https://github.com/<потребител>/<репо>.git -
Изтегли в папка с друго име
Описание: Последният аргумент е името на локалната папка.git clone https://github.com/<потребител>/<репо>.git <име-на-папка>
4. Добавяне на документ или файл по-късно
Поставяте файл в папката на проекта и искате да го пратите към GitHub.
-
Един конкретен файл
Описание: Подготвя, записва и качва само посочения файл.git add <файл.pdf> git commit -m "Добавен <файл.pdf>" git push -
Цяла папка
Описание: Включва всичко в папката, включително подпапките.git add <папка>/ git commit -m "Добавена папка <папка>" git push -
Няколко файла по шаблон
Описание: Шаблонът е в кавички, за да го разчете Git, а не обвивката.git add "*.md" git commit -m "Добавени документи" git push -
Подготви част от файла
Описание: Показва промените на парчета и пита кои да влязат в записа.git add -p <файл> -
Спри да следиш файл, но го остави на диска
Описание: Полезно, когато файл е качен по грешка и трябва да влезе в .gitignore.git rm --cached <файл> git commit -m "Спрян за следене: <файл>" git push -
Изтрий файл от репото и от диска
Описание: Изтриването също трябва да се запише и качи.git rm <файл> git commit -m "Изтрит <файл>" git push -
Преименувай или премести файл
Описание: Git запазва историята на файла при преместване.git mv <старо-име> <ново-име> git commit -m "Преименуван файл" git push -
Файл над 100 MB
Описание: GitHub отказва единични файлове над 100 MB. Използвай Git LFS за големи файлове.git lfs install git lfs track "*.zip" git add .gitattributes git add <голям-файл.zip> git commit -m "Добавен голям файл през LFS" git push
5. Клонове
Работете в отделен клон и го сливайте едва когато всичко е тествано и готово.
-
Списък с клоновете
Описание: Звездичка маркира текущия клон. С-vvсе виждат и отдалечените връзки.git branch git branch -vv -
Създай нов клон и премини в него
git switch -c <име-на-клон> -
Премини в съществуващ клон
git switch <име-на-клон> -
Слей клон в текущия
Описание: Първо премини в клона, който приема промените, обикновеноmain.git switch main git merge <име-на-клон> -
Качи нов клон към GitHub
Описание: Първото качване връзва локалния клон с отдалечения.git push -u origin <име-на-клон> -
Изтрий клон
Описание: Малкото-dотказва, ако клонът не е слят. Първият ред е за локалния, вторият за GitHub.git branch -d <име-на-клон> git push origin --delete <име-на-клон> -
Пренареди клона върху main
Описание: Пренаписва записите на клона. Не го прави върху клон, който други вече са теглили.git switch <име-на-клон> git rebase main -
Вземи един запис от друг клон
Описание: Прилага само избрания запис в текущия клон.git cherry-pick <хеш-на-запис> -
Преименувай текущия клон
git branch -M <ново-име>
Може да ви е интересно още: Инсталиране на Opengist на bg с Docker и Docker Compose.
6. Отмяна и поправки
⚠️ Внимание: Някои от тези команди могат да изтрият работа без връзка назад. Винаги проверявайте състоянието с
git status.
-
Махни файл от подготвените
Описание: Файлът остава променен на диска, просто не влиза в записа.git restore --staged <файл> -
Върни файл към последния запис
Описание: Изхвърля неподготвените промени във файла.git restore <файл> -
Поправи последния запис
Описание: Променя съобщението или добавя забравени файлове. Не го прави следgit push.git commit --amend -m "<ново съобщение>" # или само добави подготвените файлове, без смяна на съобщението git commit --amend --no-edit -
Върни последния запис, но запази промените
Описание: Записът се маха, а файловете остават подготвени.git reset --soft HEAD~1 -
Върни последния запис и изхвърли промените
Описание: Необратимо за неподготвени и подготвени промени.git reset --hard HEAD~1 -
Отмени запис с нов запис
Описание: Безопасният начин за вече качени записи: добавя запис, който обръща старите промени.git revert <хеш-на-запис> -
Скрий промените временно (stash)
Описание: Чисти работната папка, без да губиш работа. Удобно преди смяна на клон.git stash push -m "<бележка>" git stash list git stash pop -
Изтрий неследените файлове
Описание: Първо-nпоказва какво ще бъде изтрито. После същата команда с-fго изтрива.git clean -n git clean -fd -
Върни изгубен запис
Описание: Reflog пази къде е сочил HEAD. Помага след грешенreset --hard.git reflog git reset --hard <хеш-от-reflog>
7. Отдалечено репо и синхронизация
Взимане на промени и безопасно качване в екипна среда.
-
Свали промените без да ги сливаш
Описание: Обновява информацията за отдалечените клонове, но не пипа твоите файлове.git fetch -
Почисти изтритите отдалечени клонове
Описание: Маха локалните препратки към клонове, които вече ги няма в GitHub.git fetch --prune -
Принудително качване, но по-безопасно
Описание: Нужно след rebase или amend на вече качен клон. Отказва, ако някой друг е качил междувременно.git push --force-with-lease -
Синхронизирай fork с оригинала
Описание: Добавяш оригиналното репо като upstream и го сливаш.git remote add upstream https://github.com/<оригинален-потребител>/<репо>.git git fetch upstream git switch main git merge upstream/main git push -
Същото с GitHub CLI
Описание: Обновява fork-а в GitHub и после тегли промените.gh repo sync <потребител>/<репо> git pull -
Създай таг за версия
Описание: Анотиран таг с описание, който се качва отделно.git tag -a v1.0.0 -m "Версия 1.0.0" git push origin v1.0.0
8. История и търсене
Как да разберете кой, кога и защо е променил определен ред от кода.
-
История с графика на клоновете
git log --oneline --graph --decorate --all -
История на един файл
Описание: С--followпродължава и през преименуванията.git log --follow -p <файл> -
Покажи един запис
Описание: Съобщение и промени на конкретен запис.git show <хеш-на-запис> -
Кой е променил реда
Описание: Показва автор и запис за всеки ред на файла.git blame <файл> -
Търси текст в проекта
Описание: Търси в следените файлове.git grep "<текст>" -
Записи по автор или период
git log --author="<име>" --since="2 weeks ago" -
Намери записа, който е счупил кода
Описание: Двоично търсене. След всяка проверка маркираш записа като добър или лош.git bisect start git bisect bad git bisect good <хеш-на-добър-запис> # когато приключиш git bisect reset
9. Настройка и вход в GitHub
Тези стъпки се правят обикновено веднъж на новата машина. Имайте предвид, че GitHub вече не приема стандартна парола за HTTPS връзка през терминала, а изисква персонален токен, SSH ключ или вход през GitHub CLI.
-
Име и имейл за записите
Описание: Използвай имейла от GitHub акаунта, за да се свързват записите с профила ти.git config --global user.name "<Име Фамилия>" git config --global user.email "<имейл>" -
main като начален клон
Описание: Новите репа ще започват с main вместо с master.git config --global init.defaultBranch main -
Вход чрез GitHub CLI
Описание: Най-простият начин за HTTPS. Следвай указанията в терминала.gh auth login gh auth setup-git -
SSH ключ
Описание: Генерира ключ и показва публичната му част. Постави я в GitHub (Settings -> SSH and GPG keys). После тествай.ssh-keygen -t ed25519 -C "<имейл>" cat ~/.ssh/id_ed25519.pub ssh -T git@github.com -
Преглед на настройките
git config --list --show-origin -
Краища на редовете в Windows
Описание: Само за Windows. Избягва предупрежденията за LF и CRLF.git config --global core.autocrlf true -
Псевдоними за по-кратко писане
Описание: След товаgit stе същото катоgit status.git config --global alias.st status git config --global alias.lg "log --oneline --graph --decorate --all"
10. GitHub CLI (gh)
Работа с GitHub директно от терминала, без да се налага да отваряте браузъра.
-
Отвори репото в браузъра
gh repo view --web -
Pull request от текущия клон
Описание:--fillвзима заглавието и описанието от записите.gh pr create --fill -
Списък и преглед на pull requests
gh pr list gh pr view <номер> gh pr checkout <номер> -
Слей pull request
Описание:--squashсъбира всички записи в един. Другите варианти са--mergeи--rebase.gh pr merge <номер> --squash --delete-branch -
Задачи (issues)
gh issue list gh issue create --title "<заглавие>" --body "<описание>" -
Публикувай версия (release)
Описание: Създава release от тага и генерира бележки от записите.gh release create v1.0.0 --generate-notes -
Клонирай свое репо по име
gh repo clone <потребител>/<репо> -
Изтрий репо в GitHub
Описание: Необратимо.ghще поиска потвърждение и разрешениеdelete_repo.gh repo delete <потребител>/<репо>
Техническа бележка: Командите
git switchиgit restoreизискват Git версия 2.23 или по-нова, аgit init -b mainизисква 2.28+. Можете да проверите своята версия с командатаgit --version.