Git應用詳解第五講:遠程倉庫Github與Git圖形化介面

前言

前情提要:Git應用詳解第四講:版本回退的三種方式與stash

這一節將會介紹本地倉庫與遠程倉庫的一些簡單互動以及幾款常用的Git圖形化介面,讓你更加方便地使用git

一、Git裸庫

簡單來說git裸庫就是沒有工作區的git倉庫。比如伺服器,只起到程式碼託管的作用而不需要也不應該修改伺服器上的程式碼。

可通過以下指令創建git裸庫:

git init --bare

創建完成之後,查看當前文件目錄:

image-20200329192222085

可以看到並不存在工作區目錄,表明git裸庫僅僅是用來存放和中轉開發者提交的程式碼。

二、本地倉庫與遠程版本庫

  • 本地倉庫:也就是之前所講的git倉庫,分為三個區:工作區,暫存區和版本庫;
  • 遠程版本庫:與本地版本庫相對應的遠程在線版本庫,屬於裸庫

我們一般會在本地git倉庫的工作區和暫存區中對文件進行修改,然後提交到本地版本庫,並最終推送到遠程版本庫進行託管。整個流程如下圖所示:

image-20200415215625991

遠程倉庫的實質就是本地倉庫中的版本庫對應的遠程版本庫,通常直接叫做遠程倉庫

遠程倉庫(版本庫)的存在作用為:供多台電腦間交換資訊,相當於交換兩個數過程中的第三方容器。

1.git pushgit pull

這兩個命令是我們使用遠程倉庫時非常常用的命令,它們十分的重要:

  • git push:將本地倉庫某分支上的程式碼推送到遠程倉庫的某分支上;注意了,推送操作是分支對分支的,而不是將本地倉庫的所有分支都推送到遠程倉庫,如下圖所示(假設推送到遠程同名分支):

    image-20200415222039765

  • git pull:將遠程倉庫文件拉取到本地版本庫,也就是將本地倉庫中沒有的文件都拉取到本地倉庫的版本庫中,所以進行拉取操作後,本地倉庫的工作區是乾淨的:

    image-20200415222320473

    這裡的ststatus的別名,有關別名的內容,後續會進行詳細講解。

push指令的完整寫法:

git push origin srcBranch:destBranch

其中srcBranch表示的是本地分支destBranch表示的是遠程分支

pull指令的完整寫法:

git pull origin srcBranch:destBranch

其中srcBranch表示的是遠程分支destBrach表示的是本地分支

不要混淆了,可以這樣理解:srcBranch表示從哪裡來destBranch表示到哪裡去

git push的三種情況
  • 情況一:只有一個用戶操作遠程倉庫時,由於本地倉庫對所有的文件和操作都進行了追蹤,所以即使本地倉庫刪除之前推送到遠程倉庫的文件,再次執行推送時也不需要執行git pull操作。

    例如,遠程倉庫有這麼些文件:

    image-20200410204056615

    在對應的本地倉庫中將其他文件刪除,只留下README.md,此時再向該遠程倉庫推送。推送過程十分順利,並不需要執行git pull操作拉取合併遠程倉庫中的文件。

  • 情況二:也是只有一個用戶操作遠程倉庫,但是不通過本地推送來更新遠程倉庫,而是直接為遠程倉庫添加文件,比如手動添加README.md

    這個時候,由於本地倉庫並沒有對遠程倉庫中新增的README.md進行追蹤,所以再次推送時會出現如下錯誤:

    image-20200410205057781

    此時需要執行git pull操作對遠程倉庫中新增的文件進行拉取、合併與追蹤,之後才能進行git push

  • 情況三:多人共用同一遠程倉庫,比如用戶AB,這個時候由於遠程倉庫上有A提交的而B沒有的文件。所以B在執行git push前,要先執行git pull操作,將遠程倉庫中這些沒有的文件進行拉取、合併與追蹤。

git pull實質

在進行拉取操作的過程中,會執行合併操作(merge),合併操作可能成功也可能失敗:

  • 如果merge成功:說明兩個人修改的不是一個文件,或者是一個文件的不同地方,這樣git會直接使用Fast-forward方式自動合併;
  • 如果merge失敗:說明兩個人可能修改了同一文件同一行,這時候就需要進行手動合併,解決文件發生的衝突;

合併完成之後才能進行push操作,將本地倉庫的程式碼推送到遠程倉庫;

pull操作其實是fetch操作和merge操作的合成:

  • fetch指令的作用為:將遠程倉庫中的所有文件拉取到本地倉庫的版本庫中;

  • merge指令的作用為:合併拉取到本地的文件;

2.GithubGitlab

  • 先有Github後有Gitlab
  • Gitlab為內網的Github,即Gitlab為內網的git遠程伺服器,程式碼不開源,僅供公司內網用戶使用,並且可以設置管理許可權。
Github

不多介紹,世界上最大的開源及私有軟體項目的託管和同性交友平台;

Gitlab

Gitlab可作為內網的遠程程式碼託管伺服器,一般都是安裝在Linux系統上:

image-20200330201124866

三、本地倉庫 -> 遠程版本庫

