Git

383 阅读8分钟

git

  • git是目前最流行的版本控制工具;另一个就是历史悠久的svn;

版本是什么

  • 版本:代码变更后,添加到版本库,这次变更就成为一个版本;
  • 版本库:记录所有的版本

当出现问题时,我们可以快速的通过版本和版本库让代码回到没有问题的版本而不用一行一行的撤销回去;此外,版本还会记录是谁改动的,改动了哪里,方便比对和管理;

git和svn的区别

  • git 分布式版本控制工具

  • svn 集中式版本控制工具

  • 集中式:

有一个远程服务器,用来存储所有成员的代码和代码版本库,用户所有的版本都直接提交到远程服务器;

  • 分布式:

分布式也有一个远程服务器,但是项目成员本地也有一个服务器,用于记录版本;如果想要提交版本到远程服务器,需要先将变更添加到本地版本,然后再把本地版本库同步给远程服务器。

  • svn必须经由网络把变更推送到服务器才能生成版本;而且一般svn服务器都是部署在内网的;

  • git可以不用网络生成本地版本,但是把本地版本库同步到远程服务器是需要网络的;

  • git用的linux的命令行;

git的使用

本地仓库和远程仓库

  • 本地仓库:有.git文件夹的目录,在这个目录中git将会收集所有的变更,文件的修改、新增、删除等都会被git记录;
  • 远程仓库:在远程服务器上的git仓库,一般常见的有github托管、coding托管、公司自己搭建的gitlab服务器;
  • 创建远程仓库:登录github创建远程仓库:
  • 克隆远程仓库到本地:git clone 仓库地址 此时经过我们克隆到达我们本地的这一份就是本地仓库,在仓库中有一个.git 文件夹,这个文件夹是版本库;
    git config --list : 查看当前的配置信息
    git remote -v : 查看当前仓库和哪个远程仓库关联

git的三个区

git有三个区:工作区、暂存区、历史区。其中暂存区和历史区都是在版本库中;

  • 工作区:本地的目录,可以对目录中的文件进行修改;
  • 暂存区:准备生成版本的修改;
  • 历史区:已经成为版本的修改;

生成一个版本

1.检查本地仓库文件状态

    git status

如果有红色文件,表示这些文件的更改处于工作区中;
如果为绿色,说明文件以及进入了暂存区;

  1. 对比
    git diff 工作区和暂存区比较
  • 其他对比
    git diff -cached 暂存区和历史区比较
    git diff master 工作区和历史区比较

3.经过diff后,确认这些修改都要保留后将工作区添加到暂存区

    git add . | 文件名

4.如果添加后后悔了,可以删除暂存区中的文件

    git rm --cached + 文件名

或者:拉取暂存区中的文件覆盖当前工作区中的内容(通常用来做放弃修改当前工作区中的修改,但是至于暂存区中有这个文件才能生效)

5.暂存区添加到历史区

    git commit -m'提交版本注释'

把暂存区的修改添加到历史区;添加到历史区就会生成一个版本,这个版本有一个版本号;注释一定要写,描述本次你改了什么,方便有一天你要回退到这个时间点

6.把本地的修改提交到远程仓库:

    git pull origin master 同步远程仓库中的版本库  
    git push origin master 把本地的版本库同步到远程仓库  

版本回退(回滚)

1.查看版本库中的历史记录,会有提交注释和版本号,通过版本号可以回退到任意版本;

    git log

2.回退到某一个版本 (回滚,如果上线出现问题就需要回滚到上一个)

    git reset --hard 版本号

git分支

master分支

git的远程仓库在创立之初存在一个默认分支master,这个分支称为主干;这个分支上保存着线上运行的代码,是经过测试的没有问题的代码;

基于master的开发分支

真实项目开发中我们我们一般不在master上做开发,都是基于master新开一个分支作为开发分支;每个分支都有自己的版本库,记录在不同的分支上的变更;

分支是在开分支一刻master的一个快照,master里面的代码当时长什么样子,分支里面的代码就会长什么样子;接下来所有的开发都是在分支上完成的;

合并分支

当开发完成后再把分支合并到master上;在合并之前要同步master上的代码到分支上,然后再把分支合并到master,此时master就有了本次分支开发的内容,
最后再把本地master的版本库同步到远程的master,可以push,一般使用merge request;

创建一个分支

  • 新建并且切换到新分支
    git checkout -b 分支名
  • 或者
    git branch 分支名
    // 这种方式建立的分支并不会自动切换到分支
  • 切换分支
    git checkout 目标分支名
  • 删除分支
    git branch -D 分支名
  • 合并分支
    git merge 分支1
    // 把分支1上的修改合并到当前分支

注意每个分支有自己的独立的版本库,在分支a上的修改,如果不做合并,b分支上是不会有的;

分支开发流程:

1.首先克隆远程仓库到本地:git clone xxx.xxxx.xxxx,此时本地仓库的分支处于master

2.在远程开一个分支,在github或者gitlab上操作,这个分支称为远程分支,例如分支名feature_0711

3.在本地开一个和远程分支名字相同的本地分支:git checkout -b feature_0711
4.同步本地分支和远程分支,git pull origin feature_0711

5.在本地开发,开始修改本地目录中的文件;

6.适时的add commit,然后同步远程分支,具体操作如下:(防止丢失或者本地误删)

  • 6.1 add commit 生成本地版本,然后pull 远程分支,意义在于把其他同事的代码同步到本地;
  • 6.2 如果同步远程分支时出现冲突,那就要解决冲突(谁发现冲突谁解决,必要时把和你冲突的同事叫来问他哪些要哪些不要);
  • 6.3 解决完冲突后,把本地分支同步到远程分支 git push origin feature_0711;

分支提测:

1.当开发结束后用分支提测,feature_0711
2.一般会要同步master上的代码,就是把master代码合并到当前分支,具体操作如下:
3.从当前分支feature_0711 切换到master
4.切换到master后执行 git pull origin master 同步远程master代码到本地
5.然后再切换回分支feature_0711,在分支上把master的代码合并到分支;
6.如果有冲突,就解决冲突;解决完冲突 add commit 然后push到远程分支;

测试阶段如果修改bug只需要在分支上修改,然后add commit,然后再push到远程分支;

上线发版:

1.同步master上的代码,然后push到远程分支;
2.把分支合并到master,如果你是项目所有人你可以push到master;但是一般人需要提交merge request(github上pull request);
3.提交merge request后,找有权限的人合并;
4.合并后通知上线人员发版(一般是运维的人);

多人协作时:

1.如果使用github,把项目成员添加到 settings -> collaborators -> add collaborators
2.如果使用gitlab,你入职的时候找领导给你开账号,然后让他把你加到项目中就可以了;

SSH-KEY

  • 项目中不是每次都输入密码,这样做效率很低下,真实项目中使用的都是ssh-key;
  • ssh-key是建立ssh时需要的公钥;这个东西在你的机器上,通过命令行生成,生成后把这个秘钥放到github或者gitlab上;
  • 然后建立ssh连接时,会自动从本地读取秘钥,github会比对之前存储的秘钥和本次连接携带的是否一样,如果一样就连上了,从而摆脱输入密码的困扰;

使用步骤SSH-KEY:

1.生成ssh-key:进入到家目录;在git bash中输入:cd ~
2.进入 家目录中的 .ssh/ 目录:cd .ssh/,如果没有可以新建:mkdir .ssh
3.执行: ssh-keygen 一路回车即可
4.cat id_rsa.pub 文件
5.复制上一步cat出来的结果
6.打开github或者gitlab,进入个人设置 settings -> SSH and GPG keys -> new SSHKey
7.title是对这个key的描述,把复制的key粘贴到key中,点击 Add SSH key;
8.后面再clone项目时改用SSH协议,以后所有的操作都不需要密码;

注意SSH只对当前的设备有效,因为ssh-key是存在设备上的,换电脑就没戏了;