15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
14.10.2024

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 info

git 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 only

git 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 created

git 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 stash

git 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 commits

Cherry-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 за съхранение на двоичните файлове извън хранилището, поддържайки самото хранилище компактно и бързо.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало