本篇博客是整理git相關知識的第一篇,因為之前一直是用SourceTree對Git的命令行操作用的不是特別熟,於是乎過了一遍ProGit(鏈接:https://git-scm.com/book/zh/v1)。本篇博客以及后邊的將要發的幾篇博客是對之前看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的命令的一些操作。
備注:接下來的幾篇博客的終端操作都是在 Mac 上使用的 ITerm完成的,終端上裝的是oh-my-zsh (https://github.com/robbyrussell/oh-my-zsh)。
一、獲取遠程倉庫
為了方便做一些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命令的其他基礎操作。