以下资料在官网都有,且有详细的说明。文档地址: https://git-scm.com/book/zh/v2
一、Git综述
1、VCS出现前的状况
- 用目录拷贝区别不同版本
- 公共文件容易被覆盖
- 成员沟通成本很高,代码集成效率低下
2、集中式VCS(SVN)
- 有集中的版本管理服务器
- 具备文件版本管理和分支管理能力
- 集成效率有明显地提高
- 客户端必须时刻和服务器相连
3、分布式VCS(Git、Github、Gitlab)
- 服务端和客户端都有完整的版本库
- 脱离服务端、客户端照样可以管理版本
- 查看历史和版本比较等多数操作,都不需要访问服务器,比集中式VCS更能提高版本管理效率
4、Git的特点
- 最优的存储能力
- 非凡的性能
- 开源的
- 很容易做备份
- 支持离线操作
- 很容易定制工作流程
二、安装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信息
- 配置user.name和user.email
$ git config --global user.name 'your_name'
$ git config --global user.email '[email protected]'
- git config命令的三个作用域
缺省等同于local
$ git config --local ## local只对某个仓库有效
$ git config --global ## global对当前用户所有仓库有效
$ git config --system ## system对系统所有登录的用户有效
- 查看config配置,加--list
$ git config --list
$ git config --list --global
$ git config --list --system
$ git config --list --local
- 清除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、两种方式
- 用Git之前,已经存在项目代码
$ cd 项目代码所在的文件夹
$ git init
- 用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仓库中工作区、暂存区、版本历史的关系
4、在Git仓库中给文件重命名
- 麻烦的方式
$ mv old_file_name new_file_name ## 第一步,修改文件名
$ git add new_file_name ## 第二步,将修改后的文件,添加到Git中
$ git rm old_file_name ## 第三步,移除掉旧的文件
- 简单的方式
$ git mv old_file_name new_file_name ## 通过git mv命令,直接将文件名修改
5、查看Git仓库的日志
- 查看详细日志
$ git log
$ git log --graph ## 图形化显示
$ git log branch_name ## 查看branch_name分支的日志
- 查看简洁日志
$ git log --oneline
$ git log --oneline branch_name ## 查看branch_name分支的日志
$ git log --oneline --all
$ git log --oneline --graph
- 查看最近几次的日志
$ 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的关系
8、Git的分离头指针
分离头指针的应用场景:如果临时想基于某个commit做变更,试试新方案是否可行,就可以采用分离头指针的方式。测试后发现新方案不成熟,直接reset回其他分支即可。省却了建、删分支的麻烦了。
当创建一个分离头指针的时候,在切换分支时,记得将分离头挂到一个分支上,不然基于分离头提交的commit容易丢失
$ git branch branch_name commit_id
9、HEAD和Branch的关系
HEAD可以指向Branch的最新一次的提交,也可以指向Branch的某次提交(分离头状态)
- 一个节点,可以包含多个子节点(checkout 出多个分支)
- 一个节点可以有多个父节点(多个分支合并)
- ~和都是父节点,区别是跟随数字时候,2 是第二个父节点,而~2是父节点的父节点
- ~和^可以组合使用,例如 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命令
- 将现在工作区的内容存进stash
$ git stash stash_name
- 将stash中的内容放回工作区
$ git stash apply ## apply这种方式,即使将内容放回工作区后,也不会删除stash中的内容
$ git stash pop ## pop这种方式,是将内容放回工作区后,同时也将stash中的内容删除
22.clone命令
- 克隆一个裸仓库(裸仓库对代码平台的意义很大)
裸仓库就是只有.git 没有work、tree的仓库
$ git clone --bare path name ## path表示要克隆的仓库的路径,name表示克隆下来的新仓库的名字
- 克隆一个带工作空间的仓库
$ git clone url
- 仓库分为本地仓库、本地远程仓库和远程仓库
23.Git的备份
1.常用的传输协议
2.哑协议与只能协议
直观区别:哑协议传输进度不可见,智能协议可见
传输速度:智能协议比哑协议传输速度快
3.备份特点