Git学习之路
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情
安装
- Windows上安装
- Mac上安装
[mac安装包](Git - Downloading Package (git-scm.com))
- 查看是否安装成功
git --version
配置
- /etc/gitconfig文件:系统中对所有用户都普遍适用的配置,若使用git config时用--system选项,读写的就是这个文件
- ~/.gitconfig文件:用户目录下的配置文件只适用于该用户,若使用git config时用--global选项,读写的就是这个文件
- .git/config文件:当前项目的Git目录中的配置文件(也就是工作目录中的.git/config文件)这里的配置仅仅针对当前项目有效
配置用户信息
git config --global user.name '用户名'
git config --global user.email 邮箱地址
git config --list//查看已有配置信息
区域
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
- 版本区:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
对象
- Git对象
- 树对象
- 提交对象
Git底层命令
1.Linux基本命令
- clear:清楚屏幕
- echo '信息':往控制台输出信息...
- echo ‘内容’>文件名.txt:创建文件并填写内容...
- ll:将当前目录下的子文件&子目录平铺在控制台
- find 目录名:将对应目录下的子孙文件&子孙目录平铺在控制台
- find 目录名 -type f :将对应目录下的文件平铺在控制台
- rm 文件名:删除文件
- mv 源文件 重命名文件:重命名
- cat 文件的url:查看对应文件的内容
- vim 文件的url
- 按i进入插入模式 进行文件编辑
- 按esc键&按:键进行命令的执行
- q! 强制退出(不保存)
- wq 保存退出
- set nu 设置行号
2.初始化新仓库
git init//初始化仓库
git clone// 拷贝一份远程仓库,也就是下载一个项目。
3.git目录
- hooks 目录包含客户端或者服务端的钩子脚本;
- info 包含一个全局性排除文件
- logs 保存日志信息
- objects 目录存储所有数据内容;
- refs 目录存储指向数据(分支的提交对象的指针)
- config 文件包含项目特有的配置选项
- description 用来显示对仓库的描述信息
- HEAD 文件指示目前被检出的分支
- index 文件保存暂存区信息
4.git对象
Git的核心是一个简单的键值对数据库.你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容
-
向数据库写入内容 并返回对应键值
-
命令:
echo 'test content' | git hash-object -w --stdin-
-w选项指示 hash-object 命令存储数据对象;若不指定此选项,则该命令仅返回对应的键值
-
--stdin(standard input)选项则指示该命令从标准输入读取内容;若不指定的话,则须在命令尾部给出待存储文件的路径
-
git hash-object -w 文件路径 //存文件 -
git hash-object 文件路径 //返回对应文件的键值该命令输出一个长度为40个字符的校验和° 这是一个SHA-1哈希值
-
-
-
查看Git是如何存储数据
-
命令:
find .git/objects -type f-
返回:
-
.git/objects/d6/..............
这就是开始时Git存储内容的方式:一个文件对应一条内容°校验和的前两字符
-
-
-
根据键值拉取数据
-
命令:
git cat-file -p 键值....... //-p选项可指令该命令自动判断内容的类型,并为我们显示格式友好的内容- 返回对应文件的内容
-
5.对一个文件进行简单版本控制(流程)
-
创建一个新文件并将其内容存入数据库
echo '内容' > test.txt git hash-object -w test.txt返回一个键值.......例如(asdk1321askndksjad)
-
向文件里边写入新内容,并再次将其存入数据库
echo '内容2' > test.txt git hash-object -w test.txt返回一个新键值.....例如(12fasfas12edsa)
-
查看数据库内容
find .git/objects -type f git cat-file -p asdk1321askndksjad git cat-file -p 12fasfas12edsa git cat-file -t 12fasfas12edsa //利用cat-file-t命令可以让Git告诉我们其内部存储的任何对象类型返回:blob
-
缺点
- 难以记住每个版本对应的SHA-1值
- 在Git中文件名并没有被保存-仅保存了文件内容
- 解决方案(树对象)
-
注意
- 当前操作都是在对本地数据库进行操作,不涉及暂存区
6.树对象
我们可以通过update-index;write-tree;read-tree等命令来构建树对象并塞入暂存区
-
1、利用update-index命令为test.txt文件首个版本创建一个暂存区,并通过write-tree命令生成树对象
git update-index --add --cacheinfo 100644\92139012asdads(键值)test.txt git write-tree文件模式:
- 100644表明是一个普通文件
- 100755表明是一个可执行文件
- 120000表示一个符号链接
--add选项:因为此前该文件不在暂存区,首次需要--add --cacheinfo选项:
因为添加的文件位于git数据库中,而不是当前目录下所以需要--cacheinfo
-
2、新增new.txt 将new.txt和test.txt文件的第二个版本塞入暂存区,并通过write-tree生成树对象
echo 'newfile' > new.txt git update-index --cacheinfo 100644\isa21399sadasfo(键值) test.txt git update-index --add new.txt git write-tree -
3、将第一个树对象加入第二个树对象中,使其成为新的树对象
git read-tree --prefix=bak dasd09123sad12(键值) git write-treeread-tree表明可以把树对象读入暂存区
-
树对象相关操作
-
查看暂存区当前的样子
git ls-files -s -
查看树对象
git cat-file -p master^{tree}(或者是树对象的hash) //master^{tree}表示master分支上最新的提交所指向的树对象 -
返回
100644 blob 123aSdaasdakwqdai README
100644 blob 213asdilas123sdalda Rakefile
040000 tree 123sakduli2sadljndsa lib
以上hash都是随便写的,总之会与上方的hash值一致
-
7.提交对象
我们可以通过调用commit-tree命令创建一个提交对象,为此需要指定一个树对象的SHA-1值,以及该提交的父提交对象(如果有的话,第一次将暂存区做快照就没有父对象)
-
创建提交对象
echo 'first commit' | git commit-tree d8329f返回: fdsadf3afdsakfasu123usaku12(乱写的....真实的自己测)
-
查看提交对象
git cat-file -p fdf4fc3
Git高层命令
CRUD
| 命令 | 作用 |
|---|---|
| git init | 初始化仓库 |
| git status | 查看文件的状态 |
| git diff | 查看哪些修改还没有暂存 |
| git diff --staged | 查看哪些修改以及被暂存了还没提交 |
| git log --oneline | 查看提交的历史记录 |
| git add ./ | 将修改添加到暂存区 |
| git rm 文件名 | 删除工作目录中对应的文件再将修改添加到暂存区 |
| git mv 原文件名 新文件名 | 将工作目录中的文件进行重命名,再将修改添加到暂存区 |
| git commit -a -m 注释 | 将暂存区提交到版本库 |
分支
| 命令名 | 作用 |
|---|---|
| git branch | 显示分支列表 |
| git branch 分支名 | 创建分支 |
| git checkout 分支名 | 切换分支 |
| git branch -D 分支名 | 强制删除分支 |
| git branch -d 分支名 | 删除空的分支,删除已经被合并的分支 |
Git存储
git stash命令
会将未完成订单修改保存到一个栈上,你可以在任何时候重新应用这些改动(git stash apply)
| 命令名 | 作用 |
|---|---|
| git stash list | 查看存储 |
| git satsh apply stash@{2} | 如果不指定一个储藏,Git认为指定的是最近的储藏 |
| git stash drop | 加上将要移除的储藏的名字来移除它 |
| git stash pop | l来应用储藏然后立即从栈上扔掉它 |
撤销&&重置
-
撤销
-
git commit -amend作用:
这个命令会将暂存区中的文件提交
如果你提交后发现忘记暂存某些需要的修改,可以向下面这样操作
git commit -m 'initial commit' git add forgotten_file git commit amend //最终你只会有一个提交-第二次提交将代替第一次提交的结果 -
git reset命令:git reset HEAD 文件名
作用:将文件从暂存区中撤回到工作目录
-
git checkout命令:git checkout --文件名
作用:将在工作目录中对文件的修改撤销
注意:想清楚了不要那个文件再使用该命令
-
-
重置
-
三部曲:
-
第一部:
git reset --soft HEAD~ (--amend) //只动HEAD(带着分支一起移动) -
第二部:
git reset [--mixed] HEAD~ //动HEAD (带着分支一起移动)动了暂存区 -
第三部:
git reset --hard HEAD~ //动HEAD(带着分支一起移动)动了暂存区、工作目录
-
-
Git相关教程可参考