首先瓜客,簡單介紹一下 git tag
命令君纫,該命令可理解為 “打標簽或里程碑”狐树,本質(zhì)上和 branch
焙压、stash
引用一樣,也是一個引用抑钟,記錄著提交 ID
(或者創(chuàng)建 Tag
對象)涯曲,下面我們來操作一下:
- 打上標簽,標簽名為
old_practice
在塔,并添加描述說明:
- 查看標簽記錄的最新的提交
ID
:
- 查看該最新
ID
所記錄的內(nèi)容:
打標簽之后幻件,可以執(zhí)行 git describe
命令,將最新提交顯示為一個容易記的名稱蛔溃,顯示的時候會選取離提交最近的 tag
為 ''基礎(chǔ)版本號''再附加距離 tag
的數(shù)字绰沥,以及該提交的哈希值縮寫。因為當前的提交就是 tag
所在的提交贺待,所以只會顯示出 tag
名稱 :
現(xiàn)在版本庫的狀態(tài)為暫存區(qū)和工作區(qū)都包含了修改徽曲,如下:
接下來,我們進行各種操作來演示:
- 先保存進度:
- 再用
git stash apply
恢復(fù)進度麸塞,因為這個進度記錄要多次使用秃臣,先不移除:
當前工作區(qū)的文件有:
- 直接在工作區(qū)刪除這些文件
可以看到本地文件已經(jīng)刪除掉了,但是暫存區(qū)和版本庫中的文件仍然存在哪工。
- 查看狀態(tài)看看:
輸出表示奥此,本地刪除想要反映到暫存區(qū),應(yīng)該使用 git rm
命令雁比,對不想刪除的文件稚虎,可執(zhí)行 git restore
讓文件在工作區(qū)中恢復(fù)。
也就是說偎捎,需要將刪除的工作的文件先 git rm
到暫存區(qū)再提交蠢终,才算真正的刪除,那么我們操作一下:
現(xiàn)在茴她,在最新的提交中寻拂,文件已經(jīng)被刪除了,但是在歷史提交中還是存在的败京,可以通過歷史提交來恢復(fù)相應(yīng)的文件,所以完全不用擔(dān)心梦染。
- 我們查一下上一次提交的文件列表:
可以通過文件路徑赡麦,直接查看歷史版本中的文件內(nèi)容:
我們之前將本地刪除的文件反映到暫存區(qū)時朴皆,用 git rm
并通過空格寫了一大堆文件名。其實是可以簡化操作的泛粹,通過 git add
再加上 -u
參數(shù)就可以遂铡,其含義是將本地改動(更改和刪除)的文件標記到暫存區(qū)。
下面我們用這種方式演示一下晶姊,首先要恢復(fù)到之前的狀態(tài)才行:
- 先回退到上一次提交的版本扒接,即丟掉最新的提交:
- 恢復(fù)之前保存的進度,
-q
參數(shù)表示命令進入安靜模式:
對比之前的輸出:
- 再次刪除工作區(qū)本地的文件:
- 執(zhí)行
git add -u
命令可以將(被版本庫追蹤的)本地文件的變更(修改们衙、刪除)全部記錄到暫存區(qū)中 钾怔。【 git add 默認只記錄修改蒙挑,不包括新添加的文件和刪除的文件】 :
可以看到宗侦,工作區(qū)刪除的文件已經(jīng)被標記為下次提交時刪除了【D】,之前我們看到的都是修改 【M】忆蚀。
- 最后矾利,進行提交:
可以看到,本地和版本庫中的文件都不存在了馋袜。
一男旗、恢復(fù)文件 :
下面我們演示一下恢復(fù)已經(jīng)被刪除的指定文件,比如指定恢復(fù)被刪除掉的 Welcome.txt 文件欣鳖,我們都知道察皇,當前最新的提交中,文件已經(jīng)不存在观堂,只能從歷史提交中提取文件:
HEAD~1
让网,相當于 HEAD^
,指上一次提交师痕,HEAD~2
溃睹,相當于 HEAD^^
,指上上一次提交胰坟。執(zhí)行 git add
加上 -A
參數(shù)因篇,可以將工作區(qū)中所有修改、刪除和新增的文件都添加到暫存區(qū):
最后笔横,我們進行提交:
二竞滓、移動文件:
這里使用 git mv
命令完成操作,將 Welcome.txt
重命名為 README
吹缔,再進行提交商佑。改名之后提交的輸出能看到改名前后兩個文件的相似度,這里因為文件沒修改厢塘,所以相似度為 100%
茶没。
其實可以不使用 git mv
命令肌幽,而使用我們之前學(xué)過的 git rm
和 git add
兩條命令也能實現(xiàn)。
- 首先抓半,恢復(fù)到上一個版本:
可以看到喂急,welcome.txt
文件回來了。
- 這次不用
git mv
命令笛求,而是用mv
直接更改本地文件:
輸出表示 廊移, welcome.txt
被刪除了【D】,有一個沒被追蹤的 README
【??】探入。
- 在
README
文件增加一行狡孔,如下:
- 使用
git add -A
命令,相當于對修改文件執(zhí)行git add
新症,對刪除文件執(zhí)行git rm
步氏,對本地新增文件執(zhí)行git add
:
- 最后,進行提交:
這里通過 rm
命令本地移動文件的方式徒爹,使用 add -A
命令之后荚醒,查看狀態(tài)時,并不是 renamed
而是新增和刪除文件隆嗅。
三界阁、文件忽略
我們之前打了一個標簽叫做 " old_practice" ,現(xiàn)在再次執(zhí)行 git describe
看一下版本號:
也就是說:當前工作區(qū)的版本是 "tag" 后的第三個版本胖喳,提交 ID 是 3dffaeb
泡躯。【注意:要忽略ID前面的g】
當我們不想所有的文件都被 Git
追蹤丽焊,想讓指定的文件忽略(Git 當它們不存在较剃,不進行版本控制)時。那么技健,可以在這個目錄下写穴,創(chuàng)建一個名為為 .gitignore
的文件 【注意,前邊有個點】雌贱,把那些要忽略的文件寫在其中啊送,文件名可以使用通配符,比如:
先新建一個文件欣孤,用于測試效果馋没,先不忽略這個文件,看看狀態(tài):
可以看到 .gitignore 和 ignore_teset.txt
文件都顯示沒被追蹤降传,需要 add
操作∨穸洌現(xiàn)在,我們在 .gitgnore
中添加一行 ignore_test.txt
婆排,再查看一下狀態(tài):
發(fā)現(xiàn) ignore_teset.txt
被忽略了声旺,無論對這個文件做什么操作控硼,Git 都不管了。
實際上艾少,可以把自身添加到忽略文件當中,如下:
工作區(qū)非常干凈翼悴。.gitignore
通常是要添加到版本庫中的缚够,這樣別人 clone
項目之后,也能夠正常忽略指定的文件鹦赎,即文件忽略在他人的工作區(qū)中同樣生效谍椅。因為 .gitignore
文件是共享式的。
查看狀態(tài)的時候古话,可以加上 --ignored
來顯示被忽略的文件:
如果不想共享雏吭,想本地獨享忽略呢?有兩種實現(xiàn)方式陪踩。
第一種:針對具體版本庫的 "獨享式" 忽略杖们。即通過在版本庫的 .git
目錄下的文件 .git/info/exclude
來設(shè)置文件忽略。
第二種:全局的 "獨享式"忽略肩狂。即通過 Git
的配置變量 core.excludesfile
指定一個忽略文件摘完,其設(shè)置的忽略對所有本地版本庫均有效。
總結(jié):具體使用哪一種忽略方式傻谁,取決于實際的場景孝治。如果文件忽略對于所有使用此版本庫工作的人都有用,就在版本庫中創(chuàng)建一個 .gitignore
文件來建立忽略审磁。否則谈飒,如果工作區(qū)創(chuàng)建的是一個實驗性的目錄或文件,本不應(yīng)該讓他人知道态蒂,那么使用本地忽略杭措。
最后,我們簡單講一下 Git
忽略語法:
- 文件中的空行或以
#
開始的行會被忽略(相當于代碼編輯中的注釋)吃媒。 - 可以使用通配符瓤介,例如:
*
代表任意多字符,?
代表一個字符赘那,[abc] 代表可選字符范圍等刑桑。 - 如果名稱的最前面是一個路徑分隔符
/
,表明要忽略的文件在此目錄下募舟,而非子目錄的文件祠斧。 - 如果名稱的最后面是一個路徑分隔符
/
,表明要忽略的是整個目錄拱礁。 - 名稱最前面添加一個
!
琢锋,表示不忽略辕漂。
下面的文件忽略示例,包含了上述要點:
# 這是注釋行 -- 被忽略
*.a # 忽略所有以 .a 為擴展名的文件
!lib.a # 但是 lib.a 文件或目錄不要忽略吴超,即使前面設(shè)置了對 *.a 的忽略
/TODO # 只忽略此目錄下的 TODO 文件钉嘹,其他目錄或當前目錄的子目錄中的 TTODO 文件不忽略
build/ # 忽略所有 build/ 目錄下的文件
doc/*.txt # 忽略文件如 doc/notes.txt ,但是文件如 doc/server/arch.txt 不被忽略【沒寫到指定目錄級別不會被忽略】
總結(jié):文件 .gitignore
的作用范圍是其所處的目錄及其子目錄鲸阻,而且只對未被追蹤的文件有效跋涣,如果文件已經(jīng)加入版本庫了,忽略對其無效鸟悴。
四陈辱、文件歸檔
Git
提供了一個歸檔命令 git archive
,可以對任意提交對應(yīng)的目錄樹建立歸檔细诸,示例如下:
基于最新提交建立歸檔文件 latest.zip
沛贪。