git reset 命令是git中最常用的命令,但也是最危險,最容易被誤用的命令。我們知道git在初始化時,會為我們預設建立乙個master分支,那這個master到底是什麼呢?其實它在.git目錄下對應了乙個引用檔案-----.git/refs/heads/master檔案,而該檔案的內容便是該分支中最新的一次提交的id:
01
$
cat
.git/refs/heads/master
02
22f8aae534916e1174711f138573acfbb47e489c
03
04
$ git
cat
-
file
-t 22f8aae
05
commit
06
07
$ git log --oneline
08
22f8aae git ignore
file
added.
09
4e79a0b rename third to third.txt
10
46ae7e3 remove branch_first.txt
file
from master branch
11
55d1e70 branch first
file
12
545a382 merge commit
'35bbd32'
當我們用以上檢視master檔案內容時,發現它果然記錄了最新一次的提交。了解了這個前提,那我們來分析下git reset到底做了什麼?
以上面的例子為基礎我們來**reset命令的魔力,首先我們來執行乙個reset命令,reset到上一次提交
1
$ git reset --hard head^
2
head is now at 4e79a0b rename third to third.txt
3
4
quadrangle@quadrangle-pc /d/gitrepo/gitone (master)
5
$ git log --oneline
6
4e79a0b rename third to third.txt
7
46ae7e3 remove branch_first.txt
file
from master branch
8
55d1e70 branch first
file
9
545a382 merge commit
'35bbd32'
head^的意思就是最新一次提交的父提交,reset後,我們看一下提交日誌,發現最新一次提交沒了。到底git做了什麼呢?我們還能找回最新的一次提交嗎?
回答上面兩個問題,就用到上面就到的master引用檔案了,這是我們再看一下這個檔案的內容有什麼變化?
1
$
cat
.git/refs/heads/master
2
4e79a0ba92f1ae63dc661e29343fa0c369ca480d
發現了吧,裡面記錄了reset後的最後一次提交。這時或許我們有所覺察了。先不急著下結論,我們看怎麼回到最新的提交呢?其實reset後,git沒有刪除最新提交的相關資訊,包括目錄樹,因此只要我們記住提交id,便可以重新reset回來:
1
$ git reset --hard 22f8aae
2
head is now at 22f8aae git ignore
file
added.
3
4
$ git log --oneline
5
22f8aae git ignore
file
added.
6
4e79a0b rename third to third.txt
7
46ae7e3 remove branch_first.txt
file
from master branch
8
55d1e70 branch first
file
9
545a382 merge commit
'35bbd32'
這樣檢視log,發現最新提交又回來了。但是如果我們忘了最新提交id 怎麼辦呢?好辦,reflog命令可以最總引用變更的記錄:
1
quadrangle@quadrangle-pc /d/gitrepo/gitone (master)
2
$ git reflog
3
22f8aae head@: reset: moving to 22f8aae
4
4e79a0b head@: reset: moving to head^
5
22f8aae head@: reset: moving to 22f8aae
6
4e79a0b head@: reset: moving to head^
我們可以找到前面任意操作的記錄,並且可以reset到任意提交。
之前我們看到了reset後master檔案的內容發生了變化,其實這就是reset命令的本質,但結合不同的引數,會有額外的工作:如--hard --soft --mixed等,他們決定了是否重置暫存區或工作區。
我們來看下面
其實reset命令有兩種用法:
git reset [-q] [commit] [--]
git reset [--soft | --mixed | --hard | --merge | --keep] [-q]
第一種用法是不會重置引用的,即不會修改master檔案。只是用某一次提交的檔案提交暫存區的檔案
第二種用法不使用則會重置引用,並且引數不同決定是否覆蓋暫存區和工作區:
這樣一來相信對reset的理解會用更深刻的理解了吧。
git倉庫恢復命令 reset
reset命令 git reset mixed預設方式,不帶任何引數的git reset,即時這種方式,它回退到某個版本,只保留原始碼,回退commit和index資訊 git reset soft回退到某個版本,只回退了commit的資訊,不會恢復到index file一級。如果還要提交,直接co...
Git命令 reset 和 revert 的區別
reset git reset soft mixed hard git revert no edit n mparent number s s git revert continue git revert quit git revert abortgit revert 用法是撤銷某次操作,此次操作之...
Git版本管理 reset
一 修改已 commit 的版本 檢視資料夾的資訊 git log oneline 輸出b17fed6 change 2 9be868c change 1 e44c7f7 creat demo.txt 有時候我們總會忘了什麼,比如已經提交了 commit 卻發現在這個 commit 中忘了附上另乙個...