1. 程式人生 > >Git知識總覽(一) 從 git clone 和 git status 談起

Git知識總覽(一) 從 git clone 和 git status 談起

本篇部落格是整理git相關知識的第一篇,因為之前一直是用SourceTree對Git的命令列操作用的不是特別熟,於是乎過了一遍ProGit(連結:)。本篇部落格以及後邊的將要發的幾篇部落格是對之前看ProGit時的筆記的整理。當然在整理時,根據具體示例來梳理了一下知識點,和ProGit上的講解順序有些區別。本篇部落格聊了Git基礎操作的一部分,主要是基於Github上Fork的Masonry倉庫來做的,首先Clone相關倉庫,然後根據git status命令的提示引出了一系列的命令操作。

Git的原理就不做過多贅述了,ProGit上聊得挺好。不過還是要聊一下集中版本控制系統和分散式版本控制的區別。在版本管理中主要包含集中化的版本控制系統

 (Centralized Version Control Systems,簡稱 CVCS) 例如 CVS、Subversion 以及 Perforce 等 ,和分散式版本控制系統(Distributed Version Control System,簡稱 DVCS), 例如Git、Mercurial、Bazaar 以及 Darcs  。DVCS的特點為每一次的克隆操作,實際上都是一次對程式碼倉庫的完整備份。 其中檔案的狀態主要包括已提交(committed)、已修改(modified)和已暫存(staged) 的。這些東西就不細說了,先看一下git的命令的一些操作。

一、獲取遠端倉庫

為了方便做一些git相關的基礎操作,就是使用在github上Fork的Masonry的倉庫做實驗吧,然後基於此Fork的倉庫來展開接下來的相關內容。

  

第一步要做的就是將遠端倉庫中的程式碼克隆到本地,git clone 命令做的就是這件事情。其後邊跟的引數就是上述截圖中的地址,其具體操作如下所示:

  

在第一部分我們就先簡單的看一下 git clone 的演示操作。首先使用了git clone 命令將遠端的程式碼以及相關分支資訊clone到本地,然後在本地進行了一次提交(git commit), 最後將提交push到遠端。在接下來的幾篇部落格中會陸陸續續的介紹到,在此就先不多說了。

  

二. 由 git status 命令引起的其他命令

我們可以使用 git status 命令來檢視相關檔案的狀態,在下方的操作中首先我們對README.md

檔案使用vim編譯器進行修改並儲存, 然後建立了一個名為NewCreateFile的檔案。並使用git status命令來檢視其相關的狀態。

從下方輸出的結果中不難看出README.md的檔案狀態為 modified, 也就是被修改了,更詳細的提示為 “Changes not stagged for commit”, 也就是說檔案被修改了,但是還沒有在提交(commit)前進行儲存(staged)。並且給了相關的提示,可以使用 git add <檔名>命令進行儲存,或者使用 git checkout -- <檔名> 命令放棄在工作目錄中的修改。

而我們剛建立的 NewCreateFile 檔案處於Untracked (未被跟蹤的狀態),並且可以使用git add <檔名>來將該建立的NewCreateFile新增到可以被提交(commit)的內容當中去。並且還給出了一條建議,可以對 NewCreateFile 檔案使用 git commit -a 來直接進行提交。

如果你對git的各種狀態比較熟悉了,也可以使用 git status -s 來檢視簡寫的狀態,這種簡寫的狀態和SVN上的差不多 M - 被修改,A - 被新增,D - 被刪除,R - 重新命名,?? - 未被跟蹤 等等,下方遇到其他的狀態符號時在一一解釋。

  

根據上面git status命令的提示內容,我們至少可以得到三種命令的使用方式:

  • 暫存檔案的命令:git add <檔名>
  • 放棄未暫存檔案的修改命令:git checkout -- <檔名>
  • 將被修改的檔案暫存並提交的命令:git commit -a 

1、git add

接下來我們可以看一下git add的命令,下方分別將上述兩個檔案進行了add, 也就是將檔案進行暫存。暫存後,使用了git status命令檢視狀態,提示這些修改可以被提交了,並且還可以使用 git reset HEAD <檔名>來取消相關檔案的暫存。使用 git status -s 命令來檢視 狀態標記由原來的紅色改成了綠色,並且NewCreateFile的狀態標記由??變成了 A  (新新增檔案)。

  

2、git reset HEAD 

接下來我們根據提示,看一下 git reset HEAD <檔名> 命令的操作,下方分別對已經暫存的兩個檔案執行了 git reset HEAD <檔名>操作,如下所示。從操作後的結果可以看出,兩個檔案的狀態是一夜回到瞭解放前,又回到了之前暫存的狀態。

  

