一、Git概述
版本管理的演变
1)集中式的版本管理(SVN)
- 有集中的版本管理服务器
- 具备文件版本管理和分支管理能力
- 集成效率有明显地提高
- 客户端必须时刻和服务器相连
2)分布式的版本管理(Git)
- 服务端和客户端都有完整的版本库
- 脱离服务端、客户端照样可以管理版本
- 查看历史和版本比较等多数操作,都不需要访问服务器,比集中式VCS更能提高版本管理效率
3)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之前的最小配置
- 配置user.name和user.email
$ git config --global user.name 'your_name'
$ git config --global user.email 'your_email@domain.com'
- git config命令的三个作用域
缺省等同于local
$ git config --local ## local只对某个仓库有效
$ git config --global ## global对当前用户所有仓库有效
$ git config --system ## system对系统所有登录的用户有效
- 查看config配置,加--list
$ git config --list #会输出global、local、system所有的配置信息
$ git config --list --global #仅输出global的配置信息
$ git config --list --system #仅输出system的配置信息
$ git config --list --local ##仅输出local的配置信息
- 清除config配置,加--unset
$ git config --unset --global user.name
$ git config --unset --system user.name
$ git config --unset --local user.name
四、创建第一个仓库,并创建local用户
- 创建Git仓库
两种场景
- 把已有的项目代码纳入git管理
$ cd 项目所在文件夹
$ git init
- 新建的项目,直接使用git进行管理
$ cd 某个文件夹
$ git init your_project
$ cd your project
- 向Git仓库中添加文件
$ git add file_name ## file_name表示你的文件的名字
$ git add file_name1 file_name2 file_name3 ## 添加多个文件
$ git add -u ## 保存修改和删除,但是不包括新建文件。
$ git add . ## 保存新的添加和修改,但是不包括删除
$ git add -A ## 保存所有的修改
五、通过几次commit来认识工作区和暂存区、版本历史
通过git log命令来查看版本历史
六、给文件重命名的简便方法
- 麻烦的方式
$ 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命令,直接将文
件名修改
七、通过git log查看版本演变历史
-
查看git log列表
-
指定查看几个版本的历史
3、查看本地的分支信息
4、新建一个临时分支,并稍作修改
查看所有分支历史版本信息
总结
查看详细日志
$ 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
查看git 的命令api文档
$ git help --web log
八、gitk:通过图形界面工具来查看git历史
gitk命令
九、探秘.git文件夹
、
-
HEAD文件
该文件内容为当前的分支信息,切换分支的时候,该文件信息会随之改变,如下图所示
-
config文件
存放了本地仓库的配置信息
-
refs
refs文件中存放了,所有分支和tag(里程碑)信息(40位的hash值),对应的是分支最新的一个commit哈希
-
objects
objects文件夹下都是一些两位数的文件夹,里面存放一个40位hash文件,类型为tree,这个tree文件中又存放了一个blob对象,通cat-file命令查看,发现这个blob就是git管理的文件对象,如图所示是一个css文件。
十、commit、tree、blob三者之间的关系
commit就相当于当前仓库的一个快照,而一个commit也对应一棵tree(目录对应tree,文件对应blob)
tree就相当于文件夹
通过命令行来证明上面的图
十一、数一下tree的个数
答案:有两棵树(commit对应的一棵树,文件夹doc对应的一颗树),一个commit,一个blob
十二、分离头指针情况下的注意事项
分离头指针指的是,HEAD当前没有指向任何一个分支,而是某一个历史commit上。
1、分离头指针状态下,开发的代码,需要关联到分支,如果不关联到分支,在分离头指针状态下,切换到分支上时,分离头指针状态下开发的代码,将会被git清除
十三、进一步理解HEAD和branch
# 基于新分支创建一个老的分支,此时git会自动切换到新建的分支上
$ git checkout -b newbranch oldbranch
# git diff命令可以这样比较两个commit(快照)的之间的差异
$ git diff d3af93fba4f0a 990c6561e69fee
# 使用git diff命令比较版本,也可以使用HEAD来指代当前版本与之前n个版本之间的区别
$ git diff HEAD HEAD~n
十四、删除无用的分支
git branch -d 分子名称
当-d无法删除,并且确认分支无用的情况下,使用-D进行强制删除
十五、怎样修改最新commit的message
十六、怎样修改老旧commit的message
!怎样修改老旧commit的message](https://upload-images.jianshu.io/upload_images/4038260-6ec0f55a8ef04bcd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
想要修改modify index and style这个commit message,则需要使用rebase变基操作,这里要用到这个commit的父亲commit,此时会弹出一个交互窗口,使用r命令来修改message
修改保存退出,又会弹出一个交互窗口,在这个交互窗口中修改commit messge,保存退出
十七、怎样将连续的commit合并成为一个
git rebase -i 父亲commit的hash
在交互窗口中,将要合并的commit 使用squash(压缩命令进行合并),保存退出
输入合并的message保存退出
十八、怎样将间隔的commit合并成为一个
在交互窗口中将要合并的两个commit放到一起,使用s命令进行合并,保存退出
此时会有消息提示
git status查看状态
git rebase continue命令输入合并后的commit messge后,再保存退出
十九、怎么比较暂存区和HEAD所含文件的差异
git diff --cached-------比较暂存区和HEAD的差别
二十、怎么比较工作区和暂存区的差异
git diff 比较工作区暂存区所有的文件差异
git diff -- filepath(可以指定多个文件)
二十一、如何让暂存区恢复成HEAD的版本
git reset HEAD--------取消暂存区的修改,恢复到HEAD版本
二十二、如何让工作区恢复成暂存区的版本
修改暂存区使用git checkout命令,修改暂存区则使用git reset命令
二十三、怎么取消暂存区部分文件的修改
取消暂存区中index.html的修改
二十四、消除最近的几次提交
二十五、看看不同commit的指定文件的差异
二十六、正确删除文件看的方法
二十七、开发中紧急加塞了紧急任务怎么处理
正常开发需求,修改了index.html和js文件
此时临时加塞了一个需求,比如项目bug修改,这个时候就需要把上面需求开发的代码暂存起来,用到命令git stash
可以看到之前两个文件的修改都被暂存到stash中了,然后我们就能开发我们的新需求
新需求开发完毕,提交版本库后,我们回过头来取出stash中暂存的两个文件修改
发现我们之前开发的代码被恢复了回来
二十八、如何指定不需要git管理的文件
通过添加名为.gitignore的文件,来指定
二十九、如何将git仓库备份到本地
新建一个文件夹git-backup,克隆远程仓库,可以看到远程仓库有两个分支master,temp
然后再远程仓库git_learning中添加备份仓库地址,新建一个pyy的分支,并push到备份仓库
然后查看备份仓库中的分支信息,发现也更新了pyy的分支