Git: команда үчүн продвинутый workflow - rebase, cherry-pick, bisect жана hooks
git add, git commit, git push - баары билет. Бирок ошол бирдей адамдар merge конфликттеринен коркот, тарыхты иреттөөнү билбейт жана ким кайсы коммит менен бузганын таба алышпайт. Бул макала - ошол алкакты өзгөрткөн буйруктар жөнүндө.
Merge vs Rebase: кайсын качан колдонуу
Merge коммиттердин тарыхын сактайт, бирочтондуу merge commit кошот:
main: A - B - C
feature: C - D - E - F (merge commit)
/ \
A - B G
Rebase feature бутактын коммиттерин main'дин учуна которот:
main: A - B - C
feature: A - B - C - D' - E' - F'
Тарых таза, сызыктуу. Бирок: D', E', F' - бул жаңы коммиттер (хэштери өзгөрөт). Жалпы эрежи: shared branches'те (main, develop) rebase'ди эч качан колдонбоңуз. Жеке feature бутактарда - кош барыңыз.
# Feature бутакта иштеп жатканда main'ди жаңыртуу:
git checkout main
git pull origin main
git checkout feature/my-feature
git rebase main # feature'ди main'дин учуна жылдыруу
# Конфликт болсо:
# Файлды оңдоо → git add . → git rebase --continue
# Баш тартуу: git rebase --abort
Interactive Rebase: коммиттердин тарыхын тазалоо
Feature бутакта иштеп жатып 10 коммит жасадыңыз: "fix", "fix2", "oops", "finally works". PR'дан мурда тазалоо керек.
git rebase -i HEAD~10 # Акыркы 10 коммитти редакциялоо
Редактор ачылат:
pick a1b2c3 Add user authentication
pick d4e5f6 fix typo
pick g7h8i9 fix typo again
pick j0k1l2 add tests
pick m3n4o5 more tests
pick p6q7r8 WIP
pick s9t0u1 Finish feature
Буйруктарды өзгөртүңүз:
pick a1b2c3 Add user authentication
fixup d4e5f6 fix typo # pick'ке бириктирет, билдирүүсүн жок кылат
fixup g7h8i9 fix typo again # ошондой эле
reword j0k1l2 add tests # коммитти сактайт, бирок билдирүүнү өзгөртүүгө мүмкүнчүлүк берет
squash m3n4o5 more tests # pick'ке бириктирет, билдирүүсүн сактайт
drop p6q7r8 WIP # бул коммитти жок кылат
pick s9t0u1 Finish feature
Сактаңыз - Git коммиттерди ыртааттуу кайра жазат. PR'ды карап чыккан адам таза тарых көрөт.
Cherry-Pick: башка бутактан конкреттүү коммит алуу
Productionдо критикалык bug fix бар. developта тооленди. Бирок mainге бардык develop өтпөйт - тек ошол fix гана керек.
# develop бутагынан конкреттүү коммиттин хэшин алуу:
git log develop --oneline
# abc1234 Fix payment calculation bug
# def5678 Add new dashboard feature ← бул керек эмес
git checkout main
git cherry-pick abc1234 # Ошол коммитти main'ге применяет
# Бир нече коммит:
git cherry-pick abc1234 bcd2345 cde3456
# Range (abc1234'тен bcd2345'ке чейин):
git cherry-pick abc1234..bcd2345
Cherry-pick жаңы коммит жасайт - оригиналдуу коммит башка бутакта кала берет.
Git Bisect: кайсы коммит бузганын бинардык издөө менен табуу
"Бул функция иштечү, азыр иштебейт. Кайсы коммит бузду?" - 200 коммит бар. Бирден карабайсыз.
git bisect бинардык издөөнү колдонот: 200 коммит → 8 текшерүү.
git bisect start
# Азыркы абал - бузулган
git bisect bad
# Акыркы иштеген белгилүү коммит:
git bisect good v2.1.0
# Git ортодогу коммитке которот.
# Тест кылыңыз → жыйынтыкты айтыңыз:
git bisect good # же
git bisect bad
# Git жаңы ортодогу коммитке которот... кайталайт...
# 8 кадамдан кийин:
# "abc1234 is the first bad commit"
git bisect reset # Баштапкы абалга кайтуу
Автоматтандыруу - скрипт менен:
git bisect start HEAD v2.1.0
git bisect run npm test -- --grep "payment calculation"
# Git автоматтык тестти иштетип, жообун алат
Pre-Commit Hooks Husky менен
Hooks - Git иш-аракетинен мурда/кийин иштеген скрипттер. pre-commit - коммит жасалганга чейин иштейт. Lint жана тест чекпей commit жаса болбошун камсыздайт.
npm install --save-dev husky lint-staged
npx husky init
// package.json
{
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{ts,tsx,js}": "jest --findRelatedTests --passWithNoTests"
}
}
# .husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
Эми ар бир коммитте ESLint + Prettier автоматтык иштейт. Эгер тест өтпөсө - коммит жасалбайт.
Conventional Commits жана автоматтык CHANGELOG
Команда бирдей форматта коммит билдирүүлөрүн жазса - CHANGELOG автоматтык чыгарылат.
feat: add user authentication
fix: correct payment calculation
docs: update API documentation
refactor: extract user service
test: add unit tests for auth
chore: update dependencies
npm install --save-dev @commitlint/cli @commitlint/config-conventional
// commitlint.config.js
module.exports = { extends: ['@commitlint/config-conventional'] };
# .husky/commit-msg
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no -- commitlint --edit "$1"
CHANGELOG генерациясы:
npm install --save-dev standard-version
npx standard-version # версияны жаңыртат, CHANGELOG.md жазат, тег коёт
Практикалык Git Config - командага стандарт
# ~/.gitconfig же repo'дун .git/config'ке
git config --global pull.rebase true # pull = fetch + rebase (merge эмес)
git config --global rebase.autoStash true # rebase алдында жумуш жашыруу
git config --global core.autocrlf input # Windows'та CRLF → LF
git config --global push.default current # feature бутагын ошол эле атта push кылуу
# Мыкты log форматы:
git log --oneline --graph --decorate --all
# Alias катары кошуу:
git config --global alias.lg "log --oneline --graph --decorate --all"
git lg # мындан кийин ушундай жазасыз
Aunimeda реалдуу долбоорлордо ушул workflow'ду колдонот.
Ошондой эле: Docker Node.js production, Вайб-кодинг 2026