本篇文章是企业级接轨的文章,我们在公司的开发,并不是一个人独立完成的,需要团队协作,那么在企业中开发使用的很广泛的工具就是Git,本文从Git的安装到Git在Idea中集成的操作详细的讲解,甚至连可能出现的异常都给安排上

课代表划重点:
1.Git架构
2.远程仓库的操作
3.对分支的理解(尤其是对应冲突解决)
4.在idea中Git的相关操作

Git概述

概述

在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:

  • 代码被覆盖或丢失
  • 代码写的不理想希望还原之前的版本
  • 希望知道与之前版本的差别
  • 是谁修改了代码以及为什么修改
  • 发版时希望分成不同的版本(测试版、发行版等)

因此,我们希望有一种机制,能够帮助我们:

  • 可以随时回滚到之前的版本
  • 协同开发时不会覆盖别人的代码
  • 留下修改记录,以便随时查看
  • 发版时可以方便的管理不同的版本

什么是版本控制系统

一个标准的版本控制系统 Version Control System (VCS),通常需要有以下功能:

  • 能够创建 Repository (仓库),用来保存代码
  • 协同开发时方便将代码分发给团队成员
  • 记录每次修改代码的内容、时间、原因等信息
  • 能够创建 Branch (分支),可以根据不同的场景进行开发
  • 能够创建 Tag (标签),建立项目里程碑

版本控制系统的发展史

版本控制系统发展至今有几种不同的模式:

Local VCS

本地使用 复制/粘贴 的方式进行管理,缺点是无法协同开发

Centralized VCS (Lock,悲观锁)

中央集中式版本控制系统团队共用仓库,当某人需要编辑文件时,进行锁定,以免其他人同时编辑时造成冲突。缺点是虽然避免了冲突,但不是很方便。其他人需要排队才能编辑文件,如果有人编辑了很久或是忘记解锁就会造成其他人长时间等待的情况。

Centralized VCS (Merge,乐观锁)

中央集中式版本控制系统团队共用仓库,不采用悲观锁方式来避免冲突,而是事后发现如果别人也修改相同文件(冲突),再进行手动修改解决。有很多 VCS 属于这种类型,如:CVS,Subversion,Perforce 等

中央集中式版本控制系统的共同问题是,做任何操作都需要和服务器同步,如果服务器宕机则会造成无法继续工作的窘迫。

Distributed VCS

分布式版本控制系统,本地也拥有完整的代码仓库,就不会出现上述集中式管理的问题,即使没有网络,依然可以 commit 和看 log,也无需担心服务器同步问题。如:Git,Mercurial,Bazaar 等就属于分布式版本控制系统。缺点是功能比较复杂,上手需要一定的学习时间。

介绍

  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  • Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
  • Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git环境搭建

Git的安装

下载地址:https://git-scm.com/downloads

除了安装位置以外都直接Next,安装位置可以自定义

安装后我们需要做一些初始的设置

//如下信息会在提交代码时使用,让别人知道哪次提交是谁提交的修改

git config --global user.name"leiyujia" //你的用户名

git config --global user.email"1010866409@qq.com" //你的邮箱

//查看信息

git config -l

// 测试:在cmd中执行 ,查看git版本

git version

Git的架构

版本库:工作区中有一个隐藏目录.git,这个目录不属于工作区,而是git的版本库,是git管理的所有内容

暂存区;版本库中包含一个临时区域,保存下一步要提交的文件

分支:版本库中包含着分支,提交的文件存储在分支中

在计算机的文件系统Git的架构

仓库

对应的就是一个目录,这个目录中所有的文件被git管理起来

以后会将一个项目的根目录,作为仓库

仓库中的每个文件的改动都由git来跟踪

新建仓库

选择一个目录,执行指令: git init

就会在目录下生成一个仓库

基本操作

查看仓库状态

我们先在仓库的工作区中仅仅是创建新文件abc.txx和def.txt.

执行git status可以看到工作区中文件的状态

  • 这个指令在操作中可能会经常用到,我们可以用来查看我们哪个文件时未被跟踪的,哪些文件是未被提交的

暂存文件

仅仅是暂存,而不是真正的提交

执行git add .将工作区中的文件全部存入暂存区

提交文件

执行`git commit -m “add two files”

  • -m:指的是-message(信息) 后面的双引号中填写信息的简述,让我们知道此次提交哪里做了修改

远程仓库

前面所说的仓库实际上是本地仓库

当多人协同开发时,每个人都在自己的本地仓库维护版本

但是很重要的一点是,多人之间需要共享代码,合并代码,此时就需要一个远程仓库

简单的说:远程仓库实现了代码共享和合并的功能

  • 其***享指的是:每一个开发者都可以把代码提交到远程仓库,也可以藏远程仓库中拉取代码
  • 合并指的是:每个开发者负责一个功能或称为模块,远程仓科和git能够把功能和模块的代码进行良好的组织,也可能多个开发者对同一个文件(或者代码)都有修改时,在提交远程仓库时,远程仓库和git提供冲突解决

仓库选型

有很多的远程仓库可以选择,比如github(https://github.com/),码云(https://gitte.com/);

严格的说:github和码云都不是仓库而是git的服务器,我们在服务器上构建我们自己的仓库

基本操作

每个开发人员,在面对远程仓库时,会面临的一些基本操作

我们这里以码云举例

注册git服务器账号

码云注册账号,并登陆

新建远程仓库

关联本地仓库和远程仓库

在本地仓库中输入指令 `git remote add origin 复制的HTTPS地址

  • origin是我们给仓库起的名字,之后在提交和拉取代码时可能用到

推送文件到远程仓库

使用git push origin master

  • master 是我们仓库的默认分支

克隆远程仓库

新建一个空的目录,执行指令git clone https://gitee.com/leiyujia/my_git2.git

代码共享

多个本地仓库(模拟多个开发者的个人本地仓库)实现和远程仓库的共享

多人协同开发时,写好代码的git push上传到远程仓库;需要代码的就使用git pull拉取代码

最终实现在git3中拉取到了git2仓库上传的文件

命令汇总

git remote add 标识名(origin) 远程地址 本地关联远程仓库
git push 标识名 master 将本地仓库的内容上传到远程仓库
git pull 标识名 master 从远程仓库下载内容到本地仓库
git clone 远程地址 将远程仓库复制到本地,并自动形成一个本地仓库
  • 一般情况下,我们第一步就是要clone远程仓库到本地,而之后的拉取代码不使用clone,而是使用pull

分支

分支简介

  • 分支:是一个个版本最终存储的位置
  • 分支:就是一条时间线,每次git commit形成一个个版本,一个个版本依次存储在分支的一个个提交点上

  • 只有改动的新文件才会真正存储,原来为改动的文件维护的是一个文件的链接(指针),指向的是原来版本中的文件

分支基操

查看分支

查看当前仓库的分支git branch

仓库中默认只有master分支

执行git commit时,默认在master分支上保存版本

默认只有master分支

创建分支

在商业项目中,我们不会轻易的在master分支上直接进行操作

我们会新建一个开发用的分支,在此分支上做版本的记录

当代码确实没有问题时,才会将开发分支上成熟的代码添加到master分支

既保证开发过程中,可以及时记录版本,又保证在master分支上每个提交点都是稳定版本

创建分支

切换分支

默认情况下,当前使用的分支是master分支

可以切换到dev分支,则后续的git commit便会在dev分支上提交新建版本

切换分支

分支的细节

新建分支时,新分支,默认有哪些内容?分支中包含了哪些次提交?

新分支初始内容

每一个分支都有一个指针,新建一个分支,首先是新建一个指针.

而且新分支的指针都和当前分支指向同一个提交点

新分支包含的提交点就是从第一个提交点到分支指针指向的点

每一个分支都有一个指针,新建一个分支,首先是新建一个指针

多分支走向

在master分支和新分支,分别进行git addgit commit

分支情况如下:

master分支未动,在dev分支增加了一次提交点
master分支增加了一次提交点,dev分支再增加一次提交点

分支提交日志

查看分支的提交日志,进而看到分支中提交点的详细情况

指令为git log --oneline

