ഗിറ്റ് #2 - സ്റ്റേജിങ്ങ്, കമ്മിറ്റിങ്ങ്

ബാലശങ്കർ സി under പരമ്പര on 11 ജനുവരി, 2015

ഒരു ഫയലിന്റെ വിവിധ അവസ്ഥകളെ പറ്റിയാണല്ലോ കഴിഞ്ഞ ലക്കത്തിൽ പ്രതിപാദിച്ചത്. അവയെ പറ്റി വിശദമാക്കാം. ഉദാഹരണത്തിനു് നമുക്കൊരു ഫയൽ നമ്മുടെ വർക്കിങ്ങ് ഡയറക്ടറിയിൽ നിർമ്മിച്ച് നോക്കാം. ഏതെങ്കിലും ടെക്സ്റ്റ് എഡിറ്റർ ഉപയോഗിച്ച് ഒരു ഫയൽ നിർമ്മിച്ച് നമ്മുടെ വർക്കിങ്ങ് ഡയറക്ടറിയിൽ പോയി സംരക്ഷിക്കുക. ഞാൻ വിം എഡിറ്റർ ആണു് താൽപര്യപ്പെടുന്നതു്.

 $ vim hello.c

hello.c എന്ന ഫയലിൽ ഞാൻ താഴെ കൊടുത്ത ഉള്ളടക്കം സൂക്ഷിച്ചു എന്ന് കരുതുക

int main()
{
    a = 5;
    printf("Hello World\n");
    return 0;
}

ഇപ്പോൾ ഈ ഫയൽ നമ്മുടെ വർക്കിങ്ങ് ഡയറക്ടറിയിൽ ഉണ്ട്. നമ്മുടെ റെപ്പോയുടെ നിലവിലെ അവസ്ഥ കാണാനായി git status എന്ന ആജ്ഞ കൊടുത്താൽ മതിയാകും

  $ git status

ആ ആജ്ഞയുടെ ഉത്തരം താഴെ പറയുന്നതിനു് സമാനമായിരിക്കും

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	hello.c

nothing added to commit but untracked files present (use "git add" to track)

ഇതു് വായിക്കുമ്പോൾ നമുക്ക് മനസ്സിലാകും hello.c എന്ന ഫയലിന്റെ അവസ്ഥ Untracked ആണെന്നും അതിനാൽ തന്നെ അതിൽ ഉണ്ടാവുന്ന മാറ്റങ്ങൾ ഗിറ്റ് നിരീക്ഷിക്കുന്നില്ല എന്നും.

ഒരു ഫയലിനെ നിരീക്ഷിക്കുന്നതിനായി, അഥവാ അതിനെ കമ്മിറ്റ് ചെയ്യുന്നതിനായി ആദ്യം അതിനെ സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തിക്കണം (അതായത്, ഫയലിനെ എടുത്ത് നമ്മുടെ പൊതിയിലേക്ക് ചേർക്കണം). അതിനായി git add <filename> എന്ന ആജ്ഞ ഉപയോഗിക്കാം. ഇവിടെ <filename> എന്ന സ്ഥാനത്ത് നമ്മൾ ഉദ്ദേശിക്കുന്ന ഫയലിന്റെ പേരു് നൽകുക

$ git add hello.c

ഇനി git status കൊടുത്താൽ ഇങ്ങനെ കാണാം

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   hello.c

ഇപ്പോൾ നമ്മുടെ hello.c എന്ന ഫയൽ സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തിയിരിക്കുന്നു. ഇനി എന്തെങ്കിലും കാരണത്താൽ നമുക്ക് ആ ഫയലിനെ സ്റ്റേജിങ്ങ് ഏരിയയിൽ നിന്നും നീക്കം ചെയ്യണമെങ്കിൽ git reset <filename> എന്ന ആജ്ഞ ഉപയോഗിച്ചാൽ മതിയാവും. ഒന്നിൽ കൂടുതൽ ഫയലുകളെ സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തിക്കണമെങ്കിൽ

$ git add file1 file2 

എന്നിങ്ങനെ നൽകിയാൽ മതിയാവും. ഇനി എല്ലാ ഫയലുകളേയും എത്തിക്കണമെങ്കിൽ

$ git add . 

എന്ന് നൽകണം (മുകളിലത്തെ ആജ്ഞയുടെ അവസാനം ഉള്ള കുത്ത് മറക്കരുതു്. ആ കുത്ത് “എല്ലാ ഫയലുകളും” എന്നതിനെ സൂചിപ്പിക്കുന്നു)

