我們知道Git有三大區(qū)(工作區(qū)林艘、暫存區(qū)墓陈、版本庫)以及幾個(gè)狀態(tài)(untracked井仰、unstaged埋嵌、uncommited)
一、簡(jiǎn)介
Git 保存的不是文件的變化或者差異俱恶,而是一系列不同時(shí)刻的文件快照雹嗦。
git reset命令是git中重置命令,即用來撤銷某次提交(commit)合是。首先了罪,我們得了解,git reset可以幫我們重置哪些內(nèi)容:
1聪全、修改本地倉庫中commit對(duì)象(快照)
如下圖:
此時(shí)本地倉庫對(duì)應(yīng)的是commit4泊藕,git reset 可以讓本地倉庫對(duì)應(yīng)的指針變?yōu)閏ommit3或是commit1等之前的版本,當(dāng)然难礼,也可以變?yōu)閏ommit4之后的某個(gè)commit娃圆,如commit5。
Git 的分支蛾茉,其實(shí)本質(zhì)上僅僅是指向提交對(duì)象的可變指針踊餐。
備注:當(dāng)使用git reset命令時(shí)候,一般會(huì)修改本地倉庫臀稚。
其常用格式如下:
- 用法一:git reset [-q] [<commit>] [--] <paths>...
- 用法二:git reset [--soft | --mixed | --hard | --merge | --keep ] [-q] [commit]
二、參數(shù)
參數(shù)說明 (git log和git reflog可查看commitId三痰,commitId是快照的唯一標(biāo)識(shí))
- --hard commitId 修改本地倉庫吧寺、暫存區(qū)、工作區(qū)里面的數(shù)據(jù)為commitId對(duì)應(yīng)快照的內(nèi)數(shù)據(jù)
- --mixed commitId 修改本地倉庫散劫、暫存區(qū)里面的數(shù)據(jù)為commitId對(duì)應(yīng)快照里的數(shù)據(jù)稚机,是git reset默認(rèn)的參數(shù),--mixed可缺省获搏。 暫存區(qū)的數(shù)據(jù)會(huì)被快照中的數(shù)據(jù)覆蓋
這種情況是工作區(qū)沒有赖条,但暫存區(qū)有,所以提示修改未在暫存區(qū)(D表示delete)
- --soft commitId 修改本地倉庫里面的數(shù)據(jù)為commitId對(duì)應(yīng)快照的數(shù)據(jù)。(僅改變指向快照的指針指向)
當(dāng)git reset 后面的commitId為當(dāng)前提交的commitId時(shí)纬乍,即HEAD(可缺省)碱茁。那么:
參數(shù)說明
- --hard HEAD 修改暫存區(qū)、工作區(qū)里面的內(nèi)容為當(dāng)前快照里的內(nèi)容仿贬。(這個(gè)很危險(xiǎn)纽竣,曾經(jīng)踩過坑,電腦的文件丟失了很多茧泪,也是導(dǎo)致我決心好好學(xué)一學(xué)git的原因蜓氨,慎用)
- --mixed HEAD 修改暫存區(qū)里面的內(nèi)容為當(dāng)前快照里的內(nèi)容,是git reset默認(rèn)的參數(shù)队伟,因此可缺省穴吹。
- --soft HEAD 本地倉庫、暫存區(qū)嗜侮、工作區(qū)都不改變 |
我們需要注意港令,使用git reset重置一般是很危險(xiǎn)的,會(huì)徹底地丟掉歷史棘钞。因?yàn)槿绻麤]有記錄下重置前的commitId缠借,一般不容易找回,除非分析.git/logs里面的日志宜猜,故重置需慎重泼返。
git diff只對(duì)已被追蹤的文件起作用,即已git add過姨拥,在暫存區(qū)有的
git commit -a -m只對(duì)已被追蹤的文件起作用绅喉,