或者为git log查看详细的日志

查看提交日志

分支合并

两个分支内容的合并

git merge 分支a合并分支a:一般先切换到master分支然后执行

合并的方式有两种:快速合并和三方合并

快速合并

如果分支A当前的修改,是完全基于分支B的修改而来,则B分支合并A分支,就是移动指针即可

合并前分支状态
快速合并效果

三方合并

在不具备快速合并的条件下,会采用三方合并

合并前分支状态
  • 在master分支上和dev分支上都有提交
三方合并,将23的更改都累加到1上,形成新的提交点

合并冲突

两个分支进行合并,但是他们含有对同一文件的修改,则在合并时出现冲突,git无法决断该保留那个分支的修改

场景模拟在master分支和dev分支都对abc.txt文件进行修改

打开abc.txt文件

冲突解决后,重新提交

在IDEA中关联Git

关联git

创建仓库

然后选择要创建仓库的目录

注意这种方式创建的仓库默认是在我们的目录下的所有都进入到仓库的工作区内

但是往往有些文件是不需要上传到远程仓库***享的,例如IDEA的一些自动生成的配置文件,jdbc数据库的账号密码的配置文件

这时就需要写一些git的配置在IDEA中(注意这一步要在把项目创建仓库之前)

先设置忽略文件".gitignore"

作用:被忽略的文件会被版本记录忽略,版本终不包含它们

范围:不需要和其他开发者共享的文件,具体见下图

创建仓库浅,先设置忽略文件

提交-commit

点击提交菜单
填写描述信息并提交

上传到远程仓库

点击上传菜单
填写远程仓库的URL地址
上传文件(代码)

在IDEA中创建分支和查看分支提交

新建分支

新建分支

查看分支的提交

查看分支的提交

复制到本地仓库

如果有建好的远程仓库,比如github,码云上的一些公开的仓库

可以将其复制到本地使用

点击克隆菜单
输入远程仓库地址

更新本地项目

点击拉取代码菜单

冲突解决

合并出现冲突时,需要解决冲突

多人协同开发

多人协同开发,git操作

项目管理员(项目经理)

1>由管理员创建一个远程库,初始的库中什么也没有,为裸库.库的名称建议和项目名称同名

2>管理员会在idea中创建一个初始项目,其中包含.gitignore文件并在项目根目录下建立本地库,并建立dev分支

3>管理员将本地库上传到远程库

4>将其他开发人员拉入远程看的开发人员列表中,使得其他开发人员可以访问到远程库

流程如下:

点击管理
点击添加成员
设置分支的权限

开发人员

1>初始化:在idea中clone远程库,获得项目.会建立本地库

2>后续的开发中,都要在dev分支上进行.开发完一个功能并测试通过后就commit就提交到本地的dev仓库中,然后上传push到远程仓库中

3>需要更新项目内容时,通过pull从远程仓库拉取内容

4>注意:多人协同时,每次在push到远程仓库前,都先做一次pull,一来把远程最新的内容合并到本地,二来死核实本地内容是否和远程仓库内容有冲突

后续的开发,会接到一个个功能,往复操作2>,3>,4>

经典问题

当我们的码云的密码在近期发生改变时,这时使用远程仓库会报错

改密码远程仓库不能使用报错

如何解决?

打开windows的凭证管理器中的windows凭证找到码云的凭证并删除

然后在提示中会要求我们重新输入一次账号和密码,然后就能正常操作远程仓库了

重新填写账号密码后

raw/master/image-20200608162357517.png) |

如何解决?

打开windows的凭证管理器中的windows凭证找到码云的凭证并删除

然后在提示中会要求我们重新输入一次账号和密码,然后就能正常操作远程仓库了

重新填写账号密码后

我是一个普通二本的学生,可能写的有不周到之处,希望各位大佬指点.让我们一起努力,不过平庸的生活.
如果您感觉这篇文章有帮助到你,点个赞(你的鼓励就是我前进的动力).
如果有什么问题,可以留言我们一起探讨
如果有什么建议,也可以留言给我,我会虚心的接受
最后谢谢您,看完了我的文章