അടുത്തതായി നമുക്ക് നമ്മുടെ റെപ്പോയുടെ ഈ അവസ്ഥയെ (അതിനെയാണ് സ്നാപ്ഷോട്ട് എന്ന് വിളിക്കുന്നതു്) നമുക്ക് സൂക്ഷിക്കണം, അഥവാ കമ്മിറ്റ് ചെയ്യണം (അതായത് ഇപ്പോൾ മേശപ്പുറത്തിരിക്കുന്ന പൊതിയെ എടുത്ത് താഴത്തെ പെട്ടിയിലേക്കിടണം).

അതിനായി git commit എന്ന ആജ്ഞ ഉപയോഗിക്കാം. ഏതൊരു ഗിറ്റ് കമ്മിറ്റും ഒരു സന്ദേശം, അഥവാ കമ്മിറ്റ് മെസ്സേജ് ഉൾക്കൊള്ളണം. ആ കമ്മിറ്റ് എന്ത് ചെയ്യുന്നു എന്നതിനെപ്പറ്റിയുള്ള ഒരു ചെറുകുറിപ്പാണ് കമ്മിറ്റ് മെസ്സേജ്. git commit എന്ന ആജ്ഞ കൊടുക്കുമ്പോൾ ഈ സന്ദേശം ടൈപ്പ് ചെയ്യാനായി ഒരു ടെക്സ്റ്റ് എഡിറ്റർ തുറന്നുവരും. നമുക്കു വേണമെങ്കിൽ നമ്മുടെ ആജ്ഞയുടെ കൂടെ തന്നെ ഈ സന്ദേശം നൽകാവുന്നതാണു്. അതിനായി താഴെ പറയുന്ന ആജ്ഞ ഉപയോഗിക്കാം

$ git commit -m "Add hello.c"
[master (root-commit) 20bf47a] Add hello.c
 1 file changed, 6 insertions(+)
 create mode 100644 hello.c

ഇവിടെ -m എന്നതു് കൊണ്ട് പുറകേ ഒരു കമ്മിറ്റ് സന്ദേശം വരുന്നുണ്ട് എന്ന് നമ്മൾ അറിയിക്കുകയാണു്. കമ്മിറ്റ് ചെയ്തതിനു് ശേഷം git status കൊടുത്ത് നോക്കുക

 On branch master
nothing to commit, working directory clean

ചില സന്ദർഭങ്ങളിൽ നമുക്ക് ചില ഫയലുകൾ ഒരിക്കലും ഗിറ്റ് റെപ്പോയിൽ എത്തരുത് എന്ന് നിർബന്ധം ഉണ്ടാകും. ഉദാഹരണത്തിനു് സി പ്രോഗ്രാം കമ്പൈൽ ചെയ്ത് കഴിയുമ്പോൾ കിട്ടുന്ന .out ഫയലുകൾ, ടെക്സ്റ്റ് എഡിറ്ററുകൾ റിക്കവറി നടത്താനായി ഉപയോഗിക്കുന്ന .swp ഫയലുകൾ എന്നിങ്ങനെ. ഇത്തരം ഒഴിവാക്കലുകളെ നമ്മൾ .gitignore എന്ന ഒരു ഫയലിൽ സൂക്ഷിക്കണം. ഉദാഹരണത്തിനു്, .out ഫയലുകൾ ഒരിക്കലും സൂക്ഷിക്കണ്ട എന്നുണ്ടെങ്കിൽ, നമ്മുടെ വർക്കിങ്ങ് ഡയറക്ടറിയിൽ .gitignore എന്നൊരു ഫയൽ ഉണ്ടാക്കി അതിൽ താഴെ കൊടുത്തിരിക്കുന്ന ഉള്ളടക്കം കൊടുക്കുക

 *.out

ഇനി നമ്മൾ നേരത്തെ എഴുതിയ സി പ്രോഗ്രാം ഒന്ന് കമ്പൈൽ ചെയ്യുകയോ, അല്ലെങ്കിൽ .out വച്ച് അവസാനിക്കുന്ന പേരുള്ള ഒരു ഫയൽ നിർമ്മിക്കുകയോ ചെയ്യുക. എന്നിട്ട് git status എന്ന ആജ്ഞ കൊടുത്തു നോക്കിയാൽ താഴെ പറയുന്ന ഉത്തരം കിട്ടും

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.gitignore

nothing added to commit but untracked files present (use "git add" to track)

അതിനർഥം, നമ്മുടെ അറയിലുള്ള .out വച്ച് അവസാനിക്കുന്ന ഫയൽ (അല്ലെങ്കിൽ ഫയലുകൾ) ഗിറ്റ് ഇനി മേലാൽ നിരീക്ഷിക്കില്ല. അവ, സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തുകയോ, കമ്മിറ്റുകളിൽ ഉൾപ്പെടുകയോ ഇല്ല. .gitignore ഫയൽ കൂടി സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തിച്ച് കമ്മിറ്റ് ചെയ്യുക.