3、git checkout -- <檔名>

接下來我們在看一下對未暫存的修改檔案進行回滾的操作命令: git checkout -- <檔名>,根據上面的提示我們可以知道該操作可以放棄對某個為暫存的檔案的修改。接下來我們就來看一下這個命令的操作。不過有一點需要注意,該操作如果生效了,再想找回被丟棄的內容就找不回了。也就是說git checkout -- <檔名>是不可逆的,因為其回滾的內容並沒有在git中進行暫存和記錄。從下方的操作我們可以看出被修改的README.md回到了未被修改的狀態之前。

  

4、git commit -a

接下來我們來看一下上面提到的命令git commit -a 的操作,首先我們再次對README.md進行修改,然後檢視一下狀態。接著使用 git commit -a -m "提交說明" 來進行新增和提交。從該命令執行後的狀態中我們可以看到,git commit -a 只對 狀態為M的檔案有用,而對新增而為新增的問題是不起作用的,因為我們新新增的檔案NewCreateFile仍然處於 Untracked 狀態中。

  

我們可以使用 git add 命令對 NewCreateFile 檔案進行暫存,使用 git commit 命令對暫存的內容進行提交。提交後,我們檢視狀態時看到一個提示, 大概是說你的分支已經領先遠端的主分支2個提交,可以使用 git push 操作來發布你本地的提交。

  

5、git push

下方是git push操作的相關內容,我本地是配了github的ssh-key的,不過之前clone的時候使用的是https的方式,需要在第一次PUSH的時候都要求輸入使用者名稱和密碼。每次都輸入使用者名稱和密碼挺麻煩的稍後我們將使用git的其他命令將其解決掉。

  

push完畢後,我們可以動github上相應的倉庫中可以看到其相關的修改內容了,具體如下:

  

由上面的內容,不難發現,從一開始的git status命令,根據相關提示,引出了其他相關命令。下方是對其相關命令的總結:

  • git status : 檢視當前倉庫中檔案的狀態。
  • git status -s : 檔案狀態的簡寫(M - 修改, A - 新增, D - 刪除, R - 重新命名,?? - 未追蹤)。
  • git add <檔名> :將後方緊跟的檔案進行暫存,以便commit使用。
  • git reset HEAD <檔名> : 將已經暫存的檔案進行撤銷,回到未暫存的狀態。
  • git checkout -- <檔名> :撤銷對尚未暫存檔案的修改,該操作不可逆,慎用。
  • git commit -a : 對那些被修改的檔案單尚未暫存和提交的檔案進行暫存和提交。注意:對未暫存的新增檔案無效。
  • git commit : 對暫存區的檔案進行提交到本地倉庫。
  • git push : 將本地倉庫已經提交的內容釋出到遠端。

三、檢視和修改遠端地址

1、新增遠端倉庫地址

根據上面的操作可以看到,上面的遠端連結是https的。因為我本地是賠了github的ssh-key的,所以也是支援ssh的連結的。下方我們將根據 git remote 遠端倉庫操作來新增上ssh的倉庫地址。下方是一系列的操作:

  • 首先通過 git remote -v 命令來檢視當前倉庫的遠端地址,從下方看到是 https格式的。
  • 然後在通過 git remote add 遠端倉庫地址別名 <url> 來新增一個新的倉庫地址,下方新增的是一個ssh的倉庫連結。
  • 接著我們再次對遠端倉庫的連結檢視時,就會看到相應的新新增的倉庫地址。
  • 然後我們隊README檔案做了點修改,並push遠端。在 push 時我們選擇了後來新增的新的遠端倉庫,可以看出使用的是別名。

  

下方是push後從github上對應的倉庫看到的相關內容,也是可以看到的修改的相關內容的。

  

2、遠端倉庫地址刪除和重新命名

從上面的內容不難看出,兩個倉庫地址其實是重複的。現在我們沒必要都將其進行儲存了。我們要刪掉那個https的倉庫,下方是具體的操作步驟。

  • 首先通過 git remote -v 來檢視目前現有的遠端倉庫。
  • 然後通過 git remote rm origin 命令來刪除別名為 origin 的遠端地址,刪除後,再次檢視時,origin的倉庫地址就木有了。
  • 緊接著使用 git remote rename origin_ssh origin 命令,將origin_ssh重新命名為origin即可。
  • 最後我們還可以使用 git remote show origin 命令來檢視push到遠端的那個分支上,具體操作步驟如下所示。

  

今天部落格就先到這兒,下篇部落格會繼續聊git命令的其他基礎操作。