1. 程式人生 > >git版本控制系統小白教程(下)

git版本控制系統小白教程(下)

>前言:本文主要介紹git版本控制系統的一些基礎使用,適合小白入門,因為內容較多,會分為兩部分進行分享,檢視上部請點[傳送門](https://www.cnblogs.com/miki-peng/p/12548728.html)。 # 刪除檔案 ​ git刪除檔案一般有三種情況,第一種是在工作區修改了檔案,但是還沒有新增到暫存區;第二種是已經新增到暫存區但是還沒有提交到版本庫中;第三種就是已經提交到版本庫中。 ## 撤銷工作區的修改 ​ 在工作區修改了檔案,但還未新增到暫存區,即撤銷在工作區對檔案的修改動作,在前面檢視版本狀態的章節,我們已經介紹了一個命令,就是`git restore `,新版本都會提示使用這個命令,舊版本則是提示使用`git checkout -- `這個命令,它與新版命令的用法其實沒什麼區別,一樣可以撤銷工作區的修改,但這個命令有兩種使用情況: 1.如果我們在檔案修改後,檔案還未新增到暫存區,想要把修改的全部撤回,那麼使用該命令可以撤銷修改的部分,回到這個檔案的上一個版本。 2.如果檔案已經新增到暫存區後,再一次修改了檔案,使用該命令就可以撤銷修改,回到新增到暫存區時的那一個版本。 ​ 需要注意的是,`git checkout -- `命令中有兩個`--`,如果沒有了`--`,它就不是撤銷命令了,變成了切換分支命令`git checkout`,後面的章節中會提到這個命令。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514225310550-1535150045.png) ## 從暫存區移除 ​ 我們提交檔案到版本庫,一般需要兩步,先新增到暫存區再提交到版本庫,檔案新增到暫存區時,我們可能不想提交了,那麼就需要把他從暫存區中移除。 ​ 前面檢視版本狀態的章節,我們已經介紹了一個命令`git restore --staged `,同樣的,這是新版的命令,我們安裝了新版就使用新版命令就好了,仍使用舊版的同學,就可以使用`git reset HEAD `這個命令,用法是一樣的。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514225149158-827919478.png) ## 刪除版本庫的檔案 ### 1.git rm 刪除檔案 ​ 一般我們在作業系統上刪除檔案,就是右鍵刪除,但在git中,你在工作區刪除了檔案,實際上只是刪除了你本地,版本庫中該檔案仍然是存在的,比如tets_login.py
檔案,在作業系統右鍵刪除後我們檢視一下git狀態。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514225344832-5200926.png) ​ git知道你刪除了哪些檔案,並且工作區和版本庫已經不一致了。這時你有兩個選擇,一是執行`git rm `,並且執行`git commit`命令去刪除版本庫對應的檔案,保持工作區和版本庫一致。二是使用`git restore `撤銷對工作區的修改,把刪除的檔案還原,這樣也可以保持工作區和版本庫一致。 [](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514225412307-1615885123.png) ​ 我們也可以不在工作區操作(即右鍵刪除),直接從版本庫中刪除檔案,使用`git rm `把刪除動作新增到暫存區,然後`git commit`真正地從版本庫中刪除。我們想要真正地影響到版本庫,都需要執行commit,否則它就只是對工作區產生影響。 ​ 這裡要注意的是,如果我們直接執行了`git rm `,但還未提交到版本庫,想要還原到工作區時,就需要先執行`git restore --staged `移除暫存區,再執行`git restore `撤銷對工作區的修改。 ### 2.git rm --cached 只刪除版本庫的檔案 ​ 使用`git rm`且`git commit`之後檔案會從本地中刪除,且會從版本庫中刪除。如果我們只想刪除版本庫的檔案保留工作區的,我們可以在刪除命令加上一個`--cached`引數,同樣的執行時需要commit一下,如果想撤銷,方法同上。我們不需要死記硬背這些命令,檢視版本狀態時它會提示你可以使用哪些命令。 ### 3.git rm *.txt 刪除符合規則的檔案 ​ 我們在忽略特殊檔案的章節有提到過glob模式匹配,這裡刪除檔案也支援模式匹配,比如`git rm *.txt`意思就是說刪除所有的txt檔案。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514225502682-1069346990.png) # 移動檔案 ​ git可以使用`git mv `來移動檔案,需要輸入舊檔名,新檔案位置,新檔案位置還可以重新命名,如把test.txt移動到doc目錄下,並且重新命名為readme.txt: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230216747-1216890053.png) ​ 我們第一步執行的時候,提示`No such file or directory`意思是說沒有text.txt
檔案或者目錄不存在,因為我們目錄沒有建立,因此需要手動建立一個目錄或者直接使用linux命令建立一個目錄,就可以移動成功了,移動後記得要執行commit才會對版本庫生效。 ​ git這一個移動檔案的命令實現原理很簡單,其實就是執行了下面三個動作: + `mv `:linux移動命令 + `git rm `:刪除舊檔案 + `git add `:新增新檔案到暫存區 # 版本補錄 ​ 什麼是版本補錄,就是我們在修改檔案提交版本時遺漏了某些檔案的提交,或者有了新的修改但又不想重新提交一個版本,希望補錄在上一個版本中。 ​ 我們只需要在執行commit時增加一個`--amend`引數,即`git commit --amend`,如提交了一個版本後,再次修改了readme.txt,然後執行該命令進行補錄。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230240902-1528865209.png) ​ 上面補錄時加了`-a`引數直接一步到為提交到了版本庫,提交到版本庫後會進入版本資訊的vim(vi)介面,vim是unix系統文字編輯器,學過linux的同學應該都有了解。這裡它進入vim介面我們可以修改增加版本的一些備註資訊,如果不需要修改,可以通過按下Esc
退出編輯狀態,然後連按兩次大寫字母Z,就可以退出vim了。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230330269-701142755.png) ​ 退出vim模式後,我們再檢視一下版本資訊就會看到最近的一個版本有兩次提交記錄,其中一次是補錄的。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230350684-1277302863.png) # 版本標籤 ​ git標籤(tag)的作用主要是快速地定位版本以及版本間的區分,毎次釋出一個版本時,我們通常都會在版本庫中打上一個標籤,標籤可以跟蹤到版本。之後不管在什麼時候,我們都可以通過一個標籤,把對應的歷史版本取出來。因此,標籤實際上就是版本庫的一個快照。 ​ 但你可能回想,我們commit的時候不是生成了一個版本唯一id嗎?版本id是一連串的字元,不容易記住且無法辨別是哪一個版本。總而言之,標籤就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。 ## 附註標籤 ​ git使用的標籤有兩種型別:輕量標籤(lightweight)和附註標籤(annotated)。附註標籤實際就是儲存在版本庫中的一個獨立物件,它有自身的一些校驗資訊,包含標籤名、作者的資訊、標籤日期以及標籤說明。一般我們都會使用附註標籤,方便檢視更多的標籤資訊。 ​ 關鍵命令:`git tag -a -m '標籤說明'`這裡的-a指的是附註(annotated) ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230406820-133240518.png) ​ 打上標籤之後,我們檢視版本資訊會發現最近的一個版本多了一個tag,因為git預設標籤是打在最新提交的一個版本上的。 ## 輕量標籤 ​ 如果我們只是臨時加的標籤,不需要額外的一些標籤資訊,我們就可以使用輕量版標籤。 ​ 關鍵命令:`git tag `,預設是給最近的一個版本打上標籤 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230417259-539502838.png) ## 檢視指定標籤 ​ 使用`git show `檢視指定標籤的資訊 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230459287-912853373.png) ​ 從上圖我們可以看出查詢的標籤是一個附註標籤,它有很多一些附帶的資訊,如標籤名、作者的資訊、標籤日期以及標籤說明;那輕量標籤又是如何呢?下面這個就是一個輕量標籤了,它只是簡單的打了一個標籤,沒有更多的資訊了。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230520136-1090524508.png) ## 檢視所有標籤 ​ 使用`git tag`可以檢視版本庫中有哪些標籤,標籤名按字母排序。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230529630-1808276465.png) ## 檢視匹配標籤 ​ 這裡檢視標籤同樣適用glob模式匹配,關鍵命令:`git tag -l 匹配規則`,-l表示以列表形式檢視標籤,如檢視v開頭的標籤: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230539152-790097369.png) ​ 因為只打了一個v開頭的標籤,因此只顯示一個。 ## 補錄標籤 ​ 預設標籤是打在最新提交的commit上的。那麼如果commit時忘了打標籤怎麼辦呢?答案就是找到歷史提交的commit的id,在標籤命令的然後打上標籤即可。關鍵命令:`git tag 版本號` ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230550128-956472171.png) ​ 當然,補錄的時候我們是可以選擇補錄附註標籤還是輕量標籤的,根據相關命令補充引數即可。 ## 刪除標籤 ​ 如果標籤打錯了,可以刪除標籤。關鍵命令:`git tag -d `,-d表示delete ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230559211-1569223833.png) ​ 因為我們建立的標籤預設都只儲存在本地,不會自動推送到遠端,因此打錯的標籤可以在本地直接刪除。 ​ 這是為什麼呢,因為git pull推送時並不會把標籤也推送到遠端伺服器上,只有通過顯示命令才能把標籤推送出去,關鍵命令:`git push origin `,或者一次性推送所有標籤`git push origin --tags`,關於推送,會在後面的章節介紹。 ​ 如果標籤已經推送出去,要刪除標籤就需要先刪除本地,再從遠端刪除,遠端刪除命令:`git push origin :refs/tags/`。 # 分支管理 ## 分支的工作方式 ​ 幾乎每個版本控制系統都支援分支管理,使用分支意味著你可以從開發主線上分離出來,在不影響主線的同時繼續工作,在前面多次commit和檢視版本,可以知道每次commit,git都會把他們串成一條時間線,這條時間線就是一個分支,目前為止,我們的git裡只有一條時間線,即主分支(master分支)。 ​ 另外,我們檢視版本資訊的時候,會發現最新的commit上總會有一個`HEAD`的標識,如下圖: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230614599-2088020386.png) ​ `HEAD`是什麼意思呢,它可以理解為“頭指標”,指向當前工作區的分支,當分支很多時,git如何知道你在哪條分支上工作呢,就是通過`HEAD`來標識。因為當前只有master主幹,沒有其他分支,因此`HEAD`是一直指向master的。 ​ 這裡我們要明白,`HEAD`是指向分支的,不是指向commit,master(分支)才是指向commit,開始的時候,master分支是一條時間線,git用master指向最新的commit,再用`HEAD`指向master,這樣就能明確知道當前的分支,以及當前分支的提交點,如下圖: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230628535-327153776.png) ​ 之後每一次commit,master分支就會向前移動一步,隨著不斷的提交,master分支的時間線就會越來越長(在沒有其他分支的情況下)。 ​ 當我們建立分支的時候,比如建立一個dev分支,git就會新建一個dev指標,指向跟master一樣的commit,再把`HEAD`指向dev,表示當前是在dev分支上,如下圖: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230639630-1501448580.png) ​ git建立一個分支是很快的,因為它只是增加了一個dev指標,改變一下`HEAD`的指向,而工作區的檔案是沒有任何變化的,但從現在開始,之後對工作區的修改和commit都是針對dev分支了,每次commit,dev都會往前移一步,而master指標不變,如下圖: ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230647863-1235695187.png) ​ 假如我們在dev分支上的工作已經完成了,就可以把dev合併到master上。那git如何分支呢?顯然,直接把master指向dev最新的commit就可以完成合並了,因此,git的合併分支也很快,改一下指標即可,工作區內容不變。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230659136-2105762421.png) ​ 合併完分支之後,甚至可以把dev分支刪掉,這裡刪除分支其實就是把dev指標刪掉,因為我們已經合併完成了,刪掉後,這條時間線就只剩下一個master分支。 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230709565-842720487.png) ## 分支操作 ### 1.建立分支 ​ 關鍵命令:`git branch ` ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230717726-880911410.png) ### 2.檢視分支 ​ 關鍵命令:`git branch`,*號代表當前所屬分支 ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230727435-1661946626.png) ### 3.切換分支 ​ 關鍵命令:`git checkout ` ![](https://img2020.cnblogs.com/blog/1804660/202005/1804660-20200514230735263-528759350.png) ​ 也可以直接在建立分支時加上一個`-b`引數(branch-分支的縮寫),表示建立並切換,完整命令:`git checkout -b `,相當於執行了建立和切換兩個命令。 ​