ഇപ്പോൾ, ഒരു ഫയൽ Untracked, staged എന്നീ അവസ്ഥകളിൽ എത്തുന്നത് എങ്ങനെ എന്ന് നമ്മൾ കണ്ടു. ഇനി അവ എങ്ങനെ modified അവസ്ഥയിൽ എത്തുന്നു എന്ന് നോക്കാം. നമ്മുടെ വർക്കിങ്ങ് ഡയറക്ടറി ശൂന്യമാണ് എന്ന് git status കൊടുത്ത് ഉറപ്പു വരുത്തുക. ഇനി, നമ്മുടെ hello.c ഫയലിൽ എന്തെങ്കിലും മാറ്റം വരുത്തി നോക്കുക. ഉദാഹരണത്തിനു്, അതിൽ അഞ്ചാമത്തെ വരിയായി താഴെ പറയുന്നത് കൊടുക്കുക

 printf("Today is a beautiful day\n");

ഇപ്പോൾ, ഫയലിന്റെ ഉള്ളടക്കം ഇപ്രകാരം ആയിട്ടുണ്ടാകും

#include <stdio.h>
int main()
{
    printf("Hello World\n");
    printf("Today is a beautiful day\n");
    return 0;
}

ഇനി ഒന്നുകൂടെ git status അടിച്ചു നോക്കിയാൽ, താഴെ കാണുന്നതു പോലെയുള്ള ഉത്തരം ലഭിക്കും

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   hello.c

ഇതിൽ നിന്നും hello.c എന്ന ഫയൽ പുതുക്കപ്പെട്ടിട്ടുണ്ട് എന്ന് മനസ്സിലാക്കം. ആ ഫയലിനെ സ്റ്റേജിങ്ങ് ഏരിയയിൽ എത്തിച്ച് കമ്മിറ്റ് ചെയ്യിക്കുക. ശേഷം git status അടിച്ചാൽ, വർക്കിങ്ങ് ഡയറക്ടറി ശൂന്യമാണ് എന്ന് കാണാം (മേശപ്പുറത്ത് ഇപ്പോ ഒന്നുമില്ല).

ഇതു വരെയുള്ള നമ്മുടെ കമ്മിറ്റുകളുടെ പട്ടിക കാണാനായി git log എന്ന ആജ്ഞ ഉപയോഗിക്കാം.

$ git log
commit bfbbb30a158279c143ce9050184a51def9328c33
Author: Gopalan Kutty <gopalankutty@example.com>
Date:   Fri Dec 26 17:48:46 2014 +0530

    Modify hello.c

commit aec77a751434705e69bd3d95eafb994491037e2c
Author: Gopalan Kutty <gopalankutty@example.com>
Date:   Fri Dec 26 17:48:37 2014 +0530

    Add gitignore

commit 20bf47a729d40cb3f17a4caf1d11c4fa972c5b43
Author: Gopalan Kutty <gopalankutty@example.com>
Date:   Fri Dec 26 17:26:45 2014 +0530

    Add hello.c

ഇപ്പോൾ നമ്മൾ ചെയ്ത മൂന്ന് കമ്മിറ്റുകളും ഈ പട്ടികയിൽ കാണാം. ഓരോന്നിന്റെയും ആദ്യത്തെ വരിയിൽ കാണുന്ന വലിയ വാക്കുകൾ, ആ കമ്മിറ്റിനെ സൂചിപ്പിക്കാൻ ഉപയോഗിക്കുന്നവയാണ്. അവയെ ഹാഷ് എന്ന് വിളിക്കുന്നു. അത് ഓരോ കമ്മിറ്റിനും തനതായിരിക്കും. അതിനാൽ തന്നെ ഒരു കമ്മിറ്റിന്റെ വിലാസം എന്ന് വേണമെങ്കിൽ അവയെ പറയാവുന്നതാണ്. ഹാഷിനു് താഴെ ആ കമ്മിറ്റ് ആരു് ചെയ്തു,എന്ന് ചെയ്തു എന്നൊക്കെ വിവരിക്കുന്നു. ഏറ്റവും അടിയിൽ കമ്മിറ്റ് സന്ദേശവും ഉണ്ടാവും.

അടുത്ത ലക്കത്തില്‍ തിരുത്തലുകളെ പറ്റി പറയാം. ചെയ്തു പോയ ഒരു കമ്മിറ്റ് എങ്ങനെ തിരുത്താം, പുതുക്കിയ ഫയല്‍ എങ്ങനെ പഴയ അവസ്ഥയില്‍ എത്തിക്കാം, സ്റ്റേജിങ്ങ് ഏരിയയില്‍ എത്തിയ ഫയലിനെ എങ്ങനെ അവിടെ നിന്നും നീക്കം ചെയ്യാം എന്നൊക്കെ.