Git记录

2022-05-29  本文已影响0人  欢西西西
image.png

1、初始化

git init

生成一个.git文件夹.png

git中的对象类型:

  1. blob 保存文件内容
  2. commit 其中保存了一个tree对象,它保存了根目录结构的tree对象和blob对象,里面的tree又保存了下一级的结构,所以相当于一个commit对象中保存了本次提交的所有文件的快照。
    也保存了上次提交的commit对象的指针,以便回溯
    也保存了作者和提交备注
  3. tree 保存目录结构,其中可以包括tree对象和blob对象

2、文件管理

哈希值仅根据文件内容生成,无所谓文件名,这样【多文件同内容】的话就只需要保存一份文件内容。
SHA1算法,对于任意长度的输入,都输出160bit(长度40位-2进制转16进制)

2.1 新增一个文件

image.png

2.2 git add wxm.txt

git add 操作文档


此时objects文件夹下新增了一个文件,文件夹命名为哈希值前2位,文件名为剩下的38位、
使用git cat-file -t [hash] 查看此文件的类型:blob
image.png
使用git cat-file -p [hash] 查看此文件的内容:
image.png
image.png

2.3 修改此文件

image.png

2.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 分支介绍

分支是一个有名字的指针,指向一个特定的commit,初始化后默认处于master分支
HEAD指向当前工作的分支,并且指向最新的一次提交

image.png

这个master文件保存了一个哈希值,这个哈希值对应最新一次提交的commit对象


image.png

4.2 分支操作

  1. 新建:git branch [branch name]

    heads里面多了一个wxm_dev
  2. 查看分支:git branch

    master前面有个星号,代表当前处于master分支
  3. 查看当前分支以及指向的commit git branch -v

    image.png
  4. 切换分支 git checkout wxm_dev

    此时星号变到了wxm_dev前面
    HEAD也指向了wxm_dev
  5. 直接切换到某个commit git checkout [commit_id]
    因为分支只是commit的别名,也可以直接checkout出指定提交而不是分支,本质上是一样的。这种操作经常用于查看某一个旧版本的项目快照,不应在这种游离状态下创建提交。

  6. 新建并切换到该分支 git checkout -b [new branch name]

  7. 删除分支 git branch -d [branch name]

  1. 合并分支 git merge [branch name] 将指定分支合并到当前分支
  2. 解决冲突


    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 --since=2.weeks --author=longpp --grep=fix --oneline


git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。
示例:git reflog

6.3 撤销、暂存与回滚

情况一、文件被修改了,但未执行git add操作,想丢弃修改(working tree内撤销)

情况二、文件已经执行了git add操作,但是本次又不想提交它了(index内撤销)

情况三、文件已修改未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] 不支持 通过新建一个提交来撤销之前的某次提交。因为不会重写提交历史,被认为是一种安全的撤销操作。
从branch dev checkout到master reset到commit 1 revert commit2,则本次自动提交的内容就是还原commit2的更改,实际并不影响之前的提交

6.5 :git blame

git blame [filename] 查看文件每行的作者、修改时间、提交SHA-1值

image.png

6.6 git rm 删除

6.7 git restore 、rebase

6.8 git diff 和 git diff --cached

7、其他

7.1 垃圾对象

7.2 标签tag和分支branch

7.3 查看帮助 git add --help

7.4 退出分页 按q键

7.5 vi 编辑器

$ vi a.txt

进入命令模式,按 i 或 a 进入编辑模式,保存文件要按 esc 先退出编辑状态,输入:x保存文件

上一篇下一篇

猜你喜欢

热点阅读