# 简要

​ git是一个分布式版本管理系统,由Linux创始人使用C语言编写而成。分布式指的是每个开发者本地都是一个单独的仓库,在自己的仓库中就可以完成版本管理的操作(不需要联网)。

​ 与之不同的是集中式版本管理系统svn,所有的管理请求都必须通过一台中央服务器(需要联网),处理的速度没有git快。

​ 在团队开发中git也需要一个中央服务来进行多人开发的协作,此时的中央服务器只是充当一个临时存储的角色。比如A开发者想让别人看到自己的代码,可以将代码同步到中央服务器,而B开发者想要看到A开发者的代码,那么就可以通过中央服务器将代码拉取到自己的本地,然后进行版本的查看和操作。

# 安装

Git下载地址

​ 安装步骤可傻瓜式安装,也可以自定义安装,不多做赘述。查看是否安装成功,可以在控制台使用git --version命令来查看。也可以在任意路径下单击鼠标右键看是否有Git GUI 和Git Bash。在控制台窗口查看git工具版本

# Linux常用操作命令

注意,因为目前各个平台上的git工具都是从Linux上移植过来的,在打开git bash命令行窗口时,使用的依然是Linux命令,虽然和windows系统的命令类似,但是实现的功能却截然不同

  1. ls //查看当前目录下的文件和文件夹列表
  • 加 -l 后缀可列出详细信息
  • 加 -a 可查看隐藏文件
  • 加 -la 可查看隐藏文件并列出详细信息
  1. clear //清屏
  2. cd //切换路径
  • cd ../ 返回上级目录
  • cd ./ 返回当前目录
  • cd / 返回根目录
  • cd xxx 进入到指定路径中
  • cd C: 进入到指定磁盘中
  1. mkdir xxx //创建文件夹
  2. touch xxx //创建文件
  3. vi xxx //指定文件进入编辑状态
  • 进入后键盘敲击 i 进入插入内容状态
  • 结束操作先按 esc 键
    • :w //保存
    • :q //退出
    • :wq //保存并退出
    • :q! //不保存并强制退出
  1. echo xxx内容 > xxx文件名 //编辑内容并创建文件
  • 新的编辑会覆盖原有的,如果想要实现追加,则使用 >> 符号替代 > 符号
  1. cat xxx //查看文件内容
  2. cp xxx旧文件 xxx新文件 //拷贝旧文件为一个新文件
  3. rm xxx //删除文件
  • 加 -r 后缀表示递归删除,将会递归遍历并删除文件夹内的文件
  • 加 -f 后缀表示强制删除
  • 加 -rf 表示全部强制删除,慎用不可修复
  1. cat xxx文件名 //查看文件内容

# Git工作原理和流程

# 基本概念

git是一个分布式版本管理系统,每一台客户端都是一个独立的git仓库,都拥有完整的管理功能

git分为三个工作区

  • 工作区:编写代码的地方
  • 暂存区:临时存储代码的地方
  • 历史区:保存历史版本的地方

# 基本配置命令(只需配置一次)

  • $ git config -l //查看当前配置清单
  • $ git config user.name XXX --global //全局配置用户名称
  • $ git config user.email XXX --global //全局配置用户邮箱地址

# 基本操作命令和流程

  1. 创建/初始化仓库

    • $ git init //初始化后会生成一个默认不可见的.git文件夹,记录了暂存区和历史区的提交和修改
  2. 创建并配置.gitignore文件(可选)

    .gitignore文件是用来排除不需要git进行提交作为版本记录的文件,例如常见的node_modules文件夹、.git文件夹等等。注意,该文件只有后缀名没有文件名,因windows不允许创建无名称文件,可用bash环境创建

    • 编辑.gitignore文件,直接写入需要排除的文件或者文件夹(以换行隔开)。
  3. 工作区到暂存区操作

    • $ git status //查看当前工作区文件的状态

      • 红色:在工作区中,还没有被提交到暂存区
      • 绿色:在暂存区中,还没有提交到历史区
    • $ git add xxx文件名 //把具体的文件提交到暂存区

      • $ git add . //把所有修改的文件都提交到暂存区(新增和修改的会被提交,删除不会)

        实践证明,删除操作也是可以被添加的,所以向工作区提交新增、修改、删除操作,都可以使用此命令。点表示全部,具体到某一个文件时,使用文件名称替换掉点即可

      • $ git add -u //把所有修改的文件提交(只会包含修改和删除的,不包含新增的)

      • $ git add -A //把所有的修改文件提交(修改、新增、删除都会被提交,是-u和.的结合体)

    • $ git rm --cached xxx文件名 -r //从暂存区把文件撤回到工作区(使用较少)

      提示:无论是从工作区提交到暂存区,还是从暂存区提交到历史区,每一个区域的内容是一直保存下来的,不会消失

    • $ git checkout -- xxx文件名 //把工作区的文件返回到上一次add或者commit的状态内容,工作区被覆盖内容不可恢复。

    • $ git reset HEAD xxx文件名 //从暂存区移除文件,可用来清空暂存区

  4. 暂存区到历史区操作

    • $ git commit -m 'XXX版本描述信息'

    • $ git log //查看历史版本记录,在有版本回退的情况下,只能查看版本回退前的记录

      可以加上后缀 --oneline 让日志信息单行显示可读性更高

    • $ git reflog //查看所有提交版本历史,包括版本回退的记录

    • $ git reset --hard HEAD^ //把历史区的记录回滚到上一次,其中^表示上一次,若干个^表示回退对应的版本次数。也可以用HEAD~100的格式来替代

      当使用版本回退命令后,工作区和暂存区的内容将被指定版本的内容所覆盖

    • $ git reset --hard xxx版本号 //回滚到指定的版本号

      可借助 $ git log来查看历史区的版本号来确定具体要回退到哪个版本,一般版本号只需要截取7位即可

