我們知道Git有三大區(工作區、暫存區、版本庫)以及幾個狀態(untracked、unstaged、uncommited)
一、簡介
Git 保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。
git reset命令是git中重置命令,即用來撤銷某次提交(commit)。首先,我們得了解,git reset可以幫我們重置哪些內容:
1、修改本地倉庫中commit對象(快照)
如下圖:
此時本地倉庫對應的是commit4,git reset 可以讓本地倉庫對應的指針變為commit3或是commit1等之前的版本,當然,也可以變為commit4之后的某個commit,如commit5。
Git 的分支,其實本質上僅僅是指向提交對象的可變指針。
備注:當使用git reset命令時候,一般會修改本地倉庫。
其常用格式如下:
- 用法一:git reset [-q] [
] [--] ... - 用法二:git reset [--soft | --mixed | --hard | --merge | --keep ] [-q] [commit]
二、參數
參數說明 (git log和git reflog可查看commitId,commitId是快照的唯一標識)
- --hard commitId 修改本地倉庫、暫存區、工作區里面的數據為commitId對應快照的內數據
- --mixed commitId 修改本地倉庫、暫存區里面的數據為commitId對應快照里的數據,是git reset默認的參數,--mixed可缺省。 暫存區的數據會被快照中的數據覆蓋
這種情況是工作區沒有,但暫存區有,所以提示修改未在暫存區(D表示delete)
- --soft commitId 修改本地倉庫里面的數據為commitId對應快照的數據。(僅改變指向快照的指針指向)
當git reset 后面的commitId為當前提交的commitId時,即HEAD(可缺省)。那么:
參數說明
- --hard HEAD 修改暫存區、工作區里面的內容為當前快照里的內容。(這個很危險,曾經踩過坑,電腦的文件丟失了很多,也是導致我決心好好學一學git的原因,慎用)
- --mixed HEAD 修改暫存區里面的內容為當前快照里的內容,是git reset默認的參數,因此可缺省。
- --soft HEAD 本地倉庫、暫存區、工作區都不改變 |
我們需要注意,使用git reset重置一般是很危險的,會徹底地丟掉歷史。因為如果沒有記錄下重置前的commitId,一般不容易找回,除非分析.git/logs里面的日志,故重置需慎重。
git diff只對已被追蹤的文件起作用,即已git add過,在暫存區有的
git commit -a -m只對已被追蹤的文件起作用,