git add na git commit: jinsi ya kuhifadhi mabadiliko kwa usahihi
Kuhifadhi mabadiliko katika Git kunafanyika hatua mbili: git add huweka mabadiliko unayotaka kwenye index (staging area), kisha git commit -m "ujumbe" huyaandika kwenye historia kama picha moja. git status inaonyesha kilichobadilika na kilichoandaliwa tayari. Commit ya mwisho inarekebishwa kwa git commit --amend.
Katika Git hakuna kitufe cha «hifadhi». Mabadiliko yanarekodiwa kwa hatua mbili: kwanza git add huchagua mabadiliko yatakayoingia kwenye picha inayofuata, kisha git commit huandika picha hiyo kwenye historia. Eneo la kati kati ya hatua hizo linaitwa index, au staging area. Wengi hawaelewi kwa miaka mingi — na ndilo linalofanya commits ziwe na maana.
Hali tatu za faili: saraka ya kazi, index, historia
Kila mabadiliko hupitia maeneo matatu:
- Saraka ya kazi — unahariri faili kwenye kihariri.
- Index (stage) —
git addhuweka toleo la sasa la faili kwenye rasimu ya commit inayofuata. - Historia —
git commithubadilisha yaliyomo ya index kuwa commit yenye mwandishi, tarehe na ujumbe.
Mfano mzuri ni kifurushi cha posta. Saraka ya kazi ni chumba chenye vitu, index ni boksi wazi ambapo unaweka unachotaka kutuma, na commit ni kifurushi kilichofungwa na kusainiwa. Wewe mwenyewe unaamua nini kiingie kwenye boksi, na si lazima utume kila kitu mara moja.
Kwa nini index inahitajika
Fikiria: ndani ya saa moja umerekebisha hitilafu ya uthibitishaji, pia umesahihisha kosa la kuandika kwenye README, na umeanza kazi mpya. Bila index, haya yote yangeingia kwenye commit moja ya «mambo mbalimbali». Kwa index unatengeneza commits tatu tofauti, kila moja ikiwa rahisi kuelewa, kukagua kwenye ukaguzi, na kurudisha nyuma ikihitajika, bila kugusa mengine.
git status: kilichobadilika na kilichoandaliwa
Kabla ya kila add na commit ni vizuri kuangalia git status. Ndiyo amri salama zaidi ya Git — haibadilishi chochote.
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/auth.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/profile.js
- Changes to be committed — tayari kwenye index, zitaingia kwenye commit;
- Changes not staged — zimebadilishwa lakini hazijaongezwa;
- Untracked files — faili mpya ambazo Git bado haijazijua.
Muundo mfupi ni rahisi zaidi faili zikiwa nyingi:
$ git status -s
M src/auth.js
M README.md
?? src/profile.js
Safu ya kwanza ni hali kwenye index, ya pili ni hali kwenye saraka ya kazi. M upande wa kushoto maana yake «imebadilishwa na imeongezwa», upande wa kulia «imebadilishwa, haijaongezwa», ?? ni faili isiyofuatiliwa.
git add: jinsi ya kuongeza mabadiliko kwenye index
| Amri | Inaongeza nini |
|---|---|
git add file.js | Faili maalum |
git add src/ | Kila kilichobadilika kwenye folda |
git add . | Mabadiliko yote kwenye folda ya sasa na ndani yake, pamoja na faili mpya na zilizofutwa |
git add -A | Mabadiliko yote kwenye hifadhi nzima |
git add -u | Faili zinazofuatiliwa tu, mpya haziguswi |
git add -p | Kwa mwingiliano, kwa sehemu (hunks) |
git add '*.css' | Faili kwa mfano (pattern) |
Kisawe cha git add ni git stage: ni amri ile ile, ndiyo maana neno «stage», «kuweka kwenye stage» linatumika.
git add -p: ongeza sehemu ya faili
Mbinu inayothaminiwa kidogo sana. Ikiwa faili moja ina marekebisho mawili tofauti yaliyochanganyika, git add -p itaonyesha kila sehemu na kuuliza kama uiongeze:
$ git add -p src/auth.js
@@ -12,7 +12,7 @@ function login(user) {
- if (user.password = input) {
+ if (user.password === input) {
(1/2) Stage this hunk [y,n,q,a,d,s,e,?]?
y — ongeza, n — ruka, s — gawanya sehemu kuwa ndogo zaidi, q — toka. Kwa njia hii faili moja inageuka kuwa commits mbili safi.
Jinsi ya kukagua kilichoingia kwenye commit
git diff # mabadiliko ambayo BADO hayajaingia kwenye index
git diff --staged # kilichopo kwenye index na kitaingia kwenye commit
Mkanganyiko wa kawaida: baada ya git add, git diff ya kawaida haionyeshi chochote. Hiyo haimaanishi mabadiliko yamepotea — yako kwenye index. Tazama git diff --staged (kisawe chake ni --cached).
Jinsi ya kutoa faili kwenye index
git restore --staged file.js
Mabadiliko ndani ya faili yanabaki, faili inaacha tu kuwa tayari kwa commit. Katika matoleo ya zamani ya Git ilitumika git reset HEAD file.js — bado inafanya kazi.
git commit: kurekodi mabadiliko
git commit -m "Rekebisha ukaguzi wa nenosiri wakati wa kuingia"
[main 3f2a9c1] Rekebisha ukaguzi wa nenosiri wakati wa kuingia
1 file changed, 1 insertion(+), 1 deletion(-)
Jibu lina tawi, hash fupi ya commit mpya na takwimu. Kwenye commit huingia tu yaliyomo ya index. Ukirekebisha faili tena baada ya git add, mabadiliko mapya hayataingia mpaka uyaongeze tena.
Bendera muhimu za git commit
| Amri | Inafanya nini |
|---|---|
git commit | Inafungua kihariri kwa ujumbe wa mistari mingi |
git commit -m "..." | Ujumbe moja kwa moja kwenye amri |
git commit -am "..." | Inaongeza faili zote zilizobadilishwa zinazofuatiliwa na kuzi-commit; faili mpya hazitaingia |
git commit -v | Inaonyesha diff kwenye kihariri unapoandika ujumbe |
git commit --amend | Inaandika upya commit ya mwisho |
git commit --allow-empty -m "..." | Commit tupu, kwa mfano kuanzisha upya CI |
Ikiwa kihariri chako cha msingi ni Vim na umekwama ndani yake: andika ujumbe, bonyeza Esc, kisha andika :wq na Enter. Kubadilisha kihariri: git config --global core.editor "code --wait" au nano.
Jinsi ya kuandika ujumbe mzuri wa commit
Ujumbe husomwa baada ya miezi sita, unapotafuta chanzo cha hitilafu. Unapaswa kujibu «nini na kwa nini», si «nilifanya nini leo».
- mstari wa kwanza — herufi 50–72 kiwango cha juu, kiini cha mabadiliko;
- katika nafsi ya amri au kwa upande wowote: «Ongeza uthibitishaji wa barua pepe», «Fix login redirect»;
- inapohitajika — mstari tupu na maelezo: kwa nini hivyo, vikwazo vipi vipo;
- commit moja — mabadiliko moja ya kimantiki.
Vibaya: fix, marekebisho, wip, asdf. Vizuri: Rekebisha kuanguka kwa kikapu kikiwa orodha tupu ya bidhaa. Timu nyingi hutumia muundo wa Conventional Commits: feat: ..., fix: ..., docs: ....
git commit --amend: jinsi ya kurekebisha commit ya mwisho
Kosa la kuandika kwenye ujumbe au kusahau kuongeza faili — hauhitaji commit mpya ya «nimesahau faili». Kwa hilo kuna amend.
Kurekebisha ujumbe
git commit --amend -m "Rekebisha ukaguzi wa nenosiri wakati wa kuingia"
Kuongeza faili uliyosahau
git add forgotten.js
git commit --amend --no-edit
Bendera --no-edit inabakiza ujumbe wa awali.
Mambo muhimu kuhusu amend
--amend haihariri commit, bali inaunda mpya yenye hash tofauti na kuchukua nafasi ya ile ya zamani. Mradi commit iko kwako tu, hii ni salama. Ukishafanya git push, baada ya amend push ya kawaida itakataliwa, na utahitaji git push --force-with-lease. Kwenye matawi ya pamoja ambapo wengine wanafanya kazi, hili halipaswi kufanywa: utaandika upya historia ambayo wenzako tayari wanaijengea kazi yao.
Ikiwa amend ilifanywa kimakosa, commit ya zamani unaweza kuipata kwenye git reflog na kurudi kwake kwa git reset --soft HEAD@{1}.
Makosa ya kawaida
«nothing to commit, working tree clean»
Hakuna mabadiliko — kila kitu tayari kimecommit, au unahariri faili kwenye folda nyingine. Angalia git status na njia ya mradi.
«no changes added to commit»
Faili zimebadilishwa lakini hazijaongezwa kwenye index. Tekeleza git add, au tumia git commit -am kwa faili zinazofuatiliwa.
«Please tell me who you are»
Jina na barua pepe hazijawekwa. Tekeleza mara moja git config --global user.name "Jina" na git config --global user.email "barua pepe".
Ulicommit kitu cha ziada
Ikiwa commit bado haijatumwa, ifute huku ukihifadhi mabadiliko kwenye index: git reset --soft HEAD~1. Kisha ondoa kilichozidi kwa git restore --staged na ucommit tena. Ikiwa siri (secret) iliingia kwenye commit, chukulia kuwa imevuja na ibadilishe.
git add . imeongeza takataka
Weka .gitignore mapema na kabla ya commit angalia git status. Faili inayofuatiliwa tayari inaacha kufuatiliwa tu baada ya git rm --cached faili.
Commit ni nini hasa
Commit haihifadhi tofauti na toleo lililopita, bali picha ya mradi mzima: kiungo cha mti wa faili, kiungo cha commit ya mzazi, mwandishi, tarehe na ujumbe. Faili ambazo hazijabadilika hazinakiliwi — Git inaelekeza kwenye vitu vilivyohifadhiwa tayari, ndiyo maana historia inachukua nafasi kidogo.
Hash ya commit (kwa mfano 3f2a9c1) inahesabiwa kutoka kwa yaliyomo yote haya. Ukibadilisha hata herufi moja kwenye ujumbe, utapata hash tofauti. Ndiyo sababu --amend na rebase huunda commits mpya badala ya kuhariri za zamani, na ndiyo sababu historia iliyoandikwa upya inagongana na nakala za wenzako.
Kuona historia kwa ufupi:
git log --oneline --graph -10
Kila mstari ni commit; ikiwa ujumbe katika historia yako unaeleweka bila kufungua diff, unafanya kila kitu sawa.
Mzunguko wa kazi wa kila siku
git status # kilichobadilika
git diff # tazama mabadiliko
git add -p # chagua kinachohitajika
git diff --staged # hakiki kitakachoingia kwenye commit
git commit -m "Maelezo yaliyo wazi"
git log --oneline -5 # hakikisha commit ipo
git push # tuma kwenye seva
Commit huhifadhi mabadiliko kwenye kompyuta yako pekee. Ili yafike GitHub au seva nyingine, unahitaji git push.
Muhtasari
git add hukusanya picha inayofuata kwenye index, git status na git diff --staged zinaonyesha kitakachoingia humo, na git commit huandika picha kwenye historia. Fanya commits ndogo zenye mantiki na ujumbe wazi, na kwa marekebisho madogo ya commit ya mwisho tumia git commit --amend — kabla ya push. Index na mpangilio wa hatua mbili add → commit unafafanuliwa kwa vitendo katika kozi ya Git.
Maswali ya mara kwa mara
Commits zifanywe mara ngapi?
Kila wakati mabadiliko moja ya kimantiki yamekamilika na mradi uko katika hali ya kufanya kazi. Ni bora commits nyingi ndogo kuliko moja kubwa mwishoni mwa siku.
Je, kuna amri ya git save?
Hapana, hakuna amri kama hiyo. Kuhifadhi ni git add na git commit, na kuweka kando kazi isiyokamilika kwa muda unaweza kutumia git stash.
Nawezaje kuona kilichokuwa ndani ya commit?
Amri git show hash itaonyesha mwandishi, ujumbe na mabadiliko yote ya commit. Bila hash, itaonyesha commit ya mwisho.
git add . inatofautianaje na git add -A?
Katika matoleo ya kisasa ya Git zote mbili huongeza faili mpya, zilizobadilishwa na zilizofutwa. Tofauti ni upeo: git add . hufanya kazi na folda ya sasa na zilizo ndani yake, git add -A na hifadhi nzima.
Je, inawezekana kubadilisha commit ya zamani, si ya mwisho?
Ndiyo, kwa rebase shirikishi: git rebase -i hash-ya-mzazi, kisha weka alama ya commit husika kama edit au reword. Fanya hivyo tu kwa commits ambazo bado hazijatumwa kwenye tawi la pamoja.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.
Nenda kwenye kozi