You are on page 1of 10

To repository mi

Lnh git init to mt repository loi


i git ti th mc hin ti:

$ git init

Khc vi cc h qun l phin bnn khc, git cho php t repo hon ton ti my tnh local. Ni
i dung ca
c ton
b repository c lu ti th mc .git ti th mc va chy init:

Tt nhin, git cng c th lm vic vi


i cc repo nnm trn mng hoc repo tng, nhng vic khng btb buc. Ta s
ni n ch lm vic vi repo mng
ng cc mc sau. Hin gi, ta c th dng git to
o repo ti my a phng ty
.

The working tree

Cc file ca bn trong th mc repo


c gi l working tree:

The staging index

Git lu tr ni b mt th gi l index,, n l nh chp cc file trong project ca bn. Sau khi bn


n to mt repo, n l
repo rng v index ca git rng (k c n
nu trong th mc c sn mt s file v th mc). Bnn phi
ph t tay ghi nhn
(stage) cc file t working tree ca mnhnh vo index bng lnh git add:

> git add somefile.txt

git add chy quy, bn c th add c th


th mc theo cch ny:

> git add somefolder


Khng ch cn add i vi nhng file cha tng vo index, cng vic cng nh vy nu bn sa mt file ti working
tree bn phi add thay i vo index bng lnh git add:

> edit somefile.txt


> git add somefile.txt

Cn nh rng index l nh chp ca ton b cc file trong project ch khng ch l mt danh sch cc file b thay
i.

Commit

git commit ly ni dung ca index v to mt bn commit mi

> git commit -m "the 1st commit"

Commit l mt hot ng hon ton a phng, n khng lin quan n vic gi ci g ti mt server no trn mng.
N ch ly ni dung ca index v lu li mt nh chp ca project nh c ghi trong index:

Tng t vi index, mt commit l mt nh chp ton b cc file trong project. Mi commit c gn mt nhn xc
nh duy nht commit (nhn ny c tnh t kt qu SHA-1 hash ca ni dung c chp li):

Do tnh cht xc nh duy nht ca nhn commit, n cho php ta ly c chnh xc nhng g chng ta c trong project
ti thi im thc hin commit . Nhn commit tuy di nhng ta ch cn dng 7 ch s u tin l xc nh
commit khi cn ch nh n trong lnh (xem v d ti cc mc sau).

Xem xem ci g s c commit

git status cho bn bit working tree hin khc bit nh th no so vi index v index hin khc g so vi commit
ln gn nht:

> git status


u tin, bn s thy nhng thay i c add vo index. Danh sch ny l nhng g s nm trong ln commit tip
theo:

# Changes to be committed:
#
# modified: changed_file_added.txt

Tip theo l nhng thay i c thc hin vi working tree, nhng cha c add vo index:

# Changed but not updated:


#
# modified: changed_file.txt
#
# Untracked files:
#
# newfile.txt

Shortcut: Cch add cc thay i ngay khi thc hin commit

Khi thc hin commit, bn c th git t add cc file b sa i bng cch s dng ty chn -a:

> git commit -a -m "commit message"

Lnh trn s add tt c cc sa i (ngoi tr cc file mi to) vo index trc khi commit.

Lch s commit

Quy trnh thc hin vic son cc file trong repo git trng nh sau:

Sa ni dung file nm ti working tree.


Stage sa i thc hin vo index bng lnh git add.
Commit ni dung index bng lnh git commit.

Khi bn thc hin quy trnh trn nhiu ln, mi ln bn s to mt commit mi, n tr v commit trc n:
l cch git lu li lch s ca project. N lu li cc nh chp ca cc file trong project di dng cc commit. Mi
commit ny tr ngc li commit tin thn ca mnh.

Bn c th xem lch s ny bng lnh git log:

> git log

commit 068b9b9...
Author: Bob <bob@example.com>
Date: Wed Jun 17 17:21:16 2009 +0200

the 3rd commit

commit 3720b35...
Author: Bob <bob@example.com>
Date: Wed Jun 17 17:21:10 2009 +0200

the 2nd commit

commit a2a1eb3...
Author: Bob <bob@example.com>
Date: Wed Jun 17 17:21:10 2009 +0200