# 其他常用命令

  • 不同区域的差异比较

    • $ git diff xxx文件名 //工作区和暂存区比较,查看修改的内容
    • $ git diff master //工作区和历史区比较
    • $ git diff --cached //暂存区和历史区进行比较
  • 克隆仓库

    • $ git clone xxx仓库地址 [可选的别名] //克隆远程仓库到本地,可另设项目文件夹名称,默认以远程仓库名称
  • 创建远程分支并关联本地分支

    • $ git branch -r //查看远程分支
    • $ git checkout -b 分支名称 //创建并切换本地分支
    • $ git push origin 分支名称 //向远程推送分支
    • $ git branch --set-upstream-to origin/远程分支名 //把当前分支和远程的某一个分支关联
  • 遇到紧急指派的任务,需要保留手头工作(存放暂存区)并切换新分支进行开发时,例如修复Bug

    • $ git stash //将暂存区的内容临时存储起来,因为在切换分支时如果有未提交文件会被阻止切换。存储后使用git status查看暂存区为干净的。可存储多次,会以不同的记录存储起来

    • $ git stash list //查看stash中存储的内容

    • $ git stash apply //恢复stash中存储的内容到暂存区

      当存储了多次后,恢复指定的stash可以使用 $ git stash apply stash@{数字索引号}

    • $ git stash drop //stash中的内容恢复到暂存区后,通过git stash list发现stash中仍然存在,所以需要使用此条命令进行删除

    • $ git stash pop //stash中内容恢复到暂存区的同时删除stash中的内容

# 仓库的创建者

​ 每个人的本地仓库都是一个独立且功能齐全的仓库,但是想要实现多人协作代码共享,还需要一个公共的仓库,也成为中央仓库。相比较个人独立开发,在团队协作开发下,流程还有有所区别的。

  1. 创建中央仓库,用于存储所有人的代码内容和版本信息。一般会建立在gitHub、Coding或者自己公司的git仓库服务平台、服务器等。创建完成后生成仓库地址。

  2. 作为仓库的创建者(一般为团队领导或指派人员),需要将项目的初始化文件提交到本地仓库

  3. 让本地仓库和远程仓库保持关联

    可选择ssh免密登录地址和https有密登录地址。https需要再每次推送时输入用户名和密码,ssh免密登录则需要先在本地生成ssh私钥和公钥,并且把公钥在远程仓库中认证添加,成功后即可实现免密登录。git生成ssh公钥

    • $ git remote add xxx变量名 xxx远程地址 //添加远程仓库地址,名称一般为origin
    • $ git remote rm xxx //删除指定的远程仓库地址
    • $ git remote -v //查看当前相关联的远程仓库地址
  4. 将本地仓库同步到远程仓库

    • $ git push -u origin master //第一次推送默认的master主分支,使用-u参数可以同步并关联,后续推送即可不带-u
  5. 将团队成员设置为协同开发人员,可具有提交和更改的权限

# 基于分支的团队协作模式

​ 作为团队的成员,我们要做的就是将已有的仓库给拉取到本地,然后各自开始feature开发。避免直接在master主分支上开发,因为进度和功能的不完整度可能会为团队的其他人造成困扰,需要在本地创建对应的开发分支。每次提交的进度和功能代码都会放在本地的开发分支上,知道功能完成后,才会向主分支上进行合并。

  1. 将已有的项目仓库clone到本地

    clone操作会默认将远程master分支关联到本地上,并且自动声明origin为远程仓库地址

    • $ git clone xxx地址 //开发人员clone项目仓库到本地
  2. 查看远程分支,并且和本地分支进行关联

    • $ git branch //查看当前所有分支
    • $ git branch -r //查看远程分支
    • $ git branch xxx分支名称 //创建分支
    • $ git checkout xxx分支名称 //切换分支
    • $ git checkout -b xxx分支名称 //创建并切换分支
    • $ git branch --set-upstream-to origin/dev //协作开发者将远程分支关联到当前分支
  3. 功能开发完毕后,需要将本地开发分支上的代码合并到master分支上,如果有冲突需要解决冲突,然后需要再次添加和提交

    • $ git pull origin 远程分支 //将远程分支内容拉取到本地关联分支上(同步分支版本内容)
    • $ git merge xxx分支名称 //将指定分支合并到当前分支,默认为Fast-forward快速合并,合并完不会生成新版本
    • $ git merge --no-ff -m 提交信息 分支名称 //强烈建议使用关闭快速合并方法来进行合并。在合并的同时会提交新版本并且 -m 生成版本信息
  4. 分支合并完成后,即可删除功能分支

    • $ git branch -D xxx分支名称 //删除分支

      -D 参数表示强制删除,-d表示常规删除。在需要摒弃一些无用分支时,针对分支上已做过提交操作但不需要合并,需要强制删除时使用-D,否则-d即可

    • $ git log --graph //查看分支合并图

      $ git log --graph

  5. 推送分支(更新远程仓库内容)

    一般需要关联远程和推送的分支只有master和dev。对于bug分支和feature分支,要不要推送取决于你的leader是否关心你的工作进度和内容

    • $ git push origin 分支名称 //推送本地分支到远程仓库(同步远程仓库),如果没有和远程分支进行关联的话,则表示创建远程分支
  6. 删除远程分支

    • $ git push origin --delete 远程分支名称 //当功能需求都完成后且不需要对应的远程分支,可通过此命令进行删除