1.建立聯繫

Github上克隆項目時,主要可以採用兩種協議:HTTP/HTTPS協議和SSH協議:

image-20200415195835932

當使用HTTP/HTTPS協議建立本地倉庫與遠程倉庫的聯繫時,不用進行任何配置,但是每次進行推送時都需要輸入帳號密碼。而使用SSH協議,只需要進行一次配置,就可以實現免密推送。

HTTP/HTTPS協議
  • 克隆Github上的項目時,可以採用該協議:

image-20200415195957464

  • 建立本地倉庫與遠程倉庫連接時,也可以採用該協議:
git remote add origin //github.com/AhuntSun/test.git

其中的origin表示遠程倉庫的意思,可以不叫這個名字,但是約定俗成叫origin。執行完這條命令之後,就可以採用origin來代表遠程倉庫的URL了。

但是,在進行推送時,由於Github上的項目有許可權管理,除了遠程倉庫的創立者本人,其他用戶都無權進行程式碼的推送。所以,每次將本地倉庫的程式碼進行推送時,都需要輸入帳號密碼驗證推送者身份。

SSH協議

雖然公網上推薦使用HTTPS協議進行加密傳輸;但是,在公司內網中只有HTTP協議,每次推送程式碼都需要重複輸入用戶名和密碼,比較不方便;因此,可以採用SSH協議進行身份驗證,過程如下:

  • 首先,採用SSH地址關聯遠程倉庫:

    image-20200415200040097

     git remote add origin [email protected]:AhuntSun/test.git
    

    注意到,Github已經提示我們當前Github帳號沒有任何SSH公鑰。

  • 添加之後,查看遠程倉庫地址:

     git remote show origin
    

    image-20200415200521163

    如圖所示,本地倉庫沒有遠程倉庫的訪問許可權。這是因為我們並沒有將本地的SSH公鑰部署到遠程倉庫上,為了解決這個問題,我們需要在本地生成秘鑰對,並將其中的公鑰部署到遠程倉庫上。

生成秘鑰對

.ssh文件夾下有一個known_hosts的文件:

image-20200328152518312

打開該文件,可以看到遠程倉庫GithubIP地址已經添加到了本地信任地址中:

image-20200415200922784

接下來,使用以下命令生成本地電腦的公鑰和私鑰:

ssh-keygen

image-20200328153029340

在生成過程中,可以選擇公鑰和私鑰的保存地址,默認是保存在.ssh文件夾下的;還可以設置密碼,也可以不設置,直接兩次回車後成功生成公鑰和私鑰;

可以看到.ssh文件夾下多了兩個文件:

image-20200328153154037

其中,id_rsa表示私鑰,id_rsa.pub表示公鑰,我們可以分別查看一下它們的內容:

  • 公鑰:

image-20200328153258023

  • 私鑰:

image-20200328153328042

部署公鑰

接著我們要做的就是把生成的公鑰部署到遠程倉庫Github上,如下圖所示:

image-20200328153538328

在該介面中可以添加多個公鑰,如果項目組會有多個成員,或者一個人使用多台電腦時可以設置多個公鑰:

image-20200328154605789

如圖所示,可以自定義公鑰的名字。注意:一定要勾選Allow write access選項,否則無法將本地倉庫程式碼推送到該遠程倉庫。並且,添加時需要輸入Github帳號密碼進行確認:

image-20200328153903341

添加完成後,就可以在原來的介面看到新增的公鑰了。這樣使用該公鑰的本地電腦就具有了讀寫這個遠程倉庫的許可權了;

image-20200328154723134

完成公鑰的部署後,就可以成功地查看遠程倉庫的地址了:

image-20200415204247670

實際開發中,通常會使用SSH協議進行本地倉庫與遠程倉庫的連接。因為只需要配置一次公鑰,就可以進行免密推送,十分方便;

添加賬戶SSH

之前在Github上的test倉庫中添加了一把SSH公鑰,但是該SSH KEY僅限於本地與test倉庫的通訊,不能在其他倉庫中使用。

image-20200415204439936

如果我們想要讓Github上的所有倉庫都使用同一把SSH KEY,就需要配置針對帳號的SSH KEY了。點擊Github右上角的Settings

image-20200329193849833

在該介面可以新建全局的SSH KEY

image-20200329194410138

2.推送程式碼

建立了本地倉庫與遠程倉庫的聯繫之後,就可以將本地倉庫的文件推送到遠程倉庫了:

 git push -u origin master

上述指令表示將本地的master分支推送到遠程倉庫的master分支上,加上-u表示將本地的master分支與遠程的master分支建立關聯;再次推送時就可以直接通過git push進行推送了。

3.查看遠程倉庫地址

可以通過以下三種方法查看所有與本地倉庫關聯的遠程倉庫的地址:

git remote //只顯示遠程倉庫地址名
git remote -v //顯示遠程倉庫地址名和對應URL
git remote show origin//顯示詳細資訊

image-20200407221734277

