Git Guide
Рекомендується встановити Relivator, дотримуючись детальних інструкцій в README.md, щоб відчувати себе більш впевнено на початку вивчення Git’у.
Це правда - Git спочатку може бути складним. Подумайте про використання таких ресурсів, як цей посібник, Git Book та GitHub Skills, щоб поглибити своє розуміння. Команда git commit —help спрямує вас до інформації про команду git commit
та її опції, тому ця команда довідки також може бути корисною. Найкращий спосіб освоїтися з Git’ом - це регулярно ним користуватися. Створіть невеликий проект або скористайтеся великим шаблоном веб-проекту, таким як Relivator, і поекспериментуйте з різними командами. Якщо ви не впевнені в чомусь, пов’язаному з Git’ом, зверніться до цього детального керівництва, щоб дізнатися більше.
Початкове налаштування Git’у
*Дотримуючись вказівок у цьому посібнику, ви зможете почати працювати з Git’ом, налаштувати своє середовище та використовувати зручні псевдоніми для оптимізації робочого процесу. Щасливого гітингу!
Основні інструменти
Переконайтеся, що у вас встановлено Git. Також рекомендується встановити Node.js LTS (Windows/macOS | Linux). Потім запустіть corepack enable pnpm, щоб встановити pnpm. Додатково ми рекомендуємо встановити VSCode та GitHub Desktop (Windows/macOS | Linux). Якщо ви користувач Windows, також встановіть PowerShell 7.4+.
Налаштування ідентичності
Перш ніж ви почнете створювати будь-які комміти в Git’і, вам потрібно встановити свою ідентичність. Це важливо, тому що ваше ім’я та email будуть додані до кожного створеного вами коміту. Оскільки ця інформація є публічною, використовуйте щось прийнятне.
git config --global user.name "<ВАШЕ_ІМ'Я>"git config --global user.email "<ВАША_ЕЛЕКТРОННА_АДРЕСА>"
Перевірка налаштувань
Щоб побачити всі налаштування Git’а і переконатися, що вони правильні, запустіть його:
git config --global --list
Посилання в Git’і
Написання хороших коммітів є цінною навичкою. Щоб дізнатися, як писати ефективні повідомлення про комміти, зверніться до наступних ресурсів:
- Покращення вашого Git-балки за допомогою звичайних коммітів
- Повідомлення про карму коммітів
- Семантичні повідомлення про фіксацію
- Зауваження про повідомлення про комміти в Git’і
- Написання повідомлень про комміти Git’а
Псевдоніми
Псевдоніми Git’а - це скорочення для довгих команд. Вони можуть заощадити вам багато тексту і зробити ваш робочий процес більш ефективним.
Отримання оновлень
Цей псевдонім оновлює ваш локальний репозиторій, витягуючи останні зміни, перезавантажуючи та оновлюючи підмодулі.
# git downgit config --global alias.down '!git pull --rebase --autostash; git submodule update --init --recursive'
Надсилання оновлень
Цей псевдонім переміщує ваші зміни до віддаленого сховища, включно з тегами.
# git upgit config --global alias.up '!git push; git push --tags'
Скасування постановки одного або декількох файлів
Іноді ви помилково розбиваєте файли на етапи. Цей псевдонім допоможе вам вилучити їх зі стадії.
# git unstage <ФАЙЛИ>.git config --global alias.unstage 'reset HEAD --'
Тегування релізів відповідно до семантичної версійності (SemVer)
Семантичне керування версіями - це спосіб позначати ваші випуски змістовними номерами версій. Ці псевдоніми допомагають автоматизувати процес.
# git release-majorgit config --global alias.release-major '!latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; set -- $(echo $latest | sed -e s/v// -e "s/\./ /g"); major=$1; minor=$2; patch=$3; major=$((major+1)); minor=0; patch=0; next=v$major.$minor.$patch; git tag -a $next -m ""; echo "Попередній випуск:"; echo -n " "; echo $latest; echo "Новий випуск:"; echo -n " "; echo $next'
# git release-minorgit config --global alias.release-minor '!latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; set -- $(echo $latest | sed -e s/v// -e "s/\./ /g"); major=$1; minor=$2; patch=$3; minor=$((minor+1)); patch=0; next=v$major.$minor.$patch; git tag -a $next -m ""; echo "Попередній випуск:"; echo -n " "; echo $latest; echo "Новий випуск:"; echo -n " "; echo $next'
# git release-patchgit config --global alias.release-patch '!latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; set -- $(echo $latest | sed -e s/v// -e "s/\./ /g"); major=$1; minor=$2; patch=$3; patch=$((patch+1)); next=v$major.$minor.$patch; git tag -a $next -m ""; echo "Попередня версія:"; echo -n ""; echo $latest; echo "Нова версія:"; echo -n ""; echo $next'
Ігнорування надлишкових бінарних імен git
у командах
Ви можете не вводити git git
, встановивши псевдонім:
# git git status, git git commit тощо.git config --global alias.git '!cd "$GIT_PREFIX" && git'
Відображення журналу змін з часу останнього тегу
Щоб переглянути журнал змін від останньої мітки до поточної фіксації, використовуйте цей псевдонім:
# git changeloggit config --global alias.changelog '!git log $(git describe --abbrev=0 --tags)..HEAD --no-merges --pretty=online --abbrev-commit'
Виявлення залишків і відходів від забудови
Знайдіть у своєму коді загальні маркери залишків, такі як TODO або налагоджувальні відбитки:
# git leftover
git config --global alias.leftover '!git grep -P -i -I --untracked "((?<![a-zA-Z0-9])(TODO|FIXME|XXX|console\.log|System\.out|var_dump)(?![a-zA-Z0-9]))|([\t ]+$)"'
Рекомендація
Використання вашого улюбленого редактора для Git’а
Ви можете налаштувати ваш улюблений текстовий редактор для використання з Git’ом для написання повідомлень про комміти тощо. Наприклад, якщо ви віддаєте перевагу gedit
на Ubun tu:
git config --global core.editor "gedit --wait"
Коректна обробка закінчень рядків у Windows
Windows та Unix-системи (наприклад, Linux та macOS) по-різному обробляють закінчення рядків. Щоб уникнути проблем, налаштуйте Git’у так, щоб він автоматично обробляв їх за вас. Це перетворить закінчення рядків у власний формат Windows (CRLF) при оформленні замовлення і назад у формат Unix (LF), коли ви збережете зміни.
git config --global core.autocrlf true
Запам’ятовування (кешування) паролів для HTTPS
Коли ви клонуєте сховища по HTTPS, вам потрібно щоразу вводити ім’я користувача і пароль, на відміну від SSH-ключів. Щоб змусити Git’а запам’ятовувати ваші паролі і полегшити собі життя, використовуйте наведені нижче команди відповідно до вашої операційної системи:
# У Windows
git config --global credential.helper wincred
# На Ubun tu
sudo apt-get install libgnome-keyring-devcd /usr/share/doc/git/contrib/credential/gnome-keyringsudo makegit config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring
# На macOS
git config --global credential.helper osxkeychain
Використання
Оновлення розгалуженого репозиторію (синхронізація з оригіналом)
-
Додайте оригінальне сховище як віддалене (зробіть це лише один раз):.
Terminal window git remote add upstream <GIT_URL_OF_ORIGINAL_REPOSITORY> -
Отримайте оновлення з оригінального репозиторію та перенесіть їх до вашого форку:.
Terminal window git pull upstream <BRANCH_NAME> <BRANCH_NAME>git push origin
Скидання сховища до стану розгалуженого сховища
-
Додайте оригінальне сховище як віддалене (зробіть це лише один раз):.
Terminal window git remote add upstream <GIT_URL_OF_ORIGINAL_REPOSITORY> -
Скиньте стан вашого сховища:.
Terminal window git віддалене оновленняgit reset --hard upstream/<BRANCH_NAME></BRANCH_NAMEgit push origin +<BRANCH_NAME>.
Показати всі проігноровані файли для сховища
Перерахувати всі ігноровані файли:
git clean -ndX# абоgit status --ignored
Отримати список усіх віддалених команд для сховища
Щоб переглянути всі віддалені сховища, пов’язані з вашим локальним сховищем:
git remote -v
Видалити всі нещодавно проігноровані файли
Коли ви додали до .gitignore
файл, який раніше був у сховищі, видаліть його зі сховища:
git rm -r --cached .git add .
Зміна URL-адреси віддаленого доступу до сховища
Щоб змінити віддалену URL-адресу:
git віддалений set-url <REMOTE_NAME> <NEW_REMOTE_URL>
Відкинути непоставлені зміни
Відкинути всі непоставлені зміни:
git checkout -- .
Відкинути зміни для певного файлу або шляху:
git checkout -- "<ШЛЯХ_ДО_ДИСКЕТКИ_ЗМІН_ДЛЯ>"
Скасування вже опублікованого коміту
Безпечний метод:
git checkout HEAD~1 .git commit -m "Відмінити деяку фіксацію"git push <ІМ'Я_ВІДДІЛЕННЯ> <ІМ'Я_ВІДДІЛЕННЯ>
Небезпечний метод:.
git reset --hard HEAD~1git push -f <ІМ'Я_ВІДДІЛЕННЯ> <ІМ'Я_ВІДДІЛЕННЯ>
Скасування локальної фіксації (ще не опублікована)
Зберегти зміни у вашій робочій копії:
git reset --soft HEAD~1
Зовсім відмовитися від змін:
git reset --hard HEAD~1
Показати зміни, внесені до робочої копії
Показувати тільки неінсценовані зміни:
git diff
Показувати лише поетапні зміни:
git diff --staged
Показати як неінсценовані, так і інсценовані зміни:
git diff HEAD
Видалити гілку
Щоб видалити гілку локально:
git branch -d <BRANCH_NAME> </BRANCH_NAME
Видалення гілки на пульті:
git push <ІМ'Я_ВІДДІЛЕННЯ> :<ІМ'Я_ВІДДІЛЕННЯ>
Додавання опису до коміту
Додавання повідомлення про фіксацію з заголовком та описом:
git commit -m "<TITLE>" -m "<DESCRIPTION>"
Видалити всі невідстежувані файли та каталоги
Попередній перегляд того, що буде видалено:
git clean -ndf
Щоб дійсно видалити файли:
git clean -df
Показати журнал у короткій версії
Відображати журнал фіксації у стислому форматі:
git log --pretty=online --abbrev-commit
Створити гілку
Створити нову гілку, але залишитися в поточній гілці:
гілка git'а <NEW_BRANCH_NAME>
Створити та перейти до нової гілки:
git checkout -b <NEW_BRANCH_NAME>
Перехід до іншої гілки
Перейти до іншої гілки:
git checkout <ІМ'Я_ІНШОЇ_ВІДДІЛЕННЯ>
Тегування випусків
Ви можете позначити певні моменти в історії вашого сховища, додавши мітки. Мітки зазвичай використовуються для релізів, але можуть застосовуватися і для інших цілей.
Щоб позначити поточний комміт, скористайтеся наступними командами. Замініть <TAG_NAME>
на унікальну назву тегу (наприклад, v1.0.4
для версій) і <DESCRIPTION>
на опис змін (необов’язково).
git tag -a "<TAG_NAME>" -m "<DESCRIPTION>"git push <ІМ'Я_ВІДДАЛЕНОГО_ТЕГУ> --tags
Імпорт комітів, запитів на витягування та інших змін через файли виправлень
-
Отримайте файл виправлення для коміту, pull-запиту або зміни, яку ви хочете імпортувати. Для pull-запитів GitHub ви можете отримати файл виправлення, додавши
.patch
до URL-адреси pull-запиту:Terminal window curl -L https://github.com/<USER>/<REPO>/pull/<ID>.patch -
Застосуйте файл виправлення за допомогою
git apply
:Terminal window curl -L https://github.com/<USER>/<REPO>/pull/<ID>.patch | git apply -
За бажанням, внесіть додаткові зміни до імпортованого коду.
-
Зафіксуйте зміни, вказавши автора оригінального патчу:
Terminal window git commit --author "<ПРИЗНАЧЕННЯ_АВТОРА> <<ПРИЗНАЧЕННЯ_АВТОРА_ЕЛЕКТРОННА ПОШТА>>" -m "<ВАШЕ_ПОВІДОМЛЕННЯ_КОМІТУВАННЯ>"
Копіювання гілки
Створити локальну копію старої гілки під новим ім’ям і перенести її на віддалений сервер:
git checkout -b <NEW_BRANCH_NAME> <OLD_BRANCH_NAMEgit push -u <НАЗВА_ВІДДІЛЕННЯ> <НАЗВА_ВІДДІЛЕННЯ>
Переміщення філії
Перейменування гілки локально та віддалено:
git checkout -b <NEW_BRANCH_NAME> <OLD_BRANCH_NAMEgit push -u <ВІДДАЛЕНА_НАЗВА> <НОВА_НАЗВА_ВІДДІЛЕННЯ_ВІДДІЛЕННЯ>git branch -d <OLD_BRANCH_NAME> <стара_назва_гілкиgit push origin :<OLD_BRANCH_NAME>.
Очищення гілки та скидання її до порожнього стану
Створити нову гілку без історії і почати з чистого аркуша:
git checkout --orphan <NEW_BRANCH_NAME>.rm -rf ./*# Додайте ваші нові файлиgit add .git commit -m "Початкова фіксація"git push -uf <ВІДДАЛЕНА_НАЗВА> <НОВА_НАЗВА_ВІДДІЛЕННЯ>
Підрахунок коммітів на гілці
Підрахунок загальної кількості коммітів на гілці:
git rev-list --count <BRANCH_NAME># Приклад: git rev-list --count main
Підрахунок коммітів на автора:
git shortlog -s -n
Скасування змін
Скасування скидання Git’а
Якщо ви помилково запустили git reset --hard HEAD^
і втратили комміти, скористайтеся git reflog
, щоб знайти комміт і скинутись до нього:
git refloggit reset 'HEAD@{1}'
Скасувати останню фіксацію
Скасувати останню фіксацію, але зберегти зміни у робочому каталозі:
git reset --soft HEAD~1
Визначення розміру теки
Щоб знайти розмір папки:
du -hs
Очищення історії Git’а
Щоб видалити файли з історії, використовуйте git filter-branch
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <pathname>' <commitHASH>'
Або використовуйте bfg
:
-
Встановіть
bfg
:Terminal window brew install bfg -
Запустіть
bfg
, щоб очистити історію комітів:Terminal window bfg --delete-files *.mp4bfg --replace-text passwords.txtbfg --delete-теки .git -
Видалити файли:
Terminal window git reflog expire --expire=now --all && git gc --prune=now --aggressive
Щоб замінити текст, створіть файл passwords.txt
з наступним форматом:
PASSWORD1 # Замінити буквальний рядок 'PASSWORD1' на '***REMOVED***' (за замовчуванням)PASSWORD2==>examplePass # Замінити на 'examplePass'PASSWORD3==> # Замінити на порожній рядокregex:password=\w+==>password= # Замінити за допомогою регексу
Сквош-фікс
Об’єднати кілька коммітів в один:
git rebase -i HEAD~<n>.# абоgit rebase -i <COMMIT_HASH> # git rebase -i <COMMIT_HASH>
Відмінити зміни
Відкинути всі зміни:
git resetgit checkout .git clean -fdx
Видалити node_modules
, якщо випадково зареєстровано
git rm -r --cached node_modules
Внести зміни до ваших повідомлень про зобов’язання
Щоб змінити повідомлення про останню фіксацію:
git commit --amend
Збираю вишні
Застосування коміту з іншої гілки як нового коміту:
git cherry-pick <ВАШ_КОММІТ_ХЕШ>
Управління філіями
Перейменувати філію
Щоб перейменувати гілку, ви можете скористатися наступними командами:
# Перейменуйте гілку зі старої назви на новуgit branch -m old-name new-name# Або, якщо ви перебуваєте на гілці, яку хочете перейменуватиgit branch -m new-name
# Видаліть стару гілку на віддаленому комп'ютері і виштовхніть нову гілкуgit push origin :old-name new-name
# Встановіть висхідну гілку для нової гілкиgit push origin -u new-name
Скидання гілки локального сховища для відповідності віддаленому
Щоб скинути локальну гілку, щоб вона відповідала “головній” гілці віддаленого сховища:
git fetch origingit reset --hard origin/maingit clean -f # Очистити локальні файли
Видалити всі об’єднані віддалені гілки
Видалити всі віддалені гілки, які вже були об’єднані:
git branch -r --merged | grep -v main | sed 's/origin\///' | xargs -n 1 git push --delete origin
Скидання до початкових налаштувань
Щоб скинути локальну гілку, щоб вона відповідала віддаленій:
git fetch --all
# Варіант 1: Скидання до основної гілки
git reset --hard origin/main
# Варіант 2: Скидання до певної гілки
git reset --hard origin/<назва_гілки>.
### Отримати останню фіксацію сховища
Щоб отримати останній комміт сховища:
```bashgit log -1
Натисніть Q
, щоб вийти з журналу.
Отримати хеш з останньої фіксації
Щоб отримати повний хеш останнього коміту:
git log -1 --pretty=%H# Виведення706b92ba174729c6a1d761a8566a74f0a0bf8672
Отримати скорочений хеш:
git log -1 --pretty=%h# Виведення706b92b
Зберігати хеш у змінній:
echo $(git log -1 --pretty=%H)
Тегування для керування версіями Docker
Позначте сховище і виконайте фіксацію:
# Позначте сховище тегамиgit tag -a v0.0.1 -m "версія v0.0.1"
# Перевірте тегgit describe# Вивід: v0.0.1
# Виконайте фіксаціюgit commit -am 'chore: зробити щось'
# Опишіть ще разgit describe# Виведення: v0.0.1-1-g9ba5c76
Ярлики Git’а
Налаштуйте псевдоніми, щоб спростити типові команди Git’а:
псевдонім gst='git status'псевдонім gcm='git commit -S -am'аліас gco='git checkout'аліас gl='git pull origin'аліас gpom="git pull origin main"alias gp='git push origin'alias gd='git diff | mate'alias gb='git branch'alias gba='git branch -a'alias del='git branch -d'
Отримання імені та власника репозиторію GitHub
Отримати URL-адресу та ім’я сховища:
git config --get remote.origin.urlgit ls-remote --get-urlgit remote get-url origin# Виведення: https://github.com/username/repository.git
basename $(git remote get-url origin) .git# Виведення: репозиторій
Видалити гілку локально
Щоб видалити гілку локально:
git push origin --delete <назва_галузі>
Очистити локальні видалені гілки та отримати всі інші гілки
git віддалене оновлення --prune
Видалити всі локальні гілки, окрім поточної
git branch | grep -v "main" | xargs git branch -D
Сортування гілок за датою останньої фіксації
Перелік гілок, відсортованих за датою останнього коміту:
git fetch --prunegit branch --sort=-committerdate
Управління зобов’язаннями
Git-повідомлення про фіксацію
- подвиг: Нова функція, видима для кінцевих користувачів.
- виправлення: Виправлення помилки, видиме кінцевим користувачам.
- рутина: Зміни, які не впливають на кінцевих користувачів (наприклад, зміни в конвеєрі CI).
- docs: Зміни в документації.
- refactor: Зміни у виробничому коді, що стосуються читабельності, стилю або продуктивності.
Список філій, які було об’єднано
гілка git --merged
Список філій, які не були об’єднані
гілка git --no-merged
Очищення та оптимізація репозиторію
Видалення непотрібних файлів та оптимізація локального сховища:
# Видалення непотрібних файлівgit gc
# Видалення всіх недоступних об'єктів з бази даних об'єктівgit prune
# Перевірка зв'язності та валідності об'єктів у базі данихgit fsck
# Обріжте ваш віддалений робочий каталогgit remote update --prune
Автоматично надсилати коміти з тегами
git config --global push.followTags true
Відновлення файлу до заданого коміту
Відновлення певного файлу до його стану на момент фіксації:
git restore -s <SHA1> -- <ім'я_файлу
Корисні команди та техніки Git’у
Завантажити лише папку з GitHub за допомогою Subversion (SVN)
Щоб завантажити певну папку з репозиторію GitHub за допомогою SVN:
# Замініть tree/main на trunk в URL-адресіsvn експорт https://github.com/alextanhongpin/pkg.git/trunk/authheader
Створення псевдоніма для завантаження шаблонів docker-compose
:
alias init-db='svn export https://github.com/alextanhongpin/docker-samples/trunk/postgres/docker-compose.yml'
Попередньо зафіксовані хуки
Переконайтеся, що у поточній гілці відредаговано журнал змін. Для цього використовуйте гачок попередньої фіксації:
# !/bin/bash
if [[ $(git diff develop -- CHANGELOG.md | wc -l) -eq 0 ]]; then echo "Не забудьте додати CHANGELOG.md" exit 1fi
Git Rebase Favor Current Branch
Надавати перевагу поточній гілці під час перезавантаження:
git rebase -X їхній ${branch}
Більше інформації про стратегії злиття для rebase
Git-хук після оформлення замовлення
Щоб автоматизувати завдання після перевірки гілки, використовуйте хук пост-перевірки:
-
Створіть і встановіть дозволи для хука:
Terminal window торкніться .git/hooks/post-checkoutchmod u+x .git/hooks/post-checkout -
Додайте наступний скрипт до
.git/hooks/post-checkout
:#!/bin/bash# Параметри# $1: Посилання на попередню голову# $2: Посилання на новий заголовок# $3: Чи це вилучення файлу (0), чи вилучення гілки (1)# Це перевірка файлу - нічого не робітьif [ "$3" == "0" ]; then exit; fiBRANCH_NAME=$(git symbolic-ref --short -- HEAD)NUM_CHECKOUTS=$(git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l)# Якщо рефи попередньої та нової гілок однакові# і кількість чеків дорівнює одиниці, то створено нову гілкуif [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; thenecho "нову гілку створено"elseecho "гілку переключено на ${BRANCH_NAME}"fi
Git-перевірка одного файлу з головного коміту
Повернути файл до стану в головній гілці:
git checkout $(git rev-parse main) -- шлях до файлу
Додавання нових змін до останнього коміту
Доповнити останній комміт новими змінами:
git add --allgit commit --amend# Примітка: Вам може знадобитися примусове виштовхування, якщо коміт вже було виштовхнутоgit push --force
Очищення PR філії
Якщо у вашій гілці безлад і ви хочете почистити коміти:
-
Створіть нову тимчасову гілку:
Terminal window git checkout -b feature/foo-tmp -
Створіть патч-файл змін:
Terminal window git diff origin/feature/foo origin/main > out.patch -
Застосуйте патч до тимчасової гілки:
Terminal window git apply out.patch -
Очистіть і перебазуйте за потреби, а потім видаліть стару гілку:
Terminal window гілка git'а -D feature/foo -
Перейменуйте тимчасову гілку на оригінальну назву:
Terminal window гілка git -m feature/foo -
З силою проштовхніть очищену гілку:
Terminal window git push --force feature/foo
Краще штовхни з більшою силою
Використовуйте git push --force-with-lease
замість git push --force
для безпечнішого примусового оновлення.
Дізнатися більше про force-with-lease
Git Fixup
Виправити попередній комміт:
-
Створіть фіксований коміт:
Terminal window git commit --fixup <first-commit-hash> <first-commit-hash -
Rebase для витіснення фіксованого коміту:
Terminal window git rebase -i --autosquash --root
Ресурси
- Шаблон Relivator Next.js
- Theo’s Post
- Блог Мартіна Хайнца
- Delight-IM’s Git Knowledge
- Alex Tan Hong Pin’s Cheat Sheet
Підсумок
Цей посібник охоплює різноманітні корисні команди та техніки Git’у, натхненні різними ресурсами та створені Reliverse, щоб полегшити як початківцям, так і досвідченим користувачам керування та оптимізацію своїх репозиторіїв.