Git
HEAD
- 當(dāng)前分支最近的一個(gè)提交
Index
- index也被稱(chēng)為staging area宵睦,暫存區(qū),下個(gè)提交的文件集合
Working Copy
- 正在工作的那個(gè)文件集滥壕,叫做工作區(qū)
Flow
- 剛checkout一個(gè)分支拌阴,HEAD指向最近的一個(gè)提交,HEAD和Index(暫存區(qū))和Working Copy(工作區(qū))的文件集是一致的
- 修改的烁,會(huì)提示git add褐耳,此時(shí) Working Copy和Index、HEAD不一樣
- git add后渴庆,working copy和index一樣铃芦,但是他們和head不一樣
- git commit后,創(chuàng)建一個(gè)新的commit襟雷,HEAD指向這個(gè)commit刃滓,三者又一致了
git reset
- 總的來(lái)說(shuō),git reset是用來(lái)將當(dāng)前branch重置到另外一個(gè)commit的耸弄,這個(gè)動(dòng)作可能會(huì)影響index和work tree
- 與checkout的區(qū)別
比如當(dāng)前剛checkout到master
- A - B - C(HEAD, master)
如果你希望將master指向B咧虎,執(zhí)行g(shù)it reset B就可以移動(dòng)HEAD到B
- A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore
如果剛才運(yùn)行的是git checkout B
- A - B(HEAD) - C(master)
這時(shí)候HEAD和master branch就不在一個(gè)點(diǎn)上了,你進(jìn)入了detached HEAD STATE(如果這個(gè)commit沒(méi)有和任何一個(gè)branch tip是一致的話(huà))计呈,HEAD砰诵,work tree和index都指向了B,但是卻已經(jīng)是另外一個(gè)分支了捌显,因?yàn)閙aster branch依然指向C茁彭。 - Reset
reset本身做的事情就是重置HEAD到另外一個(gè)commit
比如,我們剛checkout到master扶歪,先如果執(zhí)行g(shù)it reset HEAD理肺,任何事情都不會(huì)發(fā)生
如果git reset HEAD~1,HEAD會(huì)指向上一個(gè)commit- 參數(shù) soft
HEAD會(huì)到另外一個(gè)commit上击罪,index會(huì)存放所有差別集合哲嘲,index和working copy一致 - 參數(shù)hard
HEAD會(huì)回到另外一個(gè)commit,且index和working copy也是 - 參數(shù)mixed(default)
默認(rèn)參數(shù)媳禁,HEAD會(huì)回到另外一個(gè)commit眠副,index也會(huì),working copy存放差別集合
- 參數(shù) soft
git revert
- 用于反轉(zhuǎn)提交
revert用一個(gè)新的提交來(lái)消除一個(gè)歷史提交所做的任何修改
revert后本地的代碼會(huì)回滾到指定的歷史版本竣稽,且git push既可以把origin代碼更新囱怕,也不會(huì)有reset造成的沖突問(wèn)題
git revert xxCommit
不同于reset霍弹,reset 是將HEAD往后移動(dòng),revert是往前娃弓,只不過(guò)是反向提交
參考
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
http://www.cnblogs.com/kidsitcn/p/4513297.html