玩转Git三剑客

一、Git综述

1、VCS出现前的状况

  1. 用目录拷贝区别不同版本
  2. 公共文件容易被覆盖
  3. 成员沟通成本很高,代码集成效率低下
玩转Git三剑客_第1张图片
image

2、集中式VCS(SVN)

  1. 有集中的版本管理服务器
  2. 具备文件版本管理和分支管理能力
  3. 集成效率有明显地提高
  4. 客户端必须时刻和服务器相连
玩转Git三剑客_第2张图片
image

3、分布式VCS(Git、Github、Gitlab)

  1. 服务端和客户端都有完整的版本库
  2. 脱离服务端、客户端照样可以管理版本
  3. 查看历史和版本比较等多数操作,都不需要访问服务器,比集中式VCS更能提高版本管理效率
玩转Git三剑客_第3张图片
分布式版本控制系统

4、Git的特点

  1. 最优的存储能力
  2. 非凡的性能
  3. 开源的
  4. 很容易做备份
  5. 支持离线操作
  6. 很容易定制工作流程

二、安装Git

1、Git官方文档地址:

https://git-scm.com/book/zh/v2

2、macOS 平台 Git 下载地址:

https://git-scm.com/download/mac

3、Windows 平台 Git 下载地址:

https://git-scm.com/download/win

4、Linux 平台 Git 下载地址:

https://git-scm.com/download/linux

5、检查安装结果

$ git --version ## 通过执行该命令,看git是否返回版本信息

三、使用Git之前需要做的最小配置

1、配置user信息

  1. 配置user.name和user.email
$ git config --global user.name 'your_name'
$ git config --global user.email '[email protected]'
  1. git config命令的三个作用域
    缺省等同于local
$ git config --local ## local只对某个仓库有效
$ git config --global ## global对当前用户所有仓库有效
$ git config --system ## system对系统所有登录的用户有效
  1. 查看config配置,加--list
$ git config --list
$ git config --list --global
$ git config --list --system
$ git config --list --local
  1. 清除config配置,加--unset
$ git config --unset --global user.name
$ git config --unset --system user.name
$ git config --unset --local user.name

local、global、system的优先级:
local>global>system

四、创建Git仓库、Git基本命令

1、两种方式

  1. 用Git之前,已经存在项目代码
$ cd 项目代码所在的文件夹
$ git init
  1. 用Git之前,还不存在项目代码
$ cd 某个文件夹
$ git init your_project_name ## 会在当前路径下创建与项目名同名的文件夹
$ cd your_project

2、向Git仓库中添加文件

$ git add file_name ## file_name表示你的文件的名字
$ git add file_name1 file_name2 file_name3 ## 添加多个文件
$ git add -u ## 添加全部文件
$ git add . ## 添加该目录下的全部文件

3、Git仓库中工作区、暂存区、版本历史的关系

玩转Git三剑客_第4张图片
image

4、在Git仓库中给文件重命名

  1. 麻烦的方式
$ mv old_file_name new_file_name ## 第一步,修改文件名
$ git add new_file_name ## 第二步,将修改后的文件,添加到Git中
$ git rm old_file_name ## 第三步,移除掉旧的文件
  1. 简单的方式
$ git mv old_file_name new_file_name ## 通过git mv命令,直接将文件名修改

5、查看Git仓库的日志

  1. 查看详细日志
$ git log
$ git log --graph ## 图形化显示
$ git log branch_name ## 查看branch_name分支的日志
  1. 查看简洁日志
$ git log --oneline
$ git log --oneline branch_name ## 查看branch_name分支的日志
$ git log --oneline --all
$ git log --oneline --graph
  1. 查看最近几次的日志
$ git log -n4 ## n4表示查看最近4次的日志
$ git log --oneline -n4

6、git cat-file命令

$ git cat-file -t hash_id ## 查看该hash_id属于什么类型
$ git cat-file -p hash_id ## 查看该hash_id下的内容

7、Git中核心对象commit、tree、blob的关系

玩转Git三剑客_第5张图片
image

8、Git的分离头指针

分离头指针的应用场景:如果临时想基于某个commit做变更,试试新方案是否可行,就可以采用分离头指针的方式。测试后发现新方案不成熟,直接reset回其他分支即可。省却了建、删分支的麻烦了。

当创建一个分离头指针的时候,在切换分支时,记得将分离头挂到一个分支上,不然基于分离头提交的commit容易丢失

$ git branch branch_name commit_id

9、HEAD和Branch的关系

HEAD可以指向Branch的最新一次的提交,也可以指向Branch的某次提交(分离头状态)

  1. 一个节点,可以包含多个子节点(checkout 出多个分支)
  2. 一个节点可以有多个父节点(多个分支合并)
  3. ~和都是父节点,区别是跟随数字时候,2 是第二个父节点,而~2是父节点的父节点
  4. ~和^可以组合使用,例如 HEAD~2^2
$ git checkout -b branch_name commit_id ## 基于commit_id所在的提交,新建一个分支

10、删除分支

$ git branch -d branch_name
$ git branch -D branch_name

使用-d 在删除前Git会判断在该分支上开发的功能是否被merge到其它分支。如果没有,不能删除。如果merge到其它分支,但之后又在其上做了开发,使用-d还是不能删除。-D会强制删除。

11、提交命令

$ git commit -m '' ## 将缓存区的内容提交

12、修改commit的message

$ git commit --amend ## 修改最近一次commit的message
$ git rebase -i commit_id ## 该commit_id是我们要修改的那个commit的父commit,或者说是我们要修改的那个commit的上一个commit的id

注:修改commit的message只限于在没有push远程仓库之前,如果已经push到了远程仓库,那么禁止修改message

13、将几个连续commit整理成一个commit

$ git rebase -i 开始commit [结束commit]

在执行这个命令时,
如果没有指定 结束commit,那么结束commit 默认为当前分支最新的 commit,那么rebase 结束后会自动更新当前分支指向的 commit,
如果指定了结束 commit,而且结束 commit不是当前分支最新的 commit,那么rebase 后会有生成一个 游离的 head,,而且当前分支指向的commit 不会更新

14、暂存区和HEAD所含文件的差异

$ git diff --cached

15、工作区和暂存区所含文件的差异

$ git diff

16、暂存区恢复成和HEAD一样

$ git reset HEAD  ## 恢复所有文件
$ git reset HEAD -- file_name1 file_name2 ## 恢复指定文件

17、工作区恢复成暂存区一样

$ git checkout
$ git checkout -- file_name

18、消除最近几次提交

$ git reset --hard commit_id

19、查看分支

$ git branch
$ git branch -a
$ git branch -v
$ git branch -av
$ git branch -vv

20、删除文件

$ git rm filename ## 删除工作区中的文件
$ git rm --cached filename ## 删除暂存区中的文件

21.stash命令

  1. 将现在工作区的内容存进stash
$ git stash stash_name
  1. 将stash中的内容放回工作区
$ git stash apply  ## apply这种方式,即使将内容放回工作区后,也不会删除stash中的内容
$ git stash pop  ## pop这种方式,是将内容放回工作区后,同时也将stash中的内容删除

22.clone命令

  1. 克隆一个裸仓库(裸仓库对代码平台的意义很大)
    裸仓库就是只有.git 没有work、tree的仓库
$ git clone --bare path name ## path表示要克隆的仓库的路径,name表示克隆下来的新仓库的名字
  1. 克隆一个带工作空间的仓库
$ git clone url
  1. 仓库分为本地仓库、本地远程仓库和远程仓库

你可能感兴趣的:(玩转Git三剑客)