the 1st commit

git cng cung cp phin bn ngn gn hn nh sau:

> git log --pretty=oneline --abbrev-commit

068b9b9 the 3rd commit


3720b35 the 2nd commit
a2a1eb3 the 1st commit

Git configuration: user settings

Nu nhn lch s commit y , bn s thy n c cha thng tin v tc gi. Git ly thng tin ny u khi n to
commit. u tin l n c on t username v hostname ca bn. Bn cng c th t tay cu hnh cho project hin ti
nh sau:

> git config user.name "Bob"


> git config user.email "bob@example.com"

Bn cng c th cu hnh mt ln cho tt c cc git project ca bn

> git config --global user.name "Bob"


> git config --global user.email "bob@example.com"

Hy b cc sa i
Nu bn thc hin mt s sa i trong project nhng mun quay li tnh trng c. Cch lm nh sau, ty theo tnh
hung.

Nu bn cha add chng vo index, bn c th khi phc file/th mc ti working tree quay tr loi ni dung
lu trong index bng lnh git checkout <filename>:

> git checkout somefile.txt

Nu bn add sa i vo index, bn c th khi phc index v tnh trng ca ln commit gn nht bng lnh git
reset:

> git reset HEAD somefile.txt

Hoc khi phc ton b index:

> git reset HEAD

HEAD lun lun ch ti ln commit gn nht lm. Dng lnh trn, index c khi ph t ln commit trc, tip
theo bn c th dng lnh git checkout khi phc c working tree:

Reverting commits hy commit c

Nu bn commit sa i, bn c th dng lnh git revert <commit> undo commit .

git revert 068b9b9

Lnh trn s to mt commit th hai undo thay i ca commit ni trn:

8b54ea7 Revert "the 3rd commit"


068b9b9 the 3rd commit
3720b35 the 2nd commit
a2a1eb3 the 1st commit
Ta cng c th undo cc commit c hn:

> git revert 3720b35


> git log --pretty=oneline --abbrev-commit

ab621c7 Revert "the 2nd commit"


068b9b9 the 3rd commit
3720b35 the 2nd commit
a2a1eb3 the 1st commit

Tuy nhin, vic undo mt commit c hn c th gy xung t (conflict) nu cc commit mi hn n cng sa trng cc
ni dung . Cch gii quyt cc conflict s c ni n sau.

Xem diff gia cc commit

xem khc bit gia mt commit vi tin thn ca n, ta dng lnh git show <commit>:

> git show 3720b35

so snh hai commit c th vi nhau, ta dng lnh git diff <commit_from>..<commit_to>:

> git diff a2a1eb3..068b9b9

xem diff ca ton b lch s, dng lnh git log -p

> git log -p

Tagging commits gn tag cho commit

Lnh git tag <name> <commit> gn mt tag cho mt commit. Nu b qua phn <commit>, tag s c gn cho
commit gn nht:

> git tag working 3720b35


> git tag broken

Tag ch l mt ci nhn m c th dng gi tn commit c gn nhn:

C th dng tag bt c ng cnh no m ta c th dng nhn hash, chng hn trong lnh git diff:

> git diff working..broken


Tag l cng c hon ho t tn cho cc mc c th trong lch s project. Ngi ta thng dng tag dng version
number khi commit cc bn release ca project bng cch ny ta c th d dng tm thy cc commit quan trng:

> git tag v1.0.3

Branches - Nhnh

Nh vy ta hc cch to cc commit v lm vic vi chng. n y, lch s project ca ta mi c dng tuyn tnh.

Gi s ta mun pht trin mt tnh nng mi cho project. y l mt vic ln, v ta mun tch cc thay i ny ra khi
cc thay i khc. Ta c th dng branch cho vic ny.

T u n gi, ta lm vic vi mt branch c tn l master. Branch ny c to t ng khi ta to repo. Bn c


th xem danh sch cc branch ca repo bng lnh git branch:

> git branch

* master

Nh vy l c mt branch (nhnh) c tn master. Du * k hiu y l branch m hin ti chng ta ang lm vic.