在通過git remote show origin顯示的詳細資訊中:

  • Fetch URL:表示拉取文件到本地的遠程倉庫的URL

  • Push URL:表示推送時的遠程倉庫的URL

  • 可以看到進行git pullgit push操作時,本地與遠程分支之間是一一對應的關係;

4.修改遠程倉庫地址

  • 方法一:刪除原有地址,再添加新的URL
git remote rm origin
git remote add origin //gitee.com/ahuntsun/gitTest.git
  • 方法二:修改原有的遠程倉庫URL
git remote set-url origin //163.com
  • 方法三:直接修改.git倉庫的config文件

image-20200328063634159

不建議使用這種方法,建議使用命令行修改。手動修改時,可能只是修改了一部分(不全)。這樣可能會造成一些無法維護的情況;

注意:盡量避免直接手動操作文件,對於常見的,合理的操作git都提供了相應的指令,使用這些指令更加安全和高效。

對於git來說,默認情況下,它的遠程倉庫的地址都叫origin;當需要為本地倉庫添加多個遠程倉庫地址時,可通過以下方式:

 git remote add newOrigin //biliwa.com

image-20200328145720489

不過,在將本地倉庫的文件推送到不同的遠程倉庫時,需要重新建立關聯:

 git push -u newOrigin master

與遠程倉庫的相關分支建立關聯後,可直接使用git push進行推送(簡寫的原理將在下一節進行講解)。

四、Git圖形化介面

Git圖形化介面非常之多,各種圖形化介面的操作不盡相同。但是,它們的實質都是一樣的。都是通過執行一條條Git命令,來實現圖形化介面中的各種操作。因此,在熟練掌握Git底層操作命令的前提下,再使用Git圖形化介面會更加得心應手。因此,十分不建議初學者直接從Git圖形化介面入門。

下面簡單介紹比較常見的四種Git圖形化介面,分別是:gitkGit GuiGithub DeskTopSourceTree

1.gitk

gitkgit自帶的圖形化介面,輸入命令:gitk,就可以打開下圖所示的圖形化介面:

image-20200329103724204

gitk圖形化介面中:

  • 左側表示提交歷史,從下往上,從舊到新;

  • 右邊的兩欄分別是每次提交對應的用戶時間

image-20200329104548998

該介面很好地展示了git合併的原則三方合併,如下圖所示:

image-20200329104940260

append 1append 2兩次提交的合併過程為:找到它們公共的父節點add a hello,然後在該節點的基礎上合併兩個節點,得到合併後的master節點。該節點有兩個parent指針,分別指向append 1append 2

gitk介面的下半部分如下圖所示:

image-20200329105310417

  • 上圖的SHA1 ID表示每次提交的識別碼,也就是commit_id
  • AuthorCommitter分別表示程式碼的作者和程式碼的提交者,一般情況下二者是同一人;但是在一些開源項目中,程式碼的作者是沒有權力提交程式碼的(如Github)。只能提交一個修補程式issue,待開源項目作者同意修改後,才會由項目作者代替程式碼作者提交程式碼;
  • 再下面的就是各個文件修改的詳細資訊;如下圖所示,Parent表示的是上一次提交,Child表示的是下一次提交:

image-20200329105659158

image-20200329105824734

2.Git Gui

Git Gui同樣也是git內置的圖形化介面,輸入git gui命令便可打開:

image-20200329110131346

在上圖中:

  • Unstaged Changes:表示未添加到暫存區的文件或改動,即工作區文件;
  • Staged Changes:表示暫存區中的文件或改動,即將被提交;
  • Modified,not stage:表示文件已修改但未被納入暫存區;

image-20200329110304513

通過git add .可將所有改動納入暫存區:

image-20200329110610386

執行完上述指令後,再次查看Git Gui會發現,文件轉移到了Stage Changes區域中。隨後可以直接在Git Gui 介面進行提交,如下圖所示:

image-20200329110714387

Git Gui中的每一步操作,實際上都是通過命令行中的一條條指令實現的。除此之外,Git Gui的菜單欄還提供了很多功能:

image-20200329111217827

3.Github DeskTop

這是Github的客戶端應用程式,同樣屬於Git圖形化介面:

image-20200329111727510

在介面的File選項中可以添加一個本地倉庫進行管理:

image-20200329111945655

image-20200329112002719

添加後可以查看該本地倉庫的提交歷史和其他相關資訊:

image-20200329112057396

4.Sourcetree

這是一個比較受歡迎的Git圖形化介面,官方網址為://www.sourcetreeapp.com/

image-20200415112533399

安裝時需要註冊一個帳號:

image-20200415210504189

安裝完成後,就可以使用了:

image-20200415232345617

功能十分強大,使用起來也十分地方便,這裡就不詳細介紹了,有興趣的可以查閱網上的資料。

以上就是本節的全部內容,本節簡單地介紹了使用Git實現本地倉庫與遠程倉庫的互動,以及四種常見的Git圖形化操作介面。看到這裡相信你已經對本地倉庫與遠程倉庫的關係有了一定的認識,並且會抱有不少的疑問。沒關係,在下一節當中,將會詳細地為你介紹如何使用遠程倉庫進行多人協作開發,我們下一節再見!

Tags: