git 基础

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

版本是什么

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

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

git和svn的区别

  • git 分布式版本控制工具
  • svn 集中式版本控制工具
  • 集中式:
    有一个远程服务器,用来存储所有成员的代码和代码版本库,用户所有的版本都直接提交到远程服务器;
  • 分布式:

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

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

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

  • git 用的 linux 的命令行;

git 的使用

本地仓库和远程仓库

  • 本地仓库:有 .git 文件夹的目录,在这个目录中 git 将会收集所有的变更,文件的修改、新增、删除等都会被 git 记录;
  • 远程仓库:在远程服务器上的 git 仓库,一般常见的有 github 托管、coding 托管、公司自己搭建的 gitlab 服务器;

创建远程仓库:登录 github 创建远程仓库:
克隆远程仓库到本地:git clone 仓库地址

此时经过我们克隆到达我们本地的这一份就是本地仓库,在仓库中有一个 .git 文件夹,这个文件夹是版本库;

  1. git config --list : 查看当前的配置信息
  2. git remote -v : 查看当前仓库和哪个远程仓库关联

git的三个区

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

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

生成一个版本

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

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

  1. 对比
  1. git diff 工作区和暂存区比较
  • 其他对比
  1. git diff -cached 暂存区和历史区比较
  2. git diff master 工作区和历史区比较
  1. 经过 diff 后,确认这些修改都要保留后将工作区添加到暂存区
  1. git add . | 文件名
  1. 如果添加后后悔了,可以删除暂存区中的文件
  1. git rm --cached + 文件名

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

  1. git checkout + 文件名
  1. 暂存区添加到历史区
  1. git commit -m'提交版本注释'

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

  1. 把本地的修改提交到远程仓库:
    1. git pull origin master 同步远程仓库中的版本库
    2. git push origin master 把本地的版本库同步到远程仓库

版本回退(回滚)

  1. 查看版本库中的历史记录,会有提交注释和版本号,通过版本号可以回退到任意版本;
  1. git log
  1. 回退到某一个版本 (回滚,如果上线出现问题就需要回滚到上一个)
  1. git reset --hard 版本号

git分支

master 分支

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

基于 master 的开发分支

真实项目开发中我们一般不在 master 上做开发,都是基于 master 新开一个分支作为开发分支;每个分支都有自己的版本库,记录在不同的分支上的变更;
分支是在开分支一刻 master 的一个快照,master 里面的代码当时长什么样子,分支里面的代码就会长什么样子;接下来所有的开发都是在分支上完成的;

合并分支

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

创建一个分支

  • 新建并且切换到新分支
  1. git checkout -b 分支名

或者

  1. git branch 分支名
  2. // 这种方式建立的分支并不会自动切换到分支
  • 切换分支
  1. git checkout 目标分支名
  • 删除分支
  1. git branch -D 分支名
  • 合并分支
  1. git merge 分支1
  2. // 把分支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 是存在设备上的,换电脑就没戏了;