本系列教程來自廖雪峰的官方網(wǎng)站,現(xiàn)在搬運過來,目的幫助自己和小白學習收藏!
附贈:常用git命令清單
目錄
前言
我們已經(jīng)成功地添加并提交了一個readme.txt文件,現(xiàn)在,是時候繼續(xù)工作了打洼,于是,我們繼續(xù)修改readme.txt文件奴曙,改成如下內(nèi)容:
Git is a distributed version control system.
Git is free software.
現(xiàn)在,運行git status
命令看看結果:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以讓我們時刻掌握倉庫當前的狀態(tài)便瑟,上面的命令告訴我們缆毁,readme.txt被修改過了,但還沒有準備提交的修改到涂。
雖然Git告訴我們readme.txt被修改了,但如果能看看具體修改了什么內(nèi)容颁督,自然是很好的践啄。比如你休假兩周從國外回來,第一天上班時沉御,已經(jīng)記不清上次怎么修改的readme.txt屿讽,所以,需要用git diff
這個命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff
顧名思義就是查看difference吠裆,顯示的格式正是Unix通用的diff格式伐谈,可以從上面的命令輸出看到,我們在第一行添加了一個“distributed”單詞试疙。
知道了對readme.txt作了什么修改后诵棵,再把它提交到倉庫就放心多了,提交修改和提交新文件是一樣的兩步祝旷,第一步是git add
:
$ git add readme.txt
同樣沒有任何輸出履澳。在執(zhí)行第二步git commit
之前嘶窄,我們再運行git status
看看當前倉庫的狀態(tài):
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
git status
告訴我們,將要被提交的修改包括readme.txt距贷,下一步柄冲,就可以放心地提交了:
$ git commit -m "add distributed"
[master ea34578] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后,我們再用git status
命令看看倉庫的當前狀態(tài):
$ git status
# On branch master
nothing to commit (working directory clean)
Git告訴我們當前沒有需要提交的修改忠蝗,而且现横,工作目錄是干凈(working directory clean)的。
視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/git-diff-status.mp4
小結
- 要隨時掌握工作區(qū)的狀態(tài)阁最,使用
git status
命令戒祠。 - 如果
git status
告訴你有文件被修改過,用git diff
可以查看修改內(nèi)容闽撤。
版本回退
現(xiàn)在得哆,你已經(jīng)學會了修改文件,然后把修改提交到Git版本庫哟旗,現(xiàn)在贩据,再練習一次,修改readme.txt文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后嘗試提交:
$ git add readme.txt
$ git commit -m "append GPL"
[master 3628164] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)
像這樣闸餐,你不斷對文件進行修改饱亮,然后不斷提交修改到版本庫里,就好比玩RPG游戲時舍沙,每通過一關就會自動把游戲狀態(tài)存盤近上,如果某一關沒過去,你還可以選擇讀取前一關的狀態(tài)拂铡。有些時候壹无,在打Boss之前,你會手動存盤感帅,以便萬一打Boss失敗了斗锭,可以從最近的地方重新開始。Git也是一樣失球,每當你覺得文件修改到一定程度的時候岖是,就可以“保存一個快照”,這個快照在Git中被稱為commit
实苞。一旦你把文件改亂了豺撑,或者誤刪了文件,還可以從最近的一個commit
恢復黔牵,然后繼續(xù)工作聪轿,而不是把幾個月的工作成果全部丟失。
現(xiàn)在荧止,我們回顧一下readme.txt文件一共有幾個版本被提交到Git倉庫里了:
版本1:wrote a readme file
Git is a version control system.
Git is free software.
版本2:add distributed
Git is a distributed version control system.
Git is free software.
版本3:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
當然了屹电,在實際工作中阶剑,我們腦子里怎么可能記得一個幾千行的文件每次都改了什么內(nèi)容,不然要版本控制系統(tǒng)干什么危号。版本控制系統(tǒng)肯定有某個命令可以告訴我們歷史記錄牧愁,在Git中,我們用git log
命令查看:
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
git log
命令顯示從最近到最遠的提交日志外莲,我們可以看到3次提交猪半,最近的一次是append GPL
,上一次是add distributed
偷线,最早的一次是wrote a readme file磨确。
如果嫌輸出信息太多,看得眼花繚亂的声邦,可以試試加上--pretty=oneline
參數(shù):
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
需要友情提示的是乏奥,你看到的一大串類似3628164...882e1e0
的是commit id
(版本號),和SVN不一樣亥曹,Git的commit id
不是1邓了,2,3……遞增的數(shù)字媳瞪,而是一個SHA1計算出來的一個非常大的數(shù)字骗炉,用十六進制表示,而且你看到的commit id
和我的肯定不一樣蛇受,以你自己的為準句葵。為什么commit id
需要用這么一大串數(shù)字表示呢?因為Git是分布式的版本控制系統(tǒng)兢仰,后面我們還要研究多人在同一個版本庫里工作乍丈,如果大家都用1,2把将,3……作為版本號诗赌,那肯定就沖突了。
每提交一個新版本秸弛,實際上Git就會把它們自動串成一條時間線。如果使用可視化工具查看Git歷史洪碳,就可以更清楚地看到提交歷史的時間線:
好了递览,現(xiàn)在我們啟動時光穿梭機,準備把readme.txt回退到上一個版本瞳腌,也就是“add distributed”的那個版本绞铃,怎么做呢?
首先嫂侍,Git必須知道當前版本是哪個版本儿捧,在Git中荚坞,用HEAD
表示當前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一樣)菲盾,上一個版本就是HEAD^
颓影,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數(shù)不過來懒鉴,所以寫成HEAD~100
诡挂。
現(xiàn)在,我們要把當前版本“append GPL”回退到上一個版本“add distributed”临谱,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
--hard
參數(shù)有啥意義璃俗?這個后面再講,現(xiàn)在你先放心使用悉默。
看看readme.txt的內(nèi)容是不是版本add distributed:
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
果然城豁。
還可以繼續(xù)回退到上一個版本wrote a readme file
,不過且慢抄课,然我們用git log
再看看現(xiàn)在版本庫的狀態(tài):
$ git log
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
最新的那個版本append GPL
已經(jīng)看不到了唱星!好比你從21世紀坐時光穿梭機來到了19世紀,想再回去已經(jīng)回不去了剖膳,腫么辦魏颓?
辦法其實還是有的,只要上面的命令行窗口還沒有被關掉吱晒,你就可以順著往上找啊找啊甸饱,找到那個append GPL
的commit id是3628164...
,于是就可以指定回到未來的某個版本:
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
版本號沒必要寫全仑濒,前幾位就可以了叹话,Git會自動去找。當然也不能只寫前一兩位墩瞳,因為Git可能會找到多個版本號驼壶,就無法確定是哪一個了。
再小心翼翼地看看readme.txt的內(nèi)容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
果然喉酌,我胡漢三又回來了热凹。
Git的版本回退速度非常快泪电,因為Git在內(nèi)部有個指向當前版本的HEAD指針般妙,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL
:
改為指向
add distributed
:
然后順便把工作區(qū)的文件更新了相速。所以你讓HEAD指向哪個版本號碟渺,你就把當前版本定位在哪。
視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/git-reset.mp4
現(xiàn)在突诬,你回退到了某個版本苫拍,關掉了電腦芜繁,第二天早上就后悔了,想恢復到新版本怎么辦绒极?找不到新版本的commit id怎么辦骏令?
在Git中,總是有后悔藥可以吃的集峦。當你用$ git reset --hard HEAD^回退到add distributed
版本時伏社,再想恢復到append GPL
,就必須找到append GPL
的commit id塔淤。Git提供了一個命令git reflog
用來記錄你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
終于舒了口氣摘昌,第二行顯示append GPL
的commit id是3628164
,現(xiàn)在高蜂,你又可以乘坐時光機回到未來了聪黎。
視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/git-reflog-reset.mp4
小結
現(xiàn)在總結一下:
HEAD
指向的版本就是當前版本,因此备恤,Git允許我們在版本的歷史之間穿梭稿饰,使用命令git reset --hard commit_id
。穿梭前露泊,用
git log
可以查看提交歷史喉镰,以便確定要回退到哪個版本。要重返未來惭笑,用
git reflog
查看命令歷史侣姆,以便確定要回到未來的哪個版本。
工作區(qū)和暫存區(qū)
Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念沉噩。
先來看名詞解釋捺宗。
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄,比如我的learngit
文件夾就是一個工作區(qū):
版本庫(Repository)
工作區(qū)有一個隱藏目錄.git
川蒙,這個不算工作區(qū)蚜厉,而是Git的版本庫。
Git的版本庫里存了很多東西畜眨,其中最重要的就是稱為 stage
(或者叫index)的暫存區(qū)昼牛,還有Git為我們自動創(chuàng)建的第一個分支master
,以及指向master的一個指針叫HEAD
康聂。
分支和HEAD的概念我們以后再講匾嘱。
前面講了我們把文件往Git版本庫里添加的時候,是分兩步執(zhí)行的:
第一步是用git add
把文件添加進去早抠,實際上就是把文件修改添加到暫存區(qū);
第二步是用git commit
提交更改撬讽,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支蕊连。
因為我們創(chuàng)建Git版本庫時悬垃,Git自動為我們創(chuàng)建了唯一一個master
分支彼宠,所以利虫,現(xiàn)在糠馆,git commit
就是往master
分支上提交更改赋焕。
你可以簡單理解為灼擂,需要提交的文件修改通通放到暫存區(qū)逗载,然后瓷马,一次性提交暫存區(qū)的所有修改叭喜。
俗話說囚聚,實踐出真知【搁牛現(xiàn)在,我們再練習一遍顽铸,先對readme.txt做個修改茁计,比如加上一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
然后,在工作區(qū)新增一個LICENSE
文本文件(內(nèi)容隨便寫)谓松。
先用git status
查看一下狀態(tài):
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告訴我們星压,readme.txt被修改了,而LICENSE還從來沒有被添加過鬼譬,所以它的狀態(tài)是Untracked
娜膘。
現(xiàn)在,使用兩次命令git add
优质,把readme.txt和LICENSE都添加后竣贪,用git status
再查看一下:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: readme.txt
#
現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了:
所以盆赤,
git add
命令實際上就是把要提交的所有修改放到暫存區(qū)(Stage
)贾富,然后,執(zhí)行git commit
就可以一次性把暫存區(qū)的所有修改提交到分支牺六。
$ git commit -m "understand how stage works"
[master 27c9860] understand how stage works
2 files changed, 675 insertions(+)
create mode 100644 LICENSE
一旦提交后颤枪,如果你又沒有對工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的:
$ git status
# On branch master
nothing to commit (working directory clean)
現(xiàn)在版本庫變成了這樣淑际,暫存區(qū)就沒有任何內(nèi)容了:
小結
暫存區(qū)是Git非常重要的概念畏纲,弄明白了暫存區(qū),就弄明白了Git的很多操作到底干了什么春缕。
沒弄明白暫存區(qū)是怎么回事的童鞋盗胀,請向上滾動頁面,再看一次锄贼。
管理修改
現(xiàn)在票灰,假定你已經(jīng)完全掌握了暫存區(qū)的概念。下面,我們要討論的就是屑迂,為什么Git比其他版本控制系統(tǒng)設計得優(yōu)秀浸策,因為Git跟蹤并管理的是修改,而非文件惹盼。
你會問庸汗,什么是修改?比如你新增了一行手报,這就是一個修改蚯舱,刪除了一行,也是一個修改掩蛤,更改了某些字符枉昏,也是一個修改,刪了一些又加了一些盏档,也是一個修改凶掰,甚至創(chuàng)建一個新文件,也算一個修改蜈亩。
為什么說Git管理的是修改懦窘,而不是文件呢?我們還是做實驗稚配。第一步畅涂,對readme.txt做一個修改,比如加一行內(nèi)容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
然后道川,添加:
$ git add readme.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
然后午衰,再修改readme.txt:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
提交:
$ git commit -m "git tracks changes"
[master d4f25b6] git tracks changes
1 file changed, 1 insertion(+)
提交后,再看看狀態(tài):
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
咦冒萄,怎么第二次的修改沒有被提交臊岸?
別激動,我們回顧一下操作過程:
第一次修改 -> git add
-> 第二次修改 -> git commit
你看尊流,我們前面講了帅戒,Git管理的是修改,當你用git add
命令后崖技,在工作區(qū)的第一次修改被放入暫存區(qū)逻住,準備提交,但是迎献,在工作區(qū)的第二次修改并沒有放入暫存區(qū)瞎访,所以,git commit
只負責把暫存區(qū)的修改提交了吁恍,也就是第一次的修改被提交了扒秸,第二次的修改不會被提交播演。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別:
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
可見鸦采,第二次修改確實沒有被提交宾巍。
視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/git-add-changes.mp4
那怎么提交第二次修改呢?你可以繼續(xù)git add
再git commit
渔伯,也可以別著急提交第一次修改,先git add
第二次修改肄程,再git commit
锣吼,就相當于把兩次修改合并后一塊提交了:
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
好,現(xiàn)在蓝厌,把第二次修改提交了玄叠,然后開始小結。
小結
現(xiàn)在拓提,你又理解了Git是如何跟蹤修改的读恃,每次修改,如果不add到暫存區(qū)代态,那就不會加入到commit中寺惫。
撤銷修改
自然,你是不會犯錯的蹦疑。不過現(xiàn)在是凌晨兩點西雀,你正在趕一份工作報告,你在readme.txt中添加了一行:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.```
在你準備提交前歉摧,一杯咖啡起了作用艇肴,你猛然發(fā)現(xiàn)了“stupid boss”可能會讓你丟掉這個月的獎金!
既然錯誤發(fā)現(xiàn)得很及時叁温,就可以很容易地糾正它再悼。你可以刪掉最后一行,手動把文件恢復到上一個版本的狀態(tài)膝但。如果用`git status`查看一下:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
你可以發(fā)現(xiàn)冲九,Git會告訴你,`git checkout -- file`可以丟棄工作區(qū)的修改:
$ git checkout -- readme.txt
命令`git checkout -- readme.txt`意思就是锰镀,把readme.txt文件在工作區(qū)的修改全部撤銷娘侍,這里有兩種情況:
- 一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在泳炉,撤銷修改就回到和版本庫一模一樣的狀態(tài)憾筏;
- 一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改花鹅,現(xiàn)在氧腰,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)古拴。
現(xiàn)在箩帚,看看readme.txt的文件內(nèi)容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
文件內(nèi)容果然復原了。
`git checkout -- file`命令中的--很重要黄痪,沒有`--`紧帕,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到`git checkout`命令桅打。
> 視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/discard-changes-of-working-dir.mp4
現(xiàn)在假定是凌晨3點是嗜,你不但寫了一些胡話,還`git add`到暫存區(qū)了:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
$ git add readme.txt
慶幸的是挺尾,在commit之前鹅搪,你發(fā)現(xiàn)了這個問題。用`git status`查看一下遭铺,修改只是添加到了暫存區(qū)丽柿,還沒有提交:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
Git同樣告訴我們,用命令`git reset HEAD file`可以把暫存區(qū)的修改撤銷掉(unstage)魂挂,重新放回工作區(qū):
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset命令既可以回退版本甫题,也可以把暫存區(qū)的修改回退到工作區(qū)。當我們用`HEAD`時锰蓬,表示最新的版本幔睬。
再用`git status`查看一下,現(xiàn)在暫存區(qū)是干凈的芹扭,工作區(qū)有修改:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
還記得如何丟棄工作區(qū)的修改嗎麻顶?
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit (working directory clean)
整個世界終于清靜了!
> 視頻教程:http://github.liaoxuefeng.com/sinaweibopy/video/discard-changes-of-staged.mp4
現(xiàn)在舱卡,假設你不但改錯了東西辅肾,還從暫存區(qū)提交到了版本庫,怎么辦呢轮锥?還記得[版本回退](#版本回退)一節(jié)嗎矫钓?可以回退到上一個版本。不過舍杜,這是有條件的新娜,就是你還沒有把自己的本地版本庫推送到遠程。還記得Git是分布式版本控制系統(tǒng)嗎既绩?我們后面會講到遠程版本庫概龄,一旦你把“stupid boss”提交推送到遠程版本庫,你就真的慘了……
####小結
又到了小結時間饲握。
- 場景1:當你改亂了工作區(qū)某個文件的內(nèi)容私杜,想直接丟棄工作區(qū)的修改時蚕键,用命令`git checkout -- file`。
- 場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容衰粹,還添加到了暫存區(qū)時锣光,想丟棄修改,分兩步铝耻,第一步用命令`git reset HEAD file`
誊爹,就回到了場景1,第二步按場景1操作瓢捉。
- 場景3:已經(jīng)提交了不合適的修改到版本庫時替废,想要撤銷本次提交,參考[版本回退](#版本回退)一節(jié)泊柬,不過前提是沒有推送到遠程庫。
### [刪除文件](#目錄)
在Git中诈火,刪除也是一個修改操作兽赁,我們實戰(zhàn)一下,先添加一個新文件test.txt到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master 94cdc44] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情況下冷守,你通常直接在文件管理器中把沒用的文件刪了刀崖,或者用`rm`命令刪了:
$ rm test.txt
這個時候,Git知道你刪除了文件拍摇,因此亮钦,工作區(qū)和版本庫就不一致了,`git status`命令會立刻告訴你哪些文件被刪除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
現(xiàn)在你有兩個選擇充活,一是確實要從版本庫中刪除該文件蜂莉,那就用命令`git rm`刪掉,并且`git commit`:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
現(xiàn)在混卵,文件就從版本庫中被刪除了映穗。
另一種情況是刪錯了,因為版本庫里還有呢幕随,所以可以很輕松地把誤刪的文件恢復到最新版本:
$ git checkout -- test.txt
`git checkout`其實是用版本庫里的版本替換工作區(qū)的版本蚁滋,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”赘淮。
####小結
命令`git rm`用于刪除一個文件辕录。如果一個文件已經(jīng)被提交到版本庫,那么你永遠不用擔心誤刪梢卸,但是要小心走诞,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內(nèi)容低剔。