Hifadhi ya Git (repository): jinsi ya kuunda kwa git init na kuunganisha remote
Hifadhi ya Git (repository) ni folda ya mradi pamoja na folda iliyofichwa .git, ambapo Git inahifadhi historia yote ya mabadiliko, matawi na mipangilio. Inaundwa kwa amri git init ndani ya folda ya mradi, au inanakiliwa tayari kwa git clone. Hifadhi ya mbali inaunganishwa kwa amri git remote add origin anwani.
Hifadhi ya Git ni mradi ambao Git inafuatilia mabadiliko yake. Kimwili ni folda ya kawaida yenye faili zako pamoja na folda iliyofichwa .git, ambamo kuna historia yote: commits, matawi, tagi na mipangilio. Ukifuta .git, unabaki na faili tu bila toleo lolote la zamani.
Hifadhi ina sehemu gani
Unapofanya kazi na Git, ni vizuri kukumbuka maeneo matatu ambayo mabadiliko yanasafiri kati yake:
- saraka ya kazi (working tree) — faili unazoziona na kuzihariri;
- index (staging area) — rasimu ya commit inayofuata, ambapo mabadiliko yanaingia kupitia
git add; - historia — hifadhidata ya commits ndani ya
.git, ambapo mabadiliko yanaingia kupitiagit commit.
Kwa kweli hifadhi yenyewe ni yaliyomo ya .git. Saraka ya kazi ni nakala moja «iliyotolewa» ya mradi, ambayo Git inaichukua kutoka historia.
Jinsi ya kuunda hifadhi ya Git kwa git init
Ingia kwenye folda ya mradi na tekeleza amri moja:
cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/
Hifadhi inaweza kuundwa kwenye folda tupu, na pia kwenye folda ambayo tayari ina faili. Katika hali ya pili hakuna kinachopotea: faili zilizopo zinakuwa zisizofuatiliwa (untracked) hadi uziongeze kwa git add.
Chaguo muhimu za amri:
# Unda folda na hifadhi ndani yake mara moja
git init my-app
# Weka jina la tawi la kwanza (vinginevyo ni master au thamani ya mipangilio)
git init -b main
# Fanya main kuwa tawi la chaguo-msingi kwa hifadhi zote mpya
git config --global init.defaultBranch main
Commit ya kwanza
Hifadhi tupu bila commits karibu haina maana. Mara baada ya git init kwa kawaida hufanya hivi:
git config --global user.name "Ivan Petrov"
git config --global user.email "ivan@example.com"
git status
git add .
git commit -m "Muundo wa awali wa mradi"
Jina na barua pepe vinawekwa mara moja tu kwenye kompyuta — zinaandikwa kwenye kila commit. Bila hivyo Git itakataa kufanya commit na itaomba utambulishe jina lako.
Ongeza .gitignore mapema
Kabla ya git add . ya kwanza, unda faili .gitignore lenye orodha ya vitu ambavyo haviwezi kuingia kwenye hifadhi: utegemezi, ujenzi, siri, mafaili ya IDE.
node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/
Ikiwa faili tayari liliingia kwenye commit, .gitignore haitaliondoa. Unahitaji kuacha kulifuatilia huku ukiliacha kwenye diski: git rm --cached .env, kisha uweke commit.
Kilichomo ndani ya folda .git
Katika kazi ya kila siku si lazima kuingia humo, lakini kuelewa muundo wake kunaondoa maswali mengi:
| Kipengele | Kinachohifadhi |
|---|---|
objects/ | Vitu vilivyobanwa: yaliyomo ya faili (blob), miundo ya folda (tree), commits |
refs/heads/ | Matawi — faili zenye hash ya commit ya mwisho |
refs/tags/ | Tagi |
HEAD | Kielekezi cha tawi la sasa, kwa mfano ref: refs/heads/main |
config | Mipangilio ya hifadhi hii, pamoja na orodha ya remote |
index | Hali ya staging area |
hooks/ | Scripts zinazoendeshwa wakati wa matukio (pre-commit, pre-push) |
Hitimisho muhimu kutoka hapa: tawi katika Git ni faili dogo lenye hash moja. Ndiyo maana kuunda matawi ni papo hapo na bila gharama.
Jinsi ya kuhakiki kwamba folda ni hifadhi
git status
# au kwa uhakika zaidi
git rev-parse --is-inside-work-tree
Nje ya hifadhi utapata fatal: not a git repository (or any of the parent directories): .git. Zingatia «parent directories»: Git inatafuta .git juu kwenye mti wa folda. Ukitekeleza git init kwa bahati kwenye folda yako ya nyumbani, folda nzima itakuwa hifadhi — basi folda hiyo ya .git inapaswa kufutwa.
Hifadhi ya ndani na ya mbali
Hifadhi iliyoundwa kwa git init ipo kwenye kompyuta yako tu. Ili kushiriki msimbo na kuwa na nakala ya akiba, unaiunganisha na hifadhi ya mbali (remote) — nakala kwenye seva: GitHub, GitLab, Bitbucket au seva yako mwenyewe ya git.
Hifadhi ya mbali si «kuu» kwa mtazamo wa Git: kila nakala ni kamili na ina historia yote. Kuwa kuu ni makubaliano ya timu tu.
git remote: kuunganisha hifadhi ya mbali
Remote ni jina fupi la anwani ya seva. Jina kuu kwa makubaliano ni origin.
# Ongeza remote
git remote add origin git@github.com:username/my-app.git
# Orodhesha remote pamoja na anwani
git remote -v
origin git@github.com:username/my-app.git (fetch)
origin git@github.com:username/my-app.git (push)
Kisha tuma tawi na uunganishe na la mbali:
git push -u origin main
Amri kuu za git remote
| Amri | Inafanya nini |
|---|---|
git remote -v | Orodha ya remote pamoja na anwani |
git remote add <jina> <url> | Kuunganisha hifadhi mpya ya mbali |
git remote set-url origin <url> | Kubadili anwani, kwa mfano kutoka HTTPS kwenda SSH |
git remote rename origin old | Kubadili jina la remote |
git remote remove old | Kuondoa remote (seva yenyewe haiguswi) |
git remote show origin | Maelezo ya kina: matawi, ufuatiliaji, kinachobaki nyuma |
Miundo ya anwani
https://github.com/user/repo.git— HTTPS, inafanya kazi kila mahali, kwa kuandika unahitaji token;git@github.com:user/repo.git— SSH, inahitaji ufunguo, baada ya usanidi nywila hazidaiwi;/srv/git/repo.gitaufile:///srv/git/repo.git— njia ya ndani, inafaa kwa majaribio.
Makosa ya kawaida
«error: remote origin already exists». Remote yenye jina hilo tayari ipo. Ukitaka kubadili anwani, tumia git remote set-url origin <url>, si add tena.
«failed to push some refs» / «Updates were rejected». Seva ina commits ambazo huna — mara nyingi ni README iliyoundwa wakati hifadhi ilipoanzishwa kwenye tovuti. Tekeleza git pull --rebase origin main kisha rudia push. Ikiwa historia hazina uhusiano kabisa, Git itajibu «refusing to merge unrelated histories» — basi git pull inahitaji bendera --allow-unrelated-histories. Ni rahisi zaidi kuunda hifadhi kwenye tovuti ikiwa tupu.
«src refspec main does not match any». Unajaribu kutuma tawi lisilokuwepo: ama bado hakuna commit hata moja, au tawi linaitwa master. Hakiki kwa git branch.
Seva yako ya git: hifadhi tupu (bare)
GitHub si lazima. Hifadhi ya mbali inaweza kuwa kompyuta yoyote ambayo una ufikiaji wa SSH kwake. Kwenye seva hiyo unaunda hifadhi «tupu» (bare) — bila saraka ya kazi, yenye yaliyomo ya .git tu:
# Kwenye seva
ssh user@server
git init --bare /srv/git/my-app.git
# Kwenye kompyuta yako
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main
Ili kufanya kazi na seva kama hii pamoja na wenzako watatu, inatosha kuwapa ufikiaji wa SSH kwenye folda ya hifadhi, na kikundi cha pamoja chenye haki za kuandika. Kwa kugawa haki kwa matawi na miradi tofauti hii haitoshi tena — hapo unahitaji jukwaa kamili la git.
Kwenye hifadhi tupu huwezi «kuingia na kurekebisha faili». Imeundwa kwa ajili ya kubadilishana kupitia push na fetch tu. Ndivyo zinavyofanya kazi hifadhi za jukwaa lolote la git. Kwa kiolesura cha wavuti, ukaguzi na kazi, zinawekwa suluhisho zinazojiendesha kama GitLab, Gitea au Forgejo.
Matawi ya mbali yanayofuatiliwa: hifadhi ya ndani inaonaje seva
Baada ya kuunganisha remote na git fetch au git push ya kwanza, kwenye hifadhi yako zinaonekana matawi ya mbali kama origin/main. Hayo si matawi kwenye seva, bali «picha» za ndani za kile ulichokiona kwenye seva wakati wa usawazishaji wa mwisho. Yanasasishwa tu kwa fetch, pull na push.
Kutokana na hilo, tofauti kati ya amri tatu za mawasiliano:
| Amri | Inabadilisha nini |
|---|---|
git fetch | Inasasisha origin/*, matawi yako na faili haziguswi |
git pull | fetch + kuunganisha origin/main kwenye tawi la sasa |
git push | Inatuma commits zako na kusasisha tawi kwenye seva |
Kujua tawi lako limebaki nyuma kiasi gani au limetangulia kiasi gani:
git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]
Hapa una commits mbili ambazo hazipo kwenye seva, na commit moja ya seva ambayo huna. Kabla ya push ni lazima kwanza kuvuta ile ya seva.
Kuunganisha tawi la ndani na la mbali (upstream) kunawekwa na bendera -u wakati wa push ya kwanza. Ikiwa umeisahau, unaweza kuiweka kando: git branch --set-upstream-to=origin/main. Kuona miunganisho yote — git branch -vv.
Hifadhi nyingi: monorepo au moja kwa kila mradi
Swali la kawaida kwa wanaoanza ni hifadhi ngapi za Git za kuunda. Kanuni rahisi: hifadhi moja kwa kitengo kimoja kinachoendelezwa na kutolewa kwa kujitegemea. Miradi ya kujifunzia, miradi binafsi na huduma tofauti ni hifadhi tofauti. Usiunde hifadhi moja kwa folda nzima ya «Miradi Yangu»: historia itachanganyika, na kuweka mradi mmoja kwenye portfolio itakuwa ngumu.
Kampuni kubwa wakati mwingine huweka msimbo wote kwenye monorepo moja kwa ajili ya mabadiliko ya pamoja na ujenzi mmoja, lakini hiyo ni uamuzi wa usanifu wenye zana zake. Wanaoanza wanapaswa kuanza na kanuni ya «mradi mmoja — hifadhi moja», na wasiweke hifadhi ndani ya hifadhi nyingine bila submodules.
git init au git clone
| Hali | Amri |
|---|---|
| Kuanza mradi mpya kutoka mwanzo | git init |
| Kuna folda yenye msimbo bila udhibiti wa matoleo | git init ndani ya folda hiyo |
| Mradi tayari uko GitHub au kwenye seva | git clone <url> |
| Unahitaji hifadhi kuu kwenye seva yako | git init --bare |
Baada ya git clone, remote origin tayari imeshasanidiwa; si lazima kuiongeza kwa mkono.
Hatua kwa hatua: kutoka folda hadi hifadhi kwenye GitHub
- Unda folda ya mradi na tekeleza
git init -b main. - Ongeza
.gitignorena README. - Fanya commit ya kwanza:
git add .nagit commit -m "Initial commit". - Unda kwenye GitHub hifadhi tupu — bila README, leseni wala .gitignore.
- Iunganishe:
git remote add origin <anwani>. - Tuma msimbo:
git push -u origin main. - Endelea kwa mzunguko: mabadiliko →
git add→git commit→git push.
Muhtasari
Hifadhi ya Git ni mradi wako pamoja na folda ya .git yenye historia kamili. Inaundwa kwa git init, na muunganisho na seva unawekwa kwa git remote add origin na push ya kwanza kwa git push -u. Hifadhi ya mbali inaweza kuwa GitHub, GitLab au seva yako mwenyewe yenye hifadhi tupu. Kuunda hifadhi ya kwanza, index na kuunganisha remote vinafanyiwa mazoezi ya vitendo katika kozi ya Git.
Maswali ya mara kwa mara
Nawezaje kufuta hifadhi ya Git lakini kubakiza faili?
Futa folda iliyofichwa .git kwenye mzizi wa mradi: rm -rf .git kwenye Linux na macOS. Faili zitabaki, lakini historia yote ya matoleo itapotea.
Je, ni salama kutekeleza git init kwenye folda ambayo tayari ina hifadhi?
Ndiyo. Git itaonyesha Reinitialized existing Git repository na haitagusa historia. Amri inaongeza tu faili za huduma ambazo hazipo.
Hifadhi moja inaweza kuwa na remote ngapi?
Nyingi upendavyo. Kwa mfano origin kwa fork yako na upstream kwa mradi wa asili — ndivyo mara nyingi wanavyofanya kazi kwenye chanzo huria.
Mipangilio ya hifadhi mahususi iko wapi?
Kwenye faili la .git/config. Mipangilio ya jumla ya mtumiaji iko kwenye ~/.gitconfig, na inawekwa kwa git config --global.
Hifadhi tupu (bare) inatofautianaje na ya kawaida?
Hifadhi tupu haina saraka ya kazi yenye faili, ina data ya huduma ya Git pekee. Inatumika kama hifadhi kuu kwenye seva ambako push inafanyika.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.
- Hazina ya Kwanza: init, add, commit na uchawi wa faharasa
- GitHub na Hifadhi za Mbali: Msimbo Wako Hewani