Git记录
1、初始化
git init
git中的对象类型:
- blob 保存文件内容
- commit 其中保存了一个tree对象,它保存了根目录结构的tree对象和blob对象,里面的tree又保存了下一级的结构,所以相当于一个commit对象中保存了本次提交的所有文件的快照。
也保存了上次提交的commit对象的指针,以便回溯
也保存了作者和提交备注- tree 保存目录结构,其中可以包括tree对象和blob对象
2、文件管理
哈希值仅根据文件内容生成,无所谓文件名,这样【多文件同内容】的话就只需要保存一份文件内容。
SHA1算法,对于任意长度的输入,都输出160bit(长度40位-2进制转16进制)
2.1 新增一个文件
image.png2.2 git add wxm.txt
此时objects文件夹下新增了一个文件,文件夹命名为哈希值前2位,文件名为剩下的38位、
使用
git cat-file -t [hash]
查看此文件的类型:blobimage.png
使用
git cat-file -p [hash]
查看此文件的内容:image.png
image.png
2.3 修改此文件
image.png2.4 再执行一次git add wxm.txt
image.png
objects文件夹下又生成了一个文件,保存修改后的文件内容
image.png
2.5 提交 git commit -m [提交备注]
image.png
查看提交记录:
image.png
相比之前的4f41和c36d,objects又多了2个文件:
image.png
查看这两个文件的类型:
image.png
查看commit对象的内容:
image.png
查看tree对象的内容:
image.png
2.6 新增文件夹,并 git add testFold
image.png
objects下又新生成了这两个blob类型的文件(注意,此时只生成了2个文件的blob对象,没有生成文件夹对应的tree对象,文件夹对应的tree对象是在commit时才生成)
image.png
2.7 提交并查看提交记录 git log
image.png
上图:最新的commit对象为7eba,上一次是7308
image.png
上图可以看出,commit对象里记录了一个tree对象的指针(888e),这个tree里面保存了当前提交版本的所有文件指针的快照。
还保存了上次提交的commit对象的指针(7308):parent
此时objects下新生成了4个文件:(1个commit,3个tree(其中1个tree是本次提交时所有文件的快照,2个tree是新增的那两个文件夹结构))
image.png
其中:888e就是最新提交那个版本的文件快照,查看888e的内容(从中也可以看出文件结构):
项目下有一个testFold文件夹和wxm.txt查看testFold文件夹的指针c668:
表示testFold文件夹下有一个fold2文件夹和一个name.txt
查看fold2文件夹的指针b228:
表示fold2文件夹中有个fold.txt文件
2.8 新增一个空的文件夹
发现工作区和暂存区是同步的,空的文件夹不会算作变更。文件夹里必须要有内容。
image.png
3、文件的状态
image.png还有一个deleted状态
还有一个deleted状态
4、branch和HEAD
4.1 分支介绍
image.png分支是一个有名字的指针,指向一个特定的commit,初始化后默认处于master分支
HEAD指向当前工作的分支,并且指向最新的一次提交
这个master文件保存了一个哈希值,这个哈希值对应最新一次提交的commit对象
image.png
4.2 分支操作
-
新建:
heads里面多了一个wxm_devgit branch [branch name]
-
查看分支:
master前面有个星号,代表当前处于master分支git branch
-
查看当前分支以及指向的commit
image.pnggit branch -v
-
切换分支
此时星号变到了wxm_dev前面git checkout wxm_dev
HEAD也指向了wxm_dev -
直接切换到某个commit
git checkout [commit_id]
因为分支只是commit的别名,也可以直接checkout出指定提交而不是分支,本质上是一样的。这种操作经常用于查看某一个旧版本的项目快照,不应在这种游离状态下创建提交。 -
新建并切换到该分支
git checkout -b [new branch name]
-
删除分支
git branch -d [branch name]
- 不能删除当前功能分支,所以要先切到其他分支
- 删除分支时,在这个分支上产生的特有的blob文件并不会被删除
- 可以使用
git branch -D [branch nam]
强制删除分支,但不建议,因为-D命令不会校验这个分支是否被合并
- 合并分支
git merge [branch name]
将指定分支合并到当前分支 -
解决冲突
image.png
解决完冲突后add并commit
5、远程仓库
5.1 添加远程仓库
git remote add origin [url]
5.2 push & pull
还自动创建了分支。TODO:加图
6、常用命令
6.1 git status
查看工作区和暂存区的状态
6.2 日志:git log 和 git reflog
-
git log
显示当前分支所有提交过的版本信息,常用选项。
git log [filename]
显示指定文件的修改[提交]记录
示例:git log --since=2.weeks --author=longpp --grep=fix --oneline
git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。示例:
git reflog
6.3 撤销、暂存与回滚
情况一、文件被修改了,但未执行git add操作,想丢弃修改(working tree内撤销)
- 指定文件:
git checkout [filename]
- 所有修改的文件:
git checkout .
情况二、文件已经执行了git add操作,但是本次又不想提交它了(index内撤销)
-
git reset HEAD [filename]
,取消暂存区的指定文件,此时状态会回到情况一 - 再对暂存区剩下的要提交的执行commit就行了
- 不传filename则会取消暂存区所有修改
情况三、文件已修改未git add,需要暂存已经修改的内容
- 执行
git stash save '本次暂存备注'
- stash并不会存新增的文件,新增的文件要先add再stash
- 查看暂存的列表:
git stash list
- 弹出暂存列表里最新一次的缓存:
git stash pop
- git stash 文档
- 如果已经操作了git add又不想提交了,想把修改暂存起来,那先按情况二操作,再暂存
6.4 :git checkout、git reset 和 git revert
常用操作:
命令 | 提交层面 | 文件层面 | 说明 |
---|---|---|---|
checkout | 切换分支/标签git checkout [branch name] 、git checkout [tag name] 。会将当前HEAD指针指向指定的提交 |
丢弃工作区的修改git checkout [filename] 、或将文件切换到某次提交里的版本git checkout [commit_id] [file name]
|
切换分支只切换HEAD的指针,不会移动分支本身的指针 |
reset | 只应操作那些还未与他人共享过的变更:git reset --hard [commit_id] 。否则建议使用revert |
将文件从暂存区中移除git reset HEAD [filename]
|
会改变分支所指向的提交,并且丢弃它之后的提交 |
revert | 撤销公共分支上的变更git revert [commit_id]
|
不支持 | 通过新建一个提交来撤销之前的某次提交。因为不会重写提交历史,被认为是一种安全的撤销操作。 |
6.5 :git blame
git blame [filename]
查看文件每行的作者、修改时间、提交SHA-1值
6.6 git rm 删除
- 删除本地和暂存区中的文件:
git rm a.txt
(前提是文件未修改),如果修改过,会删除失败,此时需要使用 -f 或 --cached -
git rm -f a.txt
强制删除本地和暂存区中的文件 -
git rm --cached a.txt
删除暂存区中的文件,保留本地文件
6.7 git restore 、rebase
6.8 git diff 和 git diff --cached
7、其他
7.1 垃圾对象
- 删除分支时,在这个分支上生成过的特有的git对象,并不会被删除
- 多次修改同一个文件后git add,但只有最后一个版本的被提交了,那么期间生成的blob对象并不会被引用
-
git gc
与 objects/pack文件夹
7.2 标签tag和分支branch
- 都是指针,指向某次commit对象
- tag代表了当前的提交点,在给指定提交打了标签后则不会改变。
- branch的位置会不断变动的,随着提交不断推移
7.3 查看帮助 git add --help
7.4 退出分页 按q键
7.5 vi 编辑器
$ vi a.txt
进入命令模式,按 i 或 a 进入编辑模式,保存文件要按 esc 先退出编辑状态,输入:x
保存文件