(1)git要完成的功能
    提供一种方式,完成多人访问情况下对文件的版本进行管理。可分布式、可离线、可在线使用。
    具体功能:版本库文件的提交、下拉、删除、比对,上传到云端库等。

(2)git的日常操作

    git客户端安装
      参照完成,此处不再赘述

    (a)找一个存放工程的文件夹,打开git控制台,执行git init初始化git的repository
      执行命令:git init

    (b)执行git clone、git remote add,从git云端库下拉版本库中的文件并配置云端仓库
      执行命令:
        git clone 云仓库地址,例如:http://xxxx@192.168.1.5:8080/r/GZProject.git
        git remote add origin 云仓库地址,例如:http://xxxx@192.168.1.5:8080/r/GZProject.git

      备注:
      (1) 这里是两条语句
        第一条是从云仓库克隆,也可以直接从云仓库下
        第二条是添加一个云端仓库指向,别名为origin,仓库地址为http://xxxx@192.168.1.5:8080/r/GZProject.git
      (2) git clone的参数内容从git仓库处复制

    (c)编写gitignore文件
      具体规则可参照git官方文档或者完成。

    (d)git add 提交文件到stage缓存区
      执行命令:git add ./*

      这里添加的是当前的所有文件,可以一个个添加,也可以git add完再用git rm 去删

    (e)git pull 从远端仓库拉取有变更的文件并合并到工作区
      执行命令:git pull http://xxxx@192.168.1.5:8080/r/GZProject.git master
    

    (f)git diff 比对差异(默认比对工作区与stage)

    (g)合并所有冲突

    (h)git commit提交到本地仓库
      执行命令:git commit -m '一段对当前版本说明的文字'

    (i)git push 提交到云端仓库
      执行命令:git push origin master
      将向origin仓库推送本地master分支

 

(3)git的基本概念
    (a)git三大存储区:repository、stage、workspace

      Repository:仓库,此处指的是本地仓库。即相当于本地正式库。在离线的情况下,使用者可以通过本地仓库保存当前有效的文件变化。

      Stage:暂存区,也有人叫Index区。是用于暂存当前修改的类似于临时保存的区域。比如:当前要执行一个比较大批量的合并操作,合并完成之前,就需要有一个副本时常与当前版本进行比较,而stage,就是离线情况下专门用来干这个的。

      Workspance:工作区,就是git init执行时所在的文件夹,是工程存储的、在磁盘上可见的文件夹的内容。

    (b)HEAD文件指针
      HEAD指针是指向当前最新版本的文件指针(并非一定是本地仓库)。例如:git reset命令会导致其移动至stage区。

二、更多强大功能
  (1)git log 查看本地仓库提交日志查询
    执行命令:git log
    这个命令可以用于查找git仓库当前提交的版本,配合git reset命令可以用于回滚本地仓库的提交。

  (2)git reset 操作HEAD指针(版本回退)
    执行命令:git reset HEAD或者git reset HEAD --mixed
    当前stage区内容会被HEAD指向的本地仓库中的文件版本覆盖

    执行命令:git reset HEAD~2 --hard
    当前stage区、工作区内容会被HEAD指向的本地仓库中的文件版本的往回数两个版本覆盖。

    执行命令:git reset HEAD~ --soft
    本地仓库中HEAD指针往前移动一个版本,相当于撤销一次git commit操作

  (3)git status 查看当前文件情况,常用于合并操作
    查看当前工作区和暂存区的状态,即:哪些内容被提交到缓存区了,哪些没有,差异性什么的。

    执行命令:git checkout ./
    当前目录下(./)的所有内容将以stage区的内容进行覆盖

  (4)git fsck --lost-found找回git add过但已经不存在的文件

  (5)git rm 删除文件
    执行命令:git rm ./
    在git中删除以提交的文件(只是删除工作区和stage区的文件,要删除仓库里的,要提交才行)

  (6)创建与切换分支
    执行命令:git branch feature
    以当前本地仓库中HEAD指针指向的版本创建一个名为feature的版本分支。

    执行命令:git log –decorate
    查看当前版本与分支以及标签情况

    执行命令:Git checkout feature
    本地仓库中的HEAD指针指向名为feature的版本分支,并将HEAD指向的内容还原到工作区。

    执行命令:git log –oneline –decorate –graph –all
    图形化显示分支情况、版本迭代情况

  (7)合并与删除分支
    执行命令:git merge feature
    将feature分支合并到当前HEAD指向的分支(不知道自己当前在哪个分支的,可以使用git log命令查看)

    执行命令:git status
    查看冲突文件,用编辑器或其他编辑工具修改、合并冲突。

    执行命令:git add
    将合并完的内容提交到stage区(此处为简写,有多少改多少,改多少提交多少)

    执行命令:git commit
    将stage区的内容提交到本地仓库

    处理完所有冲突,再次执行git merge,分支就会被合并到master里了,但feature不会被删除

    执行命令:git branch –delete feature
    删除git 分支feature

  (8)匿名分支与git checkout命令
    git branch:查看本地分支
    git branch –r :查看云仓库分支

    git checkout 分支名:将当前工作区内容检出为分支指向分支版本(会直接丢弃当前工作区文件,文件指针也会跟着移动)。
    git checkout :创建一个匿名分支,可以用于实验。若发现实验需要保存,可以用git branch –b 重新指定名称

  (9)git checkout与git reset的区别:
    (a)当操作对象是一个文件时,git reset只能将指定文件覆盖stage区域(若用—文件名指定文件,则不能使用—mix以外的选项)。而git checkout是一定会将文件覆盖stage区和工作目录的。
    (b)当操作对象是一个版本快照时,git reset –hard会直接覆盖掉工作目录和stage区,比较危险。用git checkout ,如果当前工作区有什么没有提交到stage,即git status还有东西返回,checkout就会失败,一定要你提交完内容再checkout
    (c)git reset用于重置分支,相当于将当前HEAD指向的文件快照直接修改,即是:如果当前指向feature分支,执行git reset master –hard,那么feature分支内容将直接变成master分支的内容,同时文件指针也会指过去,相当于丢弃了一个快照。而checkout只是将HEAD指针指过去,feature分支该咋样还是咋样,只是HEAD指向master了而已。