git的特点
- 最优的存储能力
- 非凡的性能
- 开源的
- 很容易做备份
- 支持离线操作
- 很容易定制工作流程
git的使用
配置user信息
git config --global user.name 'your_name' // 配置用户名
git config --blobal user.email 'your_email@domain.com' // 配置用户邮箱
--gloabl // 对所有仓库起作用
--local // 只对该仓库起作用,默认为local
--system // 对该系统上的所有用户都起作用
// 显示目前config的配置, 加 --list
git config --list // 该系统上的所有config配置
git config --list --local
git config --list --global
git config --list --system
解析.git文件夹
.git
|----HEAD # 存储当前所在分支名称
|----config # 存储了本地仓库的相关配置信息以及本地分支信息等
|----refs
|----heads # 存储了当前仓库本地所有分支当前所指向的commit的ID
|----remotes # 存储了当前仓库远程所有分支当前所指向的commit的ID
|----tags # 存储了当前仓库所有tag当前所指向的commit的ID
|----stash # 存储了当前仓库stash中最后一次暂存所生成的commitID
|----objects #存储了本地仓库中所有的git对象
# object存储了git中的所有对象(commit、tree、blob),每个对象在生成的时候都会生成一个40位的哈希值
#哈希值的前两位将作为文件夹名,后38位将作为文件名存放在对应的文件夹中,当进行对应操作是就会根据哈希值去存取对应的git对象。
# 比如:执行git stash操作时,会生成一个commit对象并根据生成的哈希值存储到objects文件夹中
# 当执行git stash pop时就会读取refs文件夹下的stash文件中的哈希值,去objects文件夹中读取对应的对象来执行相应的操作。
git 存储机制
# git 常用命令
git cat-file -p [hashId] // 查看该hashId 对应的内容
git cat-file -t [hashId] // 查看该hashId 对应的类型(commit、tree、blob)
git 中一共含有三大类型,分别为
commit、tree、blob,其中一个commit一定对应一个tree,tree上可能含有tree、blob,但是在tree的根节点上肯定为blob类型.
在git中不关心文件名,只关心文件内容,所有文件内容相同的文件只会存储一份,而不会以不同的文件名存储多份,在很大程度上减少了文件存储的体积,提高了文件的利用率。
git提交流程
// 远程建立仓库
***
// 本地与远程仓库建立连接
git remote add origin 远程仓库地址
// 此时本地有已经开发完成的代码
// 将需要提交的代码加入暂存区
// 全部暂存
git add *
// 暂存需要的文件可以使用模糊匹配
git add src/page/* // 暂存src/page文件夹下的所有修改的文件
// 将暂存的修改进行提交
git commit -m '这里替换为此次提交的描述'
// 将提交推送到远程仓库
git push <branch name> // 如果默认推送到与本地分支相同的远程分支,则后面的远程分支名称可以省略,否则需要指定远程分支,默认为本分支,多人协作开发提交前需要进行拉取下远程分支代码(执行git pull),否则有可能无法提交
// 拉取远程分支最新改动
git pull
git log
git log 命令可以查看目前git仓库中的所有提交日志,方便查看之前历史版本,回顾进行了那些修改。
git log:默认查看当前分支的所有提交日志
git log [branch]:查看某个分支的所有提交日志
git log --all: 查看所有分支的所有提交日志
git log --all --graph:以图形化的形式显示所有分支的所有提交日志,可以清晰的展示出各个分支之间的关联。
各个参数可以叠加使用。比如:git log master --oneline -4 --graph表示以简要、图形化的形式查看master分支的最后4条提交日志。
git log -[number]: 参数number为你要显示的日志条数,当日志数量较多时较为常用,可以先查看部分日志。
比如:git log -4: 查看最近的4条提交日志
git log --oneline:以简要的形式查看提交日志,加上--oneline参数会将日志以简要信息的形式进行展现,如果不加该参数将会展示每条日志的详细描述。改参数同样可以配置-[number]参数进行使用。
比如:git log -4 --oneline:查看最近的4条提交日志的简要信息
gitk
使用该命令将会打开git自带的图形化版本控制系统,里面可以查看各种提交日志的详细信息等等。
解决gitk中文乱码问题:git config --global gui.encoding utf-8
git stash(将修改暂存堆栈)
// 当我们在开发过程中需要临时切换分支或者有紧急需求时,有时代码还不能提交,这时就需要将代码临时存储在堆栈(stash)中,当需要时再将存储的内容在堆栈中取出。
// 存储代码(相当于入栈操作)
git stash
// 查看堆栈中所有暂存修改
git stash list
// 取出堆栈中最后一次暂存(入栈)代码
git stash pop // 该操作会将代码在堆栈中取出并在堆栈中删除该记录(相当于出栈操作)
git stash apply // 该操作会将代码在堆栈中取出但是并不会进行出栈操作
// 取出堆栈列表中的具体某一条记录
git stash apply stash@{记录编号} // 该操作同样只会将记录取出,不会执行出栈操作
git revert(撤销操作)
git revert用于撤销指定版本的内容并创建一个新的commit,不删除之前版本的commit。
# 撤销上一次commit
git revert HEAD
# 撤销上上次commit
git revert HEAD^
# 撤销指定版本commit
# eg: git revert 9b01c12b2b8006f4e1c40e395c44fa3578183d95
git revert commit-id
# 如果在撤销过程中遇到冲突,但此时又不想解决时,可以进行撤销revert
git revert --abort
# 冲突解决之后可以进行后续操作
git add .
git revert --continue
git reset(撤销操作)
git reset同样是对内容进行撤销操作。共有三种模式,分别为:git reset --soft、git reset --mixed、git reset --hard.
git reset --soft
该模式对现有版本库改动最小,会将给定提交之后的提交还原为执行git add之后的状态。如下图所示:

git log命令可以看到已经当前HEAD为给定的提交。
git reset --mixed
该模式同git reset --soft差不多,区别在于会将给定操作之后的提交变为执行git add之前的状态,也就是相当于ctrl + s的状态。该模式也是git reset的默认模式。如下图所示:

git reset --hard
该模式会将给定提交之后的所有提交全部删除,版本彻底回到给定提交版本,此操作较为危险。如下图所示:

--soft、--mixed模式比较适合撤回已经commit后的内容,--hard适合确定需要舍弃指定提交后commit后提交内容时使用。
