Git记录

作者: 欢西西西 | 来源:发表于2022-05-29 16:06 被阅读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]

    • 不能删除当前功能分支,所以要先切到其他分支
    • 删除分支时,在这个分支上产生的特有的blob文件并不会被删除
    • 可以使用 git branch -D [branch nam]强制删除分支,但不建议,因为-D命令不会校验这个分支是否被合并
    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 显示当前分支所有提交过的版本信息,常用选项
      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] 不支持 通过新建一个提交来撤销之前的某次提交。因为不会重写提交历史,被认为是一种安全的撤销操作。
    从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 删除

    • 删除本地和暂存区中的文件: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保存文件

    相关文章

      网友评论

          本文标题:Git记录

          本文链接:https://www.haomeiwen.com/subject/iavgprtx.html