文章目錄
- Git(二):基本操作
- 添加文件
- 修改文件
- 版本回退
- 撤銷修改
- 情況一:工作區的代碼還沒有 add
- 情況?:已經 add 但沒有 commit
- 情況三:已經 add 并且也 commit
- 刪除文件
Git(二):基本操作
添加文件
首先我們先來學習一個命令git status
,其基本功能為:
- 顯示工作目錄狀態:git status 會列出當前工作目錄中哪些文件被修改(modified)、未跟蹤(untracked)或存在沖突(conflict)
- 顯示暫存區狀態:顯示哪些文件已暫存(staged)但未提交,以及哪些文件未暫存但已修改
- 分支信息:輸出當前分支名稱及與遠程分支的同步狀態(如 “Your branch is up to date with ‘origin/master’”)
例如,我們在工作區中創建一個文件但并沒有add,使用git status
就會給出提示:file1并沒有被追蹤,同時暫存區中是干凈的
我們add后不commit,再來看一下status:暫存區中有文件等待被commit
commit之后暫存區就干凈了:
修改文件
首先,我們要明確一個概念:Git跟蹤并管理的是修改,而非文件,這也是Git 比其他版本控制系統設計得優秀的主要原因之一
什么是修改?比如你新增了一行,這就是?個修改,刪除了一行,也是一個修改,更改了某些字符,也是一個修改,刪了一些又加了一些,也是一個修改,甚?創建一個新文件,也算一個修改
讓我們將 ReadMe 文件進行一次修改,此時,倉庫中的 ReadMe 和我們?作區的 ReadMe 是不同的, 使用git status
命令查看:
上?的結果告訴我們,ReadMe 被修改過了,但還沒有完成添加與提交。目前,我們只知道文件被修改了,但不知道那里被修改了,這時就需要git diff
命令出馬了:
git diff [file]
命令?來顯?暫存區和?作區?件的差異,顯?的格式正是Unix通?的diff格式。也可以使? git diff HEAD -- [file]
命令來查看版本庫和?作區?件的區別
接下來只需要正常add和commit即可
版本回退
之前我們也提到過,Git 能夠管理?件的歷史版本,這也是版本控制器重要的能?。如果有?天你發現之前的?作做的出現了很?的問題,需要在某個特定的歷史版本重新開始,這個時候,就需要版本回退的功能
執? git reset 命令?于回退版本,可以指定退回某?次提交的版本。要解釋?下“回退”本質是要將版本庫中的內容進?回退,?作區或暫存區是否回退由命令參數決定:
git reset 命令語法格式為: git reset [--soft | --mixed | --hard] [HEAD]
- –mixed 為默認選項,使?時可以不?帶該參數。該參數將暫存區的內容退回為指定提交版本內容,?作區?件保持不變。
- –soft 參數對于?作區和暫存區的內容都不變,只是將版本庫回退到某個指定版本
- –hard 參數將暫存區與?作區都退回到指定版本。切記?作區有未提交的代碼時不要?這個命令,因為?作區會回滾,你沒有提交的代碼就再也找不回了,所以使?該參數前?定要慎重
在上面我們對ReadMe文件新增了一行“hello world!”,現在我們使用表格來展現:
選項 | 工作區 | 暫存區 | 版本庫 |
---|---|---|---|
未操作 | hello git hello world | hello git hello world | hello git hello world |
–soft | hello git hello world | hello git hello world | hello git |
–mixed(默認) | hello git hello world | hello git | hello git |
–hard | hello git | hello git | hello git |
HEAD選項說明:
- 可直接寫成 commit id,表示指定退回的版本
- HEAD 表示當前版本
- HEAD^ 上?個版本
- HEAD^^ 上上?個版本
也可以使? ?數字表示:
- HEAD~0 表示當前版本
- HEAD~1 上?個版本
- HEAD^2 上上?個版本
接下來我們演示一下:ReadMe文件經修改后現在有兩行,commit后master指向最后一次修改
接下來使用reset命令,帶上hard選項,HEAD直接寫成ReadMe文件第一次修改的commit id
我們發現ReadMe文件回退到了第一個版本,而且file1也被刪除了,因為file1是在之后創建的
那我們要是后悔了怎么辦?只需要把commit id改成modify ReadMe的:
我們發現ReadMe文件“回退”到了第二個版本,file1也回來了,HEAD重新指向了modify ReadMe
但是如果我們隔了幾天重新登陸服務器,找不到對應的歷史commit id怎么辦?此時就用到了git reflog
命令:
值得說的是,Git 的版本回退速度?常快,因為 Git 在內部有個指向當前分?(此處是master)的
HEAD 指針, refs/heads/master ?件?保存當前 master 分?的最新 commit id 。當我們
在回退版本的時候,Git 僅僅是給 refs/heads/master 中存儲?個特定的version,可以簡單理解
成如下?意圖:
撤銷修改
如果我們在我們的?作區寫了很?時間代碼,越寫越寫不下去,覺得??寫的實在是垃圾,想恢復到 上?個版本
情況一:工作區的代碼還沒有 add
我們在ReadMe文件中新增一行,不add到暫存區
第一種方法就是直接修改,但如果不記得新增代碼是哪些呢?因此這種方式效率很低,而且容易出錯,此時就需要用到git checkout -- [file]
命令,git checkout -- [file]
命令可以讓工作區的文件回到最近?次add 或commit 時的狀態。要注意 git checkout -- [file]
命令中的 – 很重要,切記不要省略,?旦省略,該命令就變為其他意思了,后面我們再說
情況?:已經 add 但沒有 commit
add后還是保存到了暫存區呢?怎么撤銷呢?
讓我們來回憶?下學過的 git reset 回退命令,該命令如果使用–mixed 參數,可以將暫存區 的內容退回為指定的版本內容,但?作區?件保持不變。那我們就可以回退下暫存區的內容了!!!
此時就變成了第一種情況,再使用git checkout -- [file]
命令就可以了
情況三:已經 add 并且也 commit
直接使用git reset --hard HEAD^
命令回退到上?個版本!不過,這是有條件的,就是 你還沒有把自己的本地版本庫推送到遠程(后面會講)
我們使用表格對上面三種情況進行總結:
操作 | 工作區 | 暫存區 | 版本庫 |
---|---|---|---|
git check – [filename] | xxx code | ||
git reset --mixed | xxx code | xxx code | |
git reset --hard HEAD^ | xxx code | xxx code | xxx code |
注:xxx code是新增內容,空白表示未新增
刪除文件
第一種方法:
- 在工作區中執行
rm -f 文件名
命令 git add
git commit
第二種方法:
- 在工作區中執行
git rm 文件名
命令 git commit