Mt branch gn ging nh mt tag. Mt branch bao gi cng ch ti mt commit no , trong ng cnh hin ti , n
ang ch ti commit mi nht m ta thc hin. Ta c th kim tra iu bng lnh:

> git branch -v

* master 068b9b9 the 3rd commit

theo di cc thay i ti mt branch khc, ta phi to mt branch mi bng lnh git branch <name> <commit>.
Commit chn s l im bt u ca nhnh mi nu ta b qua phn <commit>, git s chn commit gn nht:

> git branch newfeature

Lnh trn s to mt branch mi c tn newfeature da trn commit mi nht ca branch master:

Ti mi thi im, ta ch c mt branch hin hnh v ang lm vic vi branch . Nu gi lnh git branch, ta s nhn
thy branch mi vi tn newfeature c to, nhng branch hin hnh vn l master:
> git branch

* master
newfeature

Ta c th chuyn gia cc branch bng lnh git checkout <branchname>. y cng chnh l lnh ta dng ly
file t staging index vo working tree. ngha ca git checkout ty theo tham s ca lnh .

> git checkout newfeature

By gi branch hin hnh trong repo l newfeature:

> git branch

master
* newfeature

Ta c th bt u lm vic vi branch mi bng nhng lnh hc nh git add, git commit, v.v.. Hy xem chuyn g
xy ra khi ta to mt commit mi ti branch hin ti:

> edit somefile.txt


> git commit -a -m "api draft"

Commit c add vo repo v branch newfeature by gi ang ch ti commit mi. V mt khi nim, mt branch c
th c xem nh mt con tr ti mt commit no . Mi khi bn commit g , con tr ny ca branch hin hnh
s c chuyn ti ch vo commit mi. l tt c nhng g cn n phn bit cc branch.

tip tc v d, gi s tm thi ta lm vic xong vi branch newfeature v mun quay li lm vic ti branch
master. Ta quay li branch master bng lnh sau:

> git checkout master

Lnh trn s chuyn branch hin hnh v li master. N cng s reset index v working tree ca ta v ni dung ca
ln commit cui cng ti master:
Ta s thy project tr v trng thi ging ht nh thi im ta tch branch mi. S khng nhn cc thay i lm
cho branch newfeature.

Vy chuyn g xy ra nu by gi ta thm mt s sa i v commit chng?

> edit somefile.txt


> git commit -a -m "bugfix"

Cng ging nh trc: Mt commit mi s c to t commit gn nht cho master v master s ch ti commit mi:

Branch l c ch nh v nhanh ca git, ta c th to nhiu branch ty . Mt s lp trnh vin thch lm vic vi mt


branch stable v mt branch unstable, trong khi ngi khc li to branch cho mi tnh nng mi m h to ty bn
chn cch ca mnh.

Merging hp nht cc branch

Gi s ta hon thnh tnh nng mi v mun a n vo branch master. Ta dng lnh git merge trong khi master
ang l branch hin hnh:

> git merge newfeature

Nu khng c conflict, git s to mt commit mi cha cc thay i thc hin c hai branch:
Git thng rt thng minh khi merge. Tuy nhin, nu cng mt ni dung c sa c hai branch, ta s c tnh trng
conflict:

CONFLICT (content): Merge conflict in somefile.txt


Automatic merge failed; fix conflicts and then commit the result.

Ta phi t tay gii quyt conflict ny. Nu bn xem ni dung file b conflict, bn s thy cc dng c conflict
b nh du. Ti u file s c phin bn ca branch hin hnh, bn di l phin bn ca branch c trn
vo:

<<<<<<< HEAD:somefile.txt
this change was done in master
=======
this change was done in newfeature
>>>>>>> newfeature:somefile.txt

Bn phi t tay gii quyt conflict ny v xa b cc marker nh du. Sau , bn add file vo index v commit kt
qu:

> git add somefile.txt


> git commit

Sau khi merge xong cc branch, bn c th xa branch newfeature i nu bn khng cn n n na:

> git branch -d newfeature

Bn cng c th tip tc lm vic vi branch ri sau li merge li vo master. Git s thng minh bit phn
no ca branch c merge v s ch merge cc thay i mi.

You might also like