Git Контрол на версиите: Пълното техническо ръководство за разработчици
Git е разпределена система за контрол на версиите (DVCS), която записва снимки на файловото дърво на проект с течение на времето, позволявайки на произволен брой сътрудници да работят паралелно, без да презаписват взаимно промените си. Всеки разработчик притежава пълно копие на хранилището — включително цялата история на комитите — на локалната си машина, което елиминира единичната точка на отказ и позволява напълно офлайн работни процеси.
Създаден от Linus Torvalds през април 2005 г. за замяна на BitKeeper при разработката на ядрото на Linux, Git е проектиран от основни принципи около три неотменими изисквания: скорост, целостта на данните и поддръжка на нелинейни, разпределени работни процеси. Тези проектни цели все още определят какво прави Git категорично различен от предшествениците му и защо той остава доминиращата VCS повече от две десетилетия по-късно.
Как Git се различава от централизирания контрол на версиите
Разбирането на архитектурата на Git изисква директно сравнение с централизирани системи като Subversion (SVN) или CVS, където единичен авторитетен сървър съхранява каноничното хранилище, а разработчиците извличат повърхностни работни копия.
| Измерение | Git (Разпределен) | SVN (Централизиран) |
|---|---|---|
| — | — | — |
| Модел на хранилището | Пълен клонинг на всеки възел | Тънко работно копие, сървърът съхранява историята |
| Офлайн възможности | Пълен commit, branch, diff, log | Само за четене; комитите изискват сървър |
| Цена на разклоняването | Почти нулева (манипулация на указатели) | Скъпо копиране на директории |
| Единична точка на отказ | Няма — всеки клонинг може да възстанови | Прекъсване на сървъра спира всички комити |
| Стратегия за сливане | Тристранно сливане + rebase | Само тристранно сливане |
| Целостта на историята | SHA-1/SHA-256 хеширане на съдържанието | Последователни номера на ревизии |
| Мрежова зависимост | Само за push/pull/fetch | Почти всяка операция |
| Частично извличане | Не се поддържа нативно | Поддържа се (sparse checkout) |
| Крива на обучение | По-стръмна начална крива | По-лека за ветераните на SVN |
| Приемане (2024) | ~95% от професионалните екипи | Наследени корпоративни среди |
Разпределеният модел означава, че дори ако хостинг платформа като GitHub претърпи прекъсване, локалният клонинг на всеки разработчик е пълно, авторитетно резервно копие на цялата история на проекта.
Основна архитектура: Какво всъщност съхранява Git
Git не съхранява разлики. Той съхранява снимки. Всеки комит сочи към обект от тип дърво, представляващ пълното състояние на всеки проследяван файл в този момент. Ако даден файл не се е променил между два комита, Git съхранява указател към предишния blob, вместо да го дублира — така Git постига едновременно пълнота и ефективност на съхранението.
Четирите основни типа обекти в обектното хранилище на Git (.git/objects/) са:
- Blob — необработено съдържание на файл, адресирано по SHA хеш
- Tree — списък на директория, съпоставящ имена на файлове с хешове на blob или поддърво
- Commit — указател към дърво, нула или повече родителски комити, метаданни за автора и съобщение
- Tag — анотиран указател към конкретен комит, използван за маркери на версии
Всеки обект е неизменяем и адресиран по съдържание. Промяната на един байт в който и да е файл произвежда напълно различен SHA хеш, който се разпространява нагоре през обектите от тип дърво и комит. Ето защо историята на Git е криптографски защитена от подправяне — не можете безшумно да промените минал комит, без да промените хеша на всеки следващ комит.
Областта за подготовка (известна също като индекс, съхранявана в .git/index) е двоичен файл, съдържащ предложения следващ комит. Този модел с три зони — работна директория, индекс, хранилище — е най-неразбраната архитектурна особеност на Git и източникът на най-голямо объркване при начинаещите.
Инсталиране и конфигуриране на Git
Преди да изпълните каквито и да е команди, проверете инсталацията си и конфигурирайте самоличността си. Git вгражда информацията за автора във всеки обект от тип комит, а неправилно конфигурираната самоличност е една от най-честите причини за объркани истории на комити в споделени хранилища.
# Verify installation
git --version
# Set global identity (stored in ~/.gitconfig)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
# Set default branch name to 'main' (modern convention)
git config --global init.defaultBranch main
# Set preferred editor for commit messages
git config --global core.editor "vim"
# Enable colored output
git config --global color.ui auto
# Verify configuration
git config --listКонфигурацията е многослойна: --system (всички потребители, /etc/gitconfig), --global (текущ потребител, ~/.gitconfig) и --local (хранилище, .git/config). По-специфичните обхвати заменят по-широките.
Основни команди на Git: Пълен справочник
Инициализиране и клониране
git init създава ново хранилище, като записва директория .git/ в текущата папка. Не създава никакви комити — хранилището започва празно.
git init
git init my-project # Initialize into a new subdirectory
git init --bare repo.git # Bare repository (no working tree, used for servers)Голото хранилище съдържа само обектното хранилище и референциите — без работна директория. Това е правилният формат за отдалечено хранилище, към което множество разработчици изпращат промени. Ако самостоятелно хоствате Git на сървър с VPS Хостинг, винаги инициализирайте споделените хранилища като голи.
git clone създава пълно локално копие на отдалечено хранилище, включително всички клонове, тагове и история.
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git # SSH transport (preferred for auth)
git clone --depth 1 https://github.com/user/repo.git # Shallow clone (latest commit only)
git clone --branch develop https://github.com/user/repo.git # Clone specific branchПовърхностните клонинги (--depth) са полезни за CI/CD конвейери, където ви е необходимо само последното състояние, а не пълната история. Те драстично намаляват времето за клониране на големи хранилища, но предотвратяват някои операции, зависещи от историята, като git bisect.
Проверка на състоянието
git status е най-често изпълняваната команда във всеки работен процес. Тя показва състоянието на трите зони на вашето хранилище.
git status
git status -s # Short format: two-column status codes
git status -sb # Short format with branch infogit diff сравнява съдържание между зони или комити.
git diff # Working directory vs. index (unstaged changes)
git diff --staged # Index vs. last commit (what will be committed)
git diff HEAD # Working directory vs. last commit (all changes)
git diff main..feature # Compare tips of two branches
git diff abc123..def456 # Compare two specific commits
git diff --stat # Show changed files and line counts onlygit log обхожда графа на комитите. Опциите му за филтриране са сред най-мощните и недостатъчно използвани функции на Git.
git log
git log --oneline --graph --decorate --all # Visual branch graph
git log -p # Show patch (diff) for each commit
git log --author="Jane" # Filter by author
git log --since="2 weeks ago" # Filter by date
git log --grep="fix:" # Filter by commit message pattern
git log -- path/to/file # History of a specific file
git log --follow -- path/to/file # Follow renamesКомбинацията --graph --oneline --decorate --all е толкова универсално полезна, че повечето инженери я задават като псевдоним:
git config --global alias.lg "log --oneline --graph --decorate --all"Подготовка и комитване
git add filename.py # Stage a specific file
git add src/ # Stage an entire directory
git add . # Stage all changes in current directory
git add -p # Interactive patch staging (stage hunks, not whole files)
git add -u # Stage modifications and deletions, but not new filesИнтерактивното подготвяне (git add -p) е една от най-мощните и недостатъчно използвани функции на Git. Позволява ви да преглеждате и избирателно подготвяте отделни части в рамките на файл, позволявайки прецизни, атомарни комити дори когато работната ви директория съдържа множество несвързани промени.
git commit -m "feat: add OAuth2 token refresh logic"
git commit --amend # Modify the most recent commit (message or content)
git commit --amend --no-edit # Amend content without changing the message
git commit -v # Open editor showing full diff of staged changesКритично правило: Никога не изменяйте комити, които вече са изпратени към споделено отдалечено хранилище. Изменянето презаписва хеша на комита, принуждавайки сътрудниците да правят rebase или да нулират локалните си клонове.
Изпращане и изтегляне
git push origin main
git push origin feature/auth # Push a specific branch
git push -u origin feature/auth # Push and set upstream tracking
git push --force-with-lease # Safer force push (fails if remote has new commits)
git push origin --delete old-branch # Delete a remote branch
git push --tags # Push all local tagsПредпочитайте --force-with-lease пред --force когато трябва да презапишете отдалечената история. Проверява дали никой друг не е изпратил промени след последното ви извличане, предотвратявайки случайна загуба на данни.
git pull origin main
git pull --rebase origin main # Fetch and rebase instead of merge
git pull --ff-only # Only fast-forward; abort if a merge commit would be createdgit fetch изтегля отдалечени промени, без да засяга работната ви директория или текущия клон. Това е безопасният начин да проверите промените нагоре по веригата преди интегрирането им.
git fetch origin
git fetch --all # Fetch from all remotes
git fetch --prune # Remove remote-tracking branches that no longer exist upstreamРазклоняване и сливане: Основният работен процес
Моделът на разклоняване на Git е най-архитектурно значимата му функция. Клонът е просто именуван указател (файл от 41 байта в .git/refs/heads/) към хеш на комит. Създаването на клон е мигновено, независимо от размера на хранилището.
Управление на клонове
git branch # List local branches
git branch -a # List all branches (local and remote-tracking)
git branch -v # List branches with last commit info
git branch feature/user-auth # Create a new branch
git branch -d feature/user-auth # Delete merged branch
git branch -D feature/user-auth # Force delete (even if unmerged)
git branch -m old-name new-name # Rename a branchПревключване между клонове
Съвременният Git (2.23+) разделя функциите на git checkout на две специализирани команди:
git switch main # Switch to existing branch
git switch -c feature/payments # Create and switch in one step
git restore filename.py # Discard working directory changes to a file
git restore --staged filename.py # Unstage a file (remove from index)git checkout все още работи за всичко това, но git switch и git restore имат по-ясна, по-малко двусмислена семантика и трябва да се предпочитат в съвременните работни процеси.
Стратегии за сливане
git merge feature/user-auth # Standard merge (creates merge commit if needed)
git merge --no-ff feature/user-auth # Always create merge commit (preserves branch topology)
git merge --squash feature/user-auth # Squash all branch commits into one staged change
git merge --abort # Abort an in-progress conflicted mergeБързото сливане напред се случва, когато целевият клон не се е разклонил от изходния — Git просто премества указателя напред. Не се създава комит за сливане. --no-ff принудително създава комит за сливане дори в този случай, което запазва визуалната история на функционалните клонове в git log --graph.
Сливането чрез сгъстяване свива всички комити от функционален клон в една подготвена промяна, която след това ръчно комитвате. Това произвежда чиста линейна история в main, но отхвърля детайлната история на комитите на функционалния клон.
Пребазиране
git rebase повтаря комитите от един клон върху друг, презаписвайки техните хешове, за да създаде линейна история.
git rebase main # Rebase current branch onto main
git rebase -i HEAD~5 # Interactive rebase: edit last 5 commits
git rebase --onto main server client # Transplant client branch onto main, excluding server
git rebase --abort # Abort a rebase in progress
git rebase --continue # Continue after resolving a conflictИнтерактивното пребазиране (-i) е инструментът за хигиена на комитите на професионалиста. Позволява ви да пренареждате, сгъстявате, редактирате, премахвате или разделяте комити преди споделянето им. Честа употреба: почистване на объркан функционален клон преди отваряне на заявка за сливане.
| Стратегия | История | Случай на употреба | Риск |
|---|---|---|---|
| — | — | — | — |
| Сливане (по подразбиране) | Нелинейна, запазва клоновете | Дълготрайни функционални клонове | Шумен `git log` |
| Сливане `–no-ff` | Нелинейна, явни комити за сливане | Наложена топология на клоновете | Същото като по-горе |
| Сливане `–squash` | Линейна, един комит на функция | Чист основен клон | Губи детайлната история |
| Rebase | Линейна, без комити за сливане | Лични клонове, почистване преди PR | Презаписва хешове; опасно при споделени клонове |
| Cherry-pick | Избирателна, линейна | Пренасяне на поправки назад | Дублирани комити между клонове |
Златното правило на пребазирането: Никога не пребазирайте комити, съществуващи в публичен, споделен клон. Пребазирането презаписва хешовете на комитите. Ако колега е базирал работата си върху тези комити, историята му ще се разклони и той ще се изправи пред болезнено съгласуване.
Разрешаване на конфликти при сливане
Конфликти възникват, когато два клона модифицират едно и също място в един и същи файл. Git маркира конфликта във файла със стандартни маркери за конфликт:
<<<<<<< HEAD
const timeout = 30000;
=======
const timeout = 60000;
>>>>>>> feature/increase-timeoutРаботен процес за разрешаване:
# After a conflicted merge or rebase
git status # Identify conflicted files (marked as "both modified")
# Edit each conflicted file, remove markers, keep correct content
git add resolved-file.js # Mark as resolved
git commit # Complete the merge (message is pre-populated)За сложни конфликти инструментът за тристранно сливане предоставя по-ясен изглед:
git mergetool # Launch configured merge tool (vimdiff, meld, etc.)
git config --global merge.tool vimdiffОтмяна на промени: Матрицата за вземане на решения
Изборът на грешна команда за отмяна е един от най-честите начини разработчиците да загубят работа или да повредят споделената история. Правилният избор зависи от две променливи: къде се намира промяната и дали е изпратена.
| Сценарий | Команда | Презаписва историята | Безопасно при споделен клон |
|---|---|---|---|
| — | — | — | — |
| Премахване на файл от подготовката | `git restore –staged file` | Не | Да |
| Отхвърляне на промени в работната директория | `git restore file` | Не | Да |
| Отмяна на последния комит, запазване на промените в подготовката | `git reset –soft HEAD~1` | Да | Не |
| Отмяна на последния комит, запазване на промените извън подготовката | `git reset HEAD~1` | Да | Не |
| Отмяна на последния комит, отхвърляне на всички промени | `git reset –hard HEAD~1` | Да | Не |
| Безопасна отмяна на изпратен комит | `git revert <hash>` | Не | Да |
| Премахване на файл от цялата история | `git filter-repo` | Да | Не |
git reset --soft HEAD~1 # Undo commit, keep changes in index
git reset HEAD~1 # Undo commit, keep changes in working dir
git reset --hard HEAD~1 # Undo commit, discard all changes permanently
git revert abc1234 # Create new commit that inverts abc1234
git revert HEAD~3..HEAD # Revert last 3 commits (creates 3 revert commits)
git revert -n HEAD~3..HEAD # Stage the reversals without committing (batch revert)git reset --hard е необратимо чрез нормални команди на Git. Ако го изпълните случайно, единственият ви път за възстановяване е git reflog, който записва всяка позиция, към която е сочил HEAD, за приблизително 90 дни.
git reflog # Show HEAD movement history with hashes
git checkout -b recovery abc1234 # Recover by creating a branch at the lost commitРазширени команди за производствени работни процеси
git stash
git stash записва текущото състояние на работната директория и индекса в стек, давайки ви чисто работно дърво за превключване на контекст.
git stash # Stash tracked changes
git stash -u # Include untracked files
git stash push -m "WIP: auth refactor" # Stash with a descriptive name
git stash list # List all stash entries
git stash pop # Apply most recent stash and remove it from stack
git stash apply stash@{2} # Apply specific stash without removing it
git stash drop stash@{2} # Delete a specific stash entry
git stash branch feature/wip # Create a new branch from a stashgit cherry-pick
git cherry-pick abc1234 # Apply a single commit to current branch
git cherry-pick abc1234 def5678 # Apply multiple commits
git cherry-pick abc1234 --no-commit # Apply changes without committing
git cherry-pick main~3..main # Apply a range of commitsCherry-pick е стандартният механизъм за пренасяне на поправки на грешки към клонове за поддръжка. Ако поправите критична уязвимост в сигурността в main, правите cherry-pick на този комит към v2.1-stable и v2.0-stable без сливане на несвързани функции.
git bisect
git bisect извършва двоично търсене в историята на комитите, за да намери точния комит, въвел грешка. Това е един от най-мощните и най-малко известни инструменти за отстраняване на грешки в Git.
git bisect start
git bisect bad # Mark current commit as broken
git bisect good v2.3.0 # Mark a known-good commit or tag
# Git checks out the midpoint commit automatically
# Test your code, then:
git bisect good # If this commit is fine
git bisect bad # If this commit is broken
# Repeat until Git identifies the first bad commit
git bisect reset # Return to original HEAD when doneВ хранилище с 1 000 комита между добрата и лошата точка, git bisect открива виновника в най-много 10 стъпки.
git tag
Таговете маркират конкретни комити като значими — обикновено версии на изданията.
git tag v1.4.2 # Lightweight tag (just a pointer)
git tag -a v1.4.2 -m "Release 1.4.2" # Annotated tag (recommended; stores metadata)
git tag -a v1.4.2 abc1234 # Tag a specific past commit
git push origin v1.4.2 # Push a specific tag
git push origin --tags # Push all tags
git tag -d v1.4.2 # Delete local tag
git push origin --delete v1.4.2 # Delete remote tagВинаги използвайте анотирани тагове за издания. Те съхраняват името, имейла, датата и съобщението на маркиращия, и могат да бъдат подписани с GPG. Леките тагове са подходящи само за временни локални отметки.
git worktree
git worktree позволява едновременното извличане на множество работни директории от едно и също хранилище — всяка на различен клон. Това елиминира необходимостта от запазване или комитване на незавършена работа, когато трябва да превключите към спешна поправка.
git worktree add ../hotfix-branch hotfix/critical-auth-bug
git worktree list
git worktree remove ../hotfix-branchТова е особено ценно на Dedicated Server, изпълняващ CI/CD конвейер, където множество задачи за изграждане се нуждаят от едновременен достъп до различни клонове на едно и също хранилище, без да си пречат взаимно.
Git работни процеси за екипи
Правилната стратегия за разклоняване зависи от ритъма на издаване и размера на екипа. Съществуват три доминиращи модела:
Работен процес с функционални клонове
Всяка функция или поправка живее в собствен клон. Разработчиците отварят заявки за сливане към main. Прост, ефективен за повечето екипи.
Gitflow
Дефинира дълготрайни клонове main и develop, плюс краткотрайни клонове feature/, release/ и hotfix/ със строги правила за сливане. Подходящ за софтуер с явни версионирани издания (библиотеки, пакетирани приложения).
Разработка, базирана на основния клон
Разработчиците комитват директно в main (или използват много краткотрайни клонове, слети в рамките на ден). Разчита в голяма степен на флагове за функции, за да скрие незавършена работа. Предпочитан от екипи с висока скорост, практикуващи непрекъснато внедряване.
| Работен процес | Ритъм на издаване | Размер на екипа | Сложност на CI/CD |
|---|---|---|---|
| — | — | — | — |
| Функционален клон | Гъвкав | Всякакъв | Ниска |
| Gitflow | Планирани издания | Среден–Голям | Средна |
| Базиран на основния клон | Непрекъснато внедряване | Всякакъв | Висока |
Хостинг на Git хранилища: Самостоятелно хостване срещу управлявани платформи
За екипи, изискващи суверенитет на данните, съответствие или частна инфраструктура, самостоятелното хостване на Git сървър е жизнеспособен и често необходим избор. Опциите включват Gitea (лека, базирана на Go), GitLab CE (пълна DevOps платформа) и Forgejo (разклонение на Gitea с управление от общността).
Минимален самостоятелно хостван екземпляр на Gitea работи комфортно на план за VPS Хостинг с 2 vCPU и 2 GB RAM. За по-големи екипи или GitLab CE с CI изпълнители, 4–8 GB RAM е практическият минимум.
При самостоятелно хостване, защитете своя Git сървър с:
- SSH удостоверяване с ключ (деактивирайте напълно удостоверяването с парола)
- HTTPS с валиден сертификат — SSL сертификатите са от съществено значение за защита на идентификационните данни при пренос
- Правила на защитната стена, ограничаващи излагането на Git порт (22 или персонализиран SSH порт, 443 за HTTPS)
- Редовни автоматизирани резервни копия на директориите на голото хранилище
.git - Тайни за webhook за CI/CD интеграции
За екипи, използващи базирани на Git конвейери за внедряване, които също управляват уеб инфраструктура, съчетаването на самостоятелно хостван Git сървър с VPS с cPanel ви дава интегрирани куки за внедряване заедно с познати инструменти за управление на хостинга.
Git куки: Автоматизиране на портите за качество
Git куките са скриптове, които се изпълняват автоматично в конкретни точки от жизнения цикъл на Git. Те се намират в .git/hooks/ и не се комитват в хранилището по подразбиране (използвайте инструмент като pre-commit или husky за споделянето им).
Ключови куки за производствени работни процеси:
| Кука | Задействане | Честа употреба |
|---|---|---|
| — | — | — |
| `pre-commit` | Преди създаването на комит | Изпълнение на линтери, форматери, тестове |
| `commit-msg` | След написване на съобщението за комит | Налагане на формат на конвенционален комит |
| `pre-push` | Преди изпращане към отдалеченото хранилище | Изпълнение на пълния набор от тестове |
| `post-receive` | След получаване на изпращане от отдалеченото хранилище | Задействане на внедряване, изпращане на известия |
| `pre-rebase` | Преди началото на rebase | Предотвратяване на пребазиране на споделени клонове |
# Example pre-commit hook: reject commits with debug print statements
#!/bin/bash
if git diff --cached | grep -E '^+.*(console.log|debugger|print("DEBUG)'; then
echo "ERROR: Debug statement detected. Remove before committing."
exit 1
fiКуката post-receive на сървърно голо хранилище е основата на простото внедряване, базирано на Git: изпращате към сървъра, куката извлича новия HEAD в уеб корена, изпълнява стъпки за изграждане и рестартира услуги — без нужда от външна CI платформа.
.gitignore: Поддържане на хранилищата чисти
Файлът .gitignore казва на Git кои файлове и шаблони да остави непроследени. Трябва да бъде комитнат в хранилището и внимателно поддържан.
# Dependencies
node_modules/
vendor/
# Build artifacts
dist/
build/
*.o
*.pyc
__pycache__/
# Environment and secrets — NEVER commit these
.env
.env.local
*.pem
*.key
config/secrets.yml
# IDE files
.idea/
.vscode/
*.swp
# OS files
.DS_Store
Thumbs.dbКритичен капан: Ако даден файл вече е бил проследяван преди добавянето му в .gitignore, Git ще продължи да го проследява. Трябва изрично да го премахнете от проследяването:
git rm --cached path/to/sensitive-file
git commit -m "chore: stop tracking secrets file"Никога не комитвайте идентификационни данни, API ключове или частни ключове в хранилище — дори частно. Използвайте променливи на средата, мениджъри на тайни (HashiCorp Vault, AWS Secrets Manager) или файлове .env, които са .gitignore.
Настройка на производителността за големи хранилища
Стандартният Git деградира при хранилища с милиони файлове или гигабайти двоични активи. Стратегии за смекчаване:
- Git LFS (Large File Storage): Замества големи двоични файлове с файлове с указатели в хранилището и съхранява действителното съдържание на отделен LFS сървър. От съществено значение за хранилища, съдържащи медия, тегла на ML модели или компилирани двоични файлове.
- Частично клониране:
git clone --filter=blob:noneизтегля комити и дървета, но извлича blob-ове при поискване. Драстично намалява размера на началното клониране за големи монорепозитории. - Sparse checkout:
git sparse-checkout set path/to/subdirизвлича само подмножество от работното дърво. Полезно в монорепозитории, където разработчикът работи само в директорията на една услуга. - Файл с граф на комитите:
git commit-graph write --reachableпредварително изчислява графа на комитите, ускорявайки операции катоgit log --graphи заявки за достижимост при голяма история. git maintenance start: Планира фонови задачи за поддръжка (пакетиране на свободни обекти, актуализации на графа на комитите, предварително извличане) за поддържане на бързи операции с хранилището с течение на времето.
Технически контролен списък с ключови изводи
Преди да считате настройката на Git за готова за производство, проверете всяко от следните:
- Конфигурирана самоличност:
user.nameиuser.emailзададени правилно при подходящия обхват на конфигурацията - Използвани SSH ключове: Удостоверяването с парола към отдалечени хранилища заменено с двойки SSH ключове или HTTPS, базиран на токени
.gitignoreкомитнат: Тайни, артефакти от изграждането и файлове на ОС изключени преди първия комит- Основният клон е наречен
main:init.defaultBranchзададен глобално, за да се избегне наследственото именуванеmaster - Съобщенията за комити следват конвенция: Конвенционални комити (
feat:,fix:,chore:) или формат, договорен от екипа, наложен чрез кукаcommit-msg git revertза публична история:git reset --hardизползван само при локални, неизпратени комити--force-with-leaseвместо--force: Предотвратява случайно презаписване на изпращанията на колеги- Анотирани тагове за издания:
git tag -aсъс съобщение, а не леки тагове - Куките споделени чрез
pre-commitилиhusky: Портите за качество наложени последователно в целия екип - Git LFS конфигуриран, ако хранилището съдържа двоични активи над 1 MB
- Голо хранилище на сървъра: Самостоятелно хостваните отдалечени хранилища инициализирани с
git init --bare - Редовен
git fetch --prune: Референциите за отдалечено проследяване поддържани синхронизирани с действителното отдалечено състояние
Често задавани въпроси
Каква е разликата между git fetch и git pull?
git fetch изтегля комити, клонове и тагове от отдалеченото хранилище в локалните референции за отдалечено проследяване (напр. origin/main), без да засяга работната директория или текущия клон. git pull е git fetch, последвано незабавно от git merge (или git rebase, ако е конфигурирано). Използвайте git fetch, когато искате да проверите промените нагоре по веригата преди интегрирането им.
Кога трябва да използвам git rebase вместо git merge?
Използвайте rebase за линеаризиране на локалния функционален клон преди отваряне на заявка за сливане, поддържайки историята на проекта четима. Никога не пребазирайте клон, върху който други разработчици вече са клонирали или базирали работа — презаписването на публикувани хешове на комити принуждава всички останали ръчно да съгласуват разклонените истории.
Как да премахна окончателно чувствителен файл, случайно комитнат?
Използвайте git filter-repo (съвременната замяна на git filter-branch): git filter-repo --path secrets.env --invert-paths. Това презаписва цялата история на хранилището, премахвайки файла от всеки комит. След презаписването, принудително изпратете всички клонове и тагове, след което незабавно сменете разкритите идентификационни данни — приемайте, че са компрометирани, независимо колко бързо действате.
Какво е отделено HEAD състояние и как да се възстановя от него?
Отделеното HEAD означава, че вашият указател HEAD препраща директно към конкретен хеш на комит, а не към име на клон. Всички комити, които правите, няма да принадлежат към никой клон и ще станат недостижими след превключване. За възстановяване: git switch -c new-branch-name за прикачване на комитите към нов клон, или git switch main за отхвърлянето им.
Как Git обработва двоичните файлове по различен начин от текстовите файлове?
Git съхранява двоичните файлове като непрозрачни blob-ове — не може да изчислява смислени разлики на ниво редове или да извършва автоматични сливания върху тях. Конфликтите в двоичните файлове трябва да се разрешават чрез избор на една версия изцяло. За хранилища със значителни двоични активи, конфигурирайте Git LFS за съхранение на двоичните файлове извън хранилището, поддържайки самото хранилище компактно и бързо.
