日常的工作當(dāng)中,由于需要和別人協(xié)同工作,代碼方面當(dāng)然就直接使用Git的方式來管理了。在日常使用當(dāng)中有很多命令比較常用
- git commit
- git push
- git stash
- git rebase -i HEAD~想要合并的Commit數(shù)量
- git reset
git rebase 我在這一篇文章已經(jīng)做了一點(diǎn)講解,應(yīng)該使用起來都比較方便。值得一提的是,可以使用git rebase -abort來撤銷一次rebase。
今天來說一下git reset。它的一句話概括
git-reset - Reset current HEAD to the specified state
意思就是可以讓HEAD這個指針指向其他的地方。例如我們有一次commit不是不是很滿意,需要回到上一次的Commit里面。那么這個時候就需要通過reset,把HEAD指針指向上一次的commit的點(diǎn)。
它有三種模式,soft,mixed,hard,具體的使用方法下面這張圖,展示的很全面了。

image
這三個模式理解了,對于使用這個命令很有幫助。在理解這三個模式之前,需要略微知道一點(diǎn)Git的基本流程。正如上圖,Git會有三個區(qū)域:
- Working Tree 當(dāng)前的工作區(qū)域
- Index/Stage 暫存區(qū)域,和git stash命令暫存的地方不一樣。使用git add xx,就可以將xx添加近Stage里面
- Repository 提交的歷史,即使用git commit提交后的結(jié)果

image
結(jié)合這兩張圖,基本就非常明確的知道這三個參數(shù)的作用范圍了。假設(shè)我們對于一個txt文件,每次順序添加一個數(shù)字。有4次提交,1 -> 2 -> 3 ->4,則txt中就會有4個數(shù)字1234,使用命令git reset [param] HEAD~2
- soft:將HEAD reset到目標(biāo)2,由于沒有修改working tree和stage,所以這時它倆的文件都是txt[1234],但是如果和HEAD進(jìn)行diff就會發(fā)現(xiàn),此時HEAD指向是commit2-txt[12]
- mixed:將HEAD reset到目標(biāo)2,沒有修改working tree,所以working tree里面的文件是txt[1234],此時stage是空的,HEAD指向的仍然是commit2-txt[12]
- hard:將HEAD reset到目標(biāo)2,清除三個區(qū)域,working tree = stage = history = txt[12]
Git在默認(rèn)執(zhí)行reset命令的時候會選擇mixed,如果不小心使用hard參數(shù),丟失了當(dāng)前的commit也不要慌。在Git中所有的歷史提交都會有記錄下來,輸入git reflog,找到所有的歷史紀(jì)錄。然后通過HEAD@{N}來恢復(fù)到某一次提交。
git reset --hard HEAD@{N}
ref :