Git应用详解第五讲:远程仓库Github与Git图形化界面

前言

前情提要:Git应用详解第四讲:版本回退的三种方式与stashgit

这一节将会介绍本地仓库与远程仓库的一些简单互动以及几款经常使用的Git图形化界面,让你更加方便地使用gitgithub

1、Git裸库

简单来讲git裸库就是没有工做区的git仓库。好比服务器,只起到代码托管的做用而不须要也不该该修改服务器上的代码。安全

可经过如下指令建立git裸库:bash

git init --bare
复制代码

建立完成以后,查看当前文件目录:服务器

image-20200329192222085

能够看到并不存在工做区目录,代表git裸库仅仅是用来存放和中转开发者提交的代码。app

2、本地仓库与远程版本库

  • **本地仓库:**也就是以前所讲的git仓库,分为三个区:工做区,暂存区和版本库;
  • 远程版本库:与本地版本库相对应的远程在线版本库,属于裸库

咱们通常会在本地git仓库的工做区和暂存区中对文件进行修改,而后提交到本地版本库,并最终推送到远程版本库进行托管。整个流程以下图所示:ssh

image-20200415215625991

远程仓库的实质就是本地仓库中的版本库对应的远程版本库,一般直接叫作远程仓库post

远程仓库(版本库)的存在做用为:供多台计算机间交换信息,至关于交换两个数过程当中的第三方容器。fetch

1.git pushgit pull

这两个命令是咱们使用远程仓库时很是经常使用的命令,它们十分的重要:ui

  • 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

3、本地仓库 -> 远程版本库

1.创建联系

Github上克隆项目时,主要能够采用两种协议:HTTP/HTTPS协议和SSH协议:

image-20200415195835932

当使用HTTP/HTTPS协议创建本地仓库与远程仓库的联系时,不用进行任何配置,可是每次进行推送时都须要输入帐号密码。而使用SSH协议,只须要进行一次配置,就能够实现免密推送。

HTTP/HTTPS协议
  • 克隆Github上的项目时,能够采用该协议:

image-20200415195957464

  • 创建本地仓库与远程仓库链接时,也能够采用该协议:
git remote add origin https://github.com/AhuntSun/test.git
复制代码

其中的origin表示远程仓库的意思,能够不叫这个名字,可是约定俗成叫origin。执行完这条命令以后,就能够采用origin来表明远程仓库的URL了。

可是,在进行推送时,因为Github上的项目有权限管理,除了远程仓库的创立者本人,其余用户都无权进行代码的推送。因此,每次将本地仓库的代码进行推送时,都须要输入帐号密码验证推送者身份。

12

SSH协议

虽然公网上推荐使用HTTPS协议进行加密传输;可是,在公司内网中只有HTTP协议,每次推送代码都须要重复输入用户名和密码,比较不方便;所以,能够采用SSH协议进行身份验证,过程以下:

  • 首先,采用SSH地址关联远程仓库:

    image-20200415200040097

    git remote add origin git@github.com: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 https://gitee.com/ahuntsun/gitTest.git
复制代码
  • 方法二:修改原有的远程仓库URL
git remote set-url origin https://163.com
复制代码
  • 方法三:直接修改.git仓库的config文件

image-20200328063634159

不建议使用这种方法,建议使用命令行修改。手动修改时,可能只是修改了一部分(不全)。这样可能会形成一些没法维护的状况;

**注意:**尽可能避免直接手动操做文件,对于常见的,合理的操做git都提供了相应的指令,使用这些指令更加安全和高效。

对于git来讲,默认状况下,它的远程仓库的地址都叫origin;当须要为本地仓库添加多个远程仓库地址时,可经过如下方式:

git remote add newOrigin https://biliwa.com
复制代码

image-20200328145720489

不过,在将本地仓库的文件推送到不一样的远程仓库时,须要从新创建关联:

git push -u newOrigin master
复制代码

与远程仓库的相关分支创建关联后,可直接使用git push进行推送(简写的原理将在下一节进行讲解)。

4、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图形化操做界面。看到这里相信你已经对本地仓库与远程仓库的关系有了必定的认识,而且会抱有很多的疑问。不要紧,在下一节当中,将会详细地为你介绍如何使用远程仓库进行多人协做开发,咱们下一节再见!

相关文章
相关标签/搜索