git入門篇(4)--版本穿梭

上一篇主要針對使用git add和git commit兩個指令提交文件到本地版本庫做了詳細的介紹,其實提交文件到版本庫無非就是兩個步驟,先將文件添加到暫存區,所有要提交的文件全部添加完畢,統一提交到版本庫。那我們每一次提交都會生成一個不同的版本,我們如何對這些不同的版本進行管理呢?本篇文章主要談談版本的管理,比如版本回滾,修改的管理刪除等。


暫存區文件刪除

我們都清楚,我們要更新版本庫首先git add一個文件,這時候這個文件所做的修改就會添加到暫存區,但是這時候如果我們發現添加錯文件了,我們如何刪除暫存區的文件呢?這裏一般來說有三種情況存在:
  • 暫存區存在一個文件hello.txt,我們需要從暫存區刪除這個文件,但是工作區文件不能刪除。

  • 暫存區存在一個文件hello.txt,我們需要從暫存區刪除這個文件,並且同時刪除工作區文件。

  • 我們暫存區有多個文件,需要同時清空整個暫存區。


只清除暫存區的某個文件

在git暫存區有多個文件,如果我們只想要從暫存區刪除其中一個文件,那我們可以使用命令:

git rm --cached hello.txt


清空暫存區文件並且刪除工作目錄對應文件

在git暫存區有多個文件如果我們只想要從暫存區刪除其中一個文件,並且將這個文件同時從工作目錄刪除,那我們可以使用命令:

git rm -f hello.txt

清空暫存區

清空暫存區所有緩存文件,可以刪除版本庫的index文件,就可以達到清空暫存區的目的,可以使用命令

rm .git/index


我簡單的錄製了一個gif圖演示清除緩存區的操作:



暫存區文件修改
比如我們有一個hello.txt文件,第一次插入了一句話,git add添加到暫存區,然後我們不使用git commit提交,而是選擇繼續更改工作區的hello.txt,這時候就導致暫存區的hello.txt文件和工作區的hello.txt不一致,那這時候選擇git commit提交究竟提交的是暫存區的舊版本還是工作區的新版本呢?我們上一篇其實講過一般情況下使用git commit -m只會提交暫存區的文件,所以說一般情況下就算工作區文件修改了也一樣只會提交暫存區的舊版本,但是爲何說一般情況呢?因爲我們上篇也提到了git commit -a -m命令,使用這個命令如果之前我們已經將hello.txt文件提交到版本庫,代表這個文件已經被Git進行版本管理,這時候使用git commit -a -m命令則會將工作區做了修改但是沒有添加到暫存區的文件先添加到暫存區再提交,兩步操作合二爲一,但是我們一般情況不建議使用這個命令,特別新手更是應該分成兩步操作確保不會出現問題。我也簡單的錄製了一個gif簡單解析下這個過程:


可以看到,我先將文件添加到暫存區,然後修改文件新增一句話,再次使用git status命令查看暫存區狀態提示hello.txt文件被修改,這時候我選擇git commit提交,再次查看狀態一樣提示hello.txt文件被修改,所以證明我們工作區所做的修改並沒有被真正提交,提交的一樣是暫存區的舊版本。


撤銷修改

有朋友看到這個標題撤銷修改,會納悶撤銷修改不就是將文件從暫存區刪除,剛纔已經提到過了,但是如果我們需要撤銷工作區的修改呢,也就是將hello.txt撤銷修改回退到上一次提交的版本如何做呢?實際上我們git add後使用git status命令

$ git statusOn branch masterChanges to be committed:  (use "git restore --staged <file>..." to unstage)        modified:   hello.txt
Untracked files: (use "git add <file>..." to include in what will be committed) project/ scoreInfo.txt
可以看到提示我們使用git restore --satged hello.txt可以從暫存區撤銷這個文件,我們執行完這個命令再次執行git status
$ git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   hello.txt

Untracked files: (use "git add <file>..." to include in what will be committed) project/ scoreInfo.txt


可以看到再次提示可以使用git restore hello.txt撤銷工作區的修改回退到上一次提交的版本,再次使用這個命令你個發現我們剛纔工作區所做的修改果然全部丟失了。那如果我們想要放棄暫存區的修改並且同時回退工作區文件的修改,執行兩次命令固然沒問題,但是這時候我們可以使用一個命令直接實現:

git checkout -- hello.txt
使用這個命令一般有兩種可能,hello.txt文件修改已經添加到暫存區,使用這個命令則會從暫存區刪除hello.txt並且工作區文件版本同時回退。第二種可能文件工作區做了下蓋,還未添加到暫存區,則直接回退工作區版本,所以使用這個命令可以直接將剛纔的兩個命令合二爲一。

版本回退
剛纔對版本做修改一直都是針對工作區和暫存區,那如果我們工作區版本修改出問題了廢掉了,我們想要將版本回退到版本庫某一個版本如何實現呢?首先我們需要先查看目前提交了幾個版本,這時候可以使用git log查看不同版本的摘要信息:


可以看到我們一共提交了三次修改,生成了3個commit_id,我們可以看到每一次提交的備註,然後找到我們需要回退版本的commit_id,取到了commit_id之後我們就可以實現版本回退,使用命令:

git reset --hard HEAD^
使用這條命令可以成功將版本回退到上一個版本,比如我們要回退三個版本之前,我們可以使用這個命令你個連續執行三次,但是如果十個百個版本呢?實際上上面的命令完整是:
git reset --hard commit_id

也就是我們只需要傳對應版本的commit_id就可以實現版本回退到對應的版本,而要查詢舊版本的commit_id剛纔說過了使用git log就可以實現。


我們可以看到我是用命令回退到上一個版本,再次git log查看版本log,發現我剛纔的版本由於回退丟失了,如果我版本回退後悔了,要如何恢復到剛纔的新版本呢?Git還提供了一個記錄所有歷史的命令:git reflog,我們可以使用git reflog查看所有版本歷史,最後使用git reset指定剛纔的commit_id進行恢復。


可以看到版本成功恢復到剛纔的新版本了,所以使用git log,git reflog,git reset我們就可以在所有版本來回穿梭,不用擔心回退導致版本丟失的問題。通過本篇文章講到的命令,基本可以滿足工作中對於版本庫管理的一般要求了。下一篇開始將本地倉庫接入遠程倉庫,實現將項目推送到第三方遠程倉庫存儲,比如codding,碼雲,GitHub等。

歡迎關注公衆號: 程序猿周先森。 查看更多精彩文章。



推薦閱讀
git入門篇(1)--初識Git
git入門篇(2)--Git的安裝

git入門篇(3)--更新文件到版本庫

本文分享自微信公衆號 - 程序猿周先森(zhanyue_org)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章