前情提要:Git應用詳解第四講:版本回退的三種方式與stashgit
這一節將會介紹本地倉庫與遠程倉庫的一些簡單互動以及幾款經常使用的Git
圖形化界面,讓你更加方便地使用git
。github
Git
裸庫簡單來講git
裸庫就是沒有工做區的git
倉庫。好比服務器,只起到代碼託管的做用而不須要也不該該修改服務器上的代碼。安全
可經過如下指令建立git
裸庫:bash
git init --bare
複製代碼
建立完成以後,查看當前文件目錄:服務器
能夠看到並不存在工做區目錄,代表git
裸庫僅僅是用來存放和中轉開發者提交的代碼。app
git
倉庫,分爲三個區:工做區,暫存區和版本庫;咱們通常會在本地git
倉庫的工做區和暫存區中對文件進行修改,而後提交到本地版本庫,並最終推送到遠程版本庫進行託管。整個流程以下圖所示:ssh
遠程倉庫的實質就是本地倉庫中的版本庫對應的遠程版本庫,一般直接叫作遠程倉庫。post
遠程倉庫(版本庫)的存在做用爲:供多臺計算機間交換信息,至關於交換兩個數過程當中的第三方容器。fetch
git push
與git pull
這兩個命令是咱們使用遠程倉庫時很是經常使用的命令,它們十分的重要:ui
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
指令的做用爲:合併拉取到本地的文件;
Github
和Gitlab
Github
後有Gitlab
Gitlab
爲內網的Github
,即Gitlab
爲內網的git
遠程服務器,代碼不開源,僅供公司內網用戶使用,而且能夠設置管理權限。Github
很少介紹,世界上最大的開源及私有軟件項目的託管和同性交友平臺;
Gitlab
Gitlab
可做爲內網的遠程代碼託管服務器,通常都是安裝在Linux
系統上:
->
遠程版本庫在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 git@github.com: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
:
創建了本地倉庫與遠程倉庫的聯繫以後,就能夠將本地倉庫的文件推送到遠程倉庫了:
git push -u origin master
複製代碼
上述指令表示將本地的master
分支推送到遠程倉庫的master
分支上,加上-u
表示將本地的master
分支與遠程的master
分支創建關聯;再次推送時就能夠直接經過git push
進行推送了。
能夠經過如下三種方法查看全部與本地倉庫關聯的遠程倉庫的地址:
git remote //只顯示遠程倉庫地址名
git remote -v //顯示遠程倉庫地址名和對應URL
git remote show origin//顯示詳細信息
複製代碼
在經過git remote show origin
顯示的詳細信息中:
Fetch URL
:表示拉取文件到本地的遠程倉庫的URL
;
Push URL
:表示推送時的遠程倉庫的URL
;
能夠看到進行git pull
和git push
操做時,本地與遠程分支之間是一一對應的關係;
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
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
表示的是下一次提交: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
的菜單欄還提供了不少功能:
Github DeskTop
這是Github
的客戶端應用程序,一樣屬於Git
圖形化界面:
在界面的File
選項中能夠添加一個本地倉庫進行管理:
添加後能夠查看該本地倉庫的提交歷史和其餘相關信息:
Sourcetree
這是一個比較受歡迎的Git
圖形化界面,官方網址爲:www.sourcetreeapp.com/
安裝時須要註冊一個帳號:
安裝完成後,就可使用了:
功能十分強大,使用起來也十分地方便,這裏就不詳細介紹了,有興趣的能夠查閱網上的資料。
以上就是本節的所有內容,本節簡單地介紹了使用
Git
實現本地倉庫與遠程倉庫的互動,以及四種常見的Git
圖形化操做界面。看到這裏相信你已經對本地倉庫與遠程倉庫的關係有了必定的認識,而且會抱有很多的疑問。不要緊,在下一節當中,將會詳細地爲你介紹如何使用遠程倉庫進行多人協做開發,咱們下一節再見!