Git應用詳解第五講:遠端倉庫Github與Git圖形化介面
前言
前情提要:Git應用詳解第四講:版本回退的三種方式與stash
這一節將會介紹本地倉庫與遠端倉庫的一些簡單互動以及幾款常用的Git
圖形化介面,讓你更加方便地使用git
。
一、Git
裸庫
簡單來說git
裸庫就是沒有工作區的git
倉庫。比如伺服器,只起到程式碼託管的作用而不需要也不應該修改伺服器上的程式碼。
可通過以下指令建立git
裸庫:
git init --bare
建立完成之後,檢視當前檔案目錄:
可以看到並不存在工作區目錄,表明git
裸庫僅僅是用來存放和中轉開發者提交的程式碼。
二、本地倉庫與遠端版本庫
- 本地倉庫:也就是之前所講的
git
倉庫,分為三個區:工作區,暫存區和版本庫; - 遠端版本庫:與本地版本庫相對應的遠端線上版本庫,屬於裸庫;
我們一般會在本地git
倉庫的工作區和暫存區中對檔案進行修改,然後提交到本地版本庫,並最終推送到遠端版本庫進行託管。整個流程如下圖所示:
遠端倉庫的實質就是本地倉庫中的版本庫對應的遠端版本庫,通常直接叫做遠端倉庫。
遠端倉庫(版本庫)的存在作用為:供多臺計算機間交換資訊,相當於交換兩個數過程中的第三方容器。
1.git push
與git pull
這兩個命令是我們使用遠端倉庫時非常常用的命令,它們十分的重要:
-
git push
:將本地倉庫某分支上的程式碼推送到遠端倉庫的某分支上;注意了,推送操作是分支對分支的,而不是將本地倉庫的所有分支都推送到遠端倉庫,如下圖所示(假設推送到遠端同名分支): -
git pull
:將遠端倉庫檔案拉取到本地版本庫,也就是將本地倉庫中沒有的檔案都拉取到本地倉庫的版本庫中,所以進行拉取操作後,本地倉庫的工作區是乾淨的:這裡的
st
為status
的別名,有關別名的內容,後續會進行詳細講解。
push
指令的完整寫法:
git push origin srcBranch:destBranch
其中srcBranch
表示的是本地分支,destBranch
表示的是遠端分支;
pull
指令的完整寫法:
git pull origin srcBranch:destBranch
其中srcBranch
表示的是遠端分支,destBrach
表示的是本地分支;
不要混淆了,可以這樣理解:srcBranch
表示從哪裡來,destBranch
表示到哪裡去;
git push
的三種情況
-
情況一:只有一個使用者操作遠端倉庫時,由於本地倉庫對所有的檔案和操作都進行了追蹤,所以即使本地倉庫刪除之前推送到遠端倉庫的檔案,再次執行推送時也不需要執行
git pull
操作。例如,遠端倉庫有這麼些檔案:
在對應的本地倉庫中將其他檔案刪除,只留下
README.md
,此時再向該遠端倉庫推送。推送過程十分順利,並不需要執行git pull
操作拉取合併遠端倉庫中的檔案。 -
情況二:也是隻有一個使用者操作遠端倉庫,但是不通過本地推送來更新遠端倉庫,而是直接為遠端倉庫新增檔案,比如手動新增
README.md
。這個時候,由於本地倉庫並沒有對遠端倉庫中新增的
README.md
進行追蹤,所以再次推送時會出現如下錯誤:此時需要執行
git pull
操作對遠端倉庫中新增的檔案進行拉取、合併與追蹤,之後才能進行git push
。 -
情況三:多人共用同一遠端倉庫,比如使用者
A
和B
,這個時候由於遠端倉庫上有A
提交的而B
沒有的檔案。所以B
在執行git push
前,要先執行git pull
操作,將遠端倉庫中這些沒有的檔案進行拉取、合併與追蹤。
git pull
實質
在進行拉取操作的過程中,會執行合併操作(merge
),合併操作可能成功也可能失敗:
- 如果
merge
成功:說明兩個人修改的不是一個檔案,或者是一個檔案的不同地方,這樣git
會直接使用Fast-forward
方式自動合併; - 如果
merge
失敗:說明兩個人可能修改了同一檔案的同一行,這時候就需要進行手動合併,解決檔案發生的衝突;
合併完成之後才能進行push
操作,將本地倉庫的程式碼推送到遠端倉庫;
pull
操作其實是fetch
操作和merge
操作的合成:
-
fetch
指令的作用為:將遠端倉庫中的所有檔案拉取到本地倉庫的版本庫中; -
merge
指令的作用為:合併拉取到本地的檔案;
2.Github
和Gitlab
- 先有
Github
後有Gitlab
Gitlab
為內網的Github
,即Gitlab
為內網的git
遠端伺服器,程式碼不開源,僅供公司內網使用者使用,並且可以設定管理許可權。
Github
不多介紹,世界上最大的開源及私有軟體專案的託管和同性交友平臺;
Gitlab
Gitlab
可作為內網的遠端程式碼託管伺服器,一般都是安裝在Linux
系統上:
三、本地倉庫 ->
遠端版本庫
1.建立聯絡
在Github
上克隆專案時,主要可以採用兩種協議:HTTP/HTTPS
協議和SSH
協議:
當使用HTTP/HTTPS
協議建立本地倉庫與遠端倉庫的聯絡時,不用進行任何配置,但是每次進行推送時都需要輸入賬號密碼。而使用SSH
協議,只需要進行一次配置,就可以實現免密推送。
HTTP/HTTPS
協議
- 克隆
Github
上的專案時,可以採用該協議:
- 建立本地倉庫與遠端倉庫連線時,也可以採用該協議:
git remote add origin https://github.com/AhuntSun/test.git
其中的origin
表示遠端倉庫的意思,可以不叫這個名字,但是約定俗成叫origin
。執行完這條命令之後,就可以採用origin
來代表遠端倉庫的URL
了。
但是,在進行推送時,由於Github
上的專案有許可權管理,除了遠端倉庫的創立者本人,其他使用者都無權進行程式碼的推送。所以,每次將本地倉庫的程式碼進行推送時,都需要輸入賬號密碼驗證推送者身份。
SSH
協議
雖然公網上推薦使用HTTPS
協議進行加密傳輸;但是,在公司內網中只有HTTP
協議,每次推送程式碼都需要重複輸入使用者名稱和密碼,比較不方便;因此,可以採用SSH
協議進行身份驗證,過程如下:
-
首先,採用
SSH
地址關聯遠端倉庫:git remote add origin [email protected]:AhuntSun/test.git
注意到,
Github
已經提示我們當前Github
賬號沒有任何SSH
公鑰。 -
新增之後,檢視遠端倉庫地址:
git remote show origin
如圖所示,本地倉庫沒有遠端倉庫的訪問許可權。這是因為我們並沒有將本地的
SSH
公鑰部署到遠端倉庫上,為了解決這個問題,我們需要在本地生成祕鑰對,並將其中的公鑰部署到遠端倉庫上。
生成祕鑰對
在.ssh
資料夾下有一個known_hosts
的檔案:
開啟該檔案,可以看到遠端倉庫Github
的IP
地址已經新增到了本地信任地址中:
接下來,使用以下命令生成本地計算機的公鑰和私鑰:
ssh-keygen
在生成過程中,可以選擇公鑰和私鑰的儲存地址,預設是儲存在.ssh
資料夾下的;還可以設定密碼,也可以不設定,直接兩次回車後成功生成公鑰和私鑰;
可以看到.ssh
資料夾下多了兩個檔案:
其中,id_rsa
表示私鑰,id_rsa.pub
表示公鑰,我們可以分別檢視一下它們的內容:
- 公鑰:
- 私鑰:
部署公鑰
接著我們要做的就是把生成的公鑰部署到遠端倉庫Github
上,如下圖所示:
在該介面中可以新增多個公鑰,如果專案組會有多個成員,或者一個人使用多臺電腦時可以設定多個公鑰:
如圖所示,可以自定義公鑰的名字。注意:一定要勾選Allow write access
選項,否則無法將本地倉庫程式碼推送到該遠端倉庫。並且,新增時需要輸入Github
賬號密碼進行確認:
新增完成後,就可以在原來的介面看到新增的公鑰了。這樣使用該公鑰的本地計算機就具有了讀寫這個遠端倉庫的許可權了;
完成公鑰的部署後,就可以成功地檢視遠端倉庫的地址了:
實際開發中,通常會使用SSH
協議進行本地倉庫與遠端倉庫的連線。因為只需要配置一次公鑰,就可以進行免密推送,十分方便;
新增賬戶SSH
之前在Github
上的test
倉庫中添加了一把SSH
公鑰,但是該SSH KEY
僅限於本地與test
倉庫的通訊,不能在其他倉庫中使用。
如果我們想要讓Github
上的所有倉庫都使用同一把SSH KEY
,就需要配置針對賬號的SSH KEY
了。點選Github
右上角的Settings
:
在該介面可以新建全域性的SSH KEY
:
2.推送程式碼
建立了本地倉庫與遠端倉庫的聯絡之後,就可以將本地倉庫的檔案推送到遠端倉庫了:
git push -u origin master
上述指令表示將本地的master
分支推送到遠端倉庫的master
分支上,加上-u
表示將本地的master
分支與遠端的master
分支建立關聯;再次推送時就可以直接通過git push
進行推送了。
3.檢視遠端倉庫地址
可以通過以下三種方法檢視所有與本地倉庫關聯的遠端倉庫的地址:
git remote //只顯示遠端倉庫地址名
git remote -v //顯示遠端倉庫地址名和對應URL
git remote show origin//顯示詳細資訊
在通過git remote show origin
顯示的詳細資訊中:
-
Fetch URL
:表示拉取檔案到本地的遠端倉庫的URL
; -
Push URL
:表示推送時的遠端倉庫的URL
; -
可以看到進行
git pull
和git push
操作時,本地與遠端分支之間是一一對應的關係;
4.修改遠端倉庫地址
- 方法一:刪除原有地址,再新增新的
URL
git remote rm origin
git remote add origin https://gitee.com/ahuntsun/gitTest.git
- 方法二:修改原有的遠端倉庫
URL
git remote set-url origin https://163.com
- 方法三:直接修改
.git
倉庫的config
檔案
不建議使用這種方法,建議使用命令列修改。手動修改時,可能只是修改了一部分(不全)。這樣可能會造成一些無法維護的情況;
注意:儘量避免直接手動操作檔案,對於常見的,合理的操作
git
都提供了相應的指令,使用這些指令更加安全和高效。
對於git
來說,預設情況下,它的遠端倉庫的地址都叫origin
;當需要為本地倉庫新增多個遠端倉庫地址時,可通過以下方式:
git remote add newOrigin https://biliwa.com
不過,在將本地倉庫的檔案推送到不同的遠端倉庫時,需要重新建立關聯:
git push -u newOrigin master
與遠端倉庫的相關分支建立關聯後,可直接使用git push
進行推送(簡寫的原理將在下一節進行講解)。
四、Git
圖形化介面
Git
圖形化介面非常之多,各種圖形化介面的操作不盡相同。但是,它們的實質都是一樣的。都是通過執行一條條Git
命令,來實現圖形化介面中的各種操作。因此,在熟練掌握Git
底層操作命令的前提下,再使用Git
圖形化介面會更加得心應手。因此,十分不建議初學者直接從Git
圖形化介面入門。
下面簡單介紹比較常見的四種Git
圖形化介面,分別是:gitk
、Git Gui
、Github DeskTop
和SourceTree
1.gitk
gitk
是git
自帶的圖形化介面,輸入命令:gitk
,就可以開啟下圖所示的圖形化介面:
在gitk
圖形化介面中:
-
左側表示提交歷史,從下往上,從舊到新;
-
右邊的兩欄分別是每次提交對應的使用者和時間;
該介面很好地展示了git
合併的原則:三方合併,如下圖所示:
append 1
和append 2
兩次提交的合併過程為:找到它們公共的父節點add a hello
,然後在該節點的基礎上合併兩個節點,得到合併後的master
節點。該節點有兩個parent
指標,分別指向append 1
和append 2
;
gitk
介面的下半部分如下圖所示:
- 上圖的
SHA1 ID
表示每次提交的識別碼,也就是commit_id
; Author
和Committer
分別表示程式碼的作者和程式碼的提交者,一般情況下二者是同一人;但是在一些開源專案中,程式碼的作者是沒有權力提交程式碼的(如Github
)。只能提交一個補丁issue
,待開源專案作者同意修改後,才會由專案作者代替程式碼作者提交程式碼;- 再下面的就是各個檔案修改的詳細資訊;如下圖所示,
Parent
表示的是上一次提交,Child
表示的是下一次提交:
2.Git Gui
Git Gui
同樣也是git
內建的圖形化介面,輸入git gui
命令便可開啟:
在上圖中:
Unstaged Changes
:表示未新增到暫存區的檔案或改動,即工作區檔案;Staged Changes
:表示暫存區中的檔案或改動,即將被提交;Modified,not stage
:表示檔案已修改但未被納入暫存區;
通過git add .
可將所有改動納入暫存區:
執行完上述指令後,再次檢視Git Gui
會發現,檔案轉移到了Stage Changes
區域中。隨後可以直接在Git Gui
介面進行提交,如下圖所示:
Git Gui
中的每一步操作,實際上都是通過命令列中的一條條指令實現的。除此之外,Git Gui
的選單欄還提供了很多功能:
3.Github DeskTop
這是Github
的客戶端應用程式,同樣屬於Git
圖形化介面:
在介面的File
選項中可以新增一個本地倉庫進行管理:
新增後可以檢視該本地倉庫的提交歷史和其他相關資訊:
4.Sourcetree
這是一個比較受歡迎的Git
圖形化介面,官方網址為:https://www.sourcetreeapp.com/
安裝時需要註冊一個賬號:
安裝完成後,就可以使用了:
功能十分強大,使用起來也十分地方便,這裡就不詳細介紹了,有興趣的可以查閱網上的資料。
以上就是本節的全部內容,本節簡單地介紹了使用
Git
實現本地倉庫與遠端倉庫的互動,以及四種常見的Git
圖形化操作介面。看到這裡相信你已經對本地倉庫與遠端倉庫的關係有了一定的認識,並且會抱有不少的疑問。沒關係,在下一節當中,將會詳細地為你介紹如何使用遠端倉庫進行多人協作開發,我們下一節再見!