玩转Git三剑客学习笔记---第一章~Git基础

01 | Git的安装

  1. git文档官方网址:

    https://git-scm.com/book/zh/v2/

  2. 下载对应系统的.exe安装包,解压安装【一路下一步即可】

    验证是否安装成功方法:打开电脑cmd指令窗口,输入

    git --version

    输出如上图即安装成功

02 | 使用Git之前需要做的最小配置

  1. 配置 user 信息

    配置 user.name 和 user.email

    注:目的,方便项目管理人员通过提交记录指正问题或者与提交者沟通相关问题;

    $ git config --global user.name 'your_name'
    $ git config --global user.email 'your_email@domain.com'
  2. config 的三个作用域

       缺省等同于 local

    $ git config --local    // local 只针对某个仓库有效
    $ git config --global   // global 对当前用户所有仓库有效
    $ git config --system   // system对系统所有登录的用户有效【不常用】
    显示 config 的配置,加 --list【注:--list后需要加空格来匹配查询范围】
    $ git config --list --local 
    $ git config --list --global    
    $ git config --list --system

    思考:配置用户信息时,localglobal 有哪些区别?

03 | 创建第一个仓库并配置local用户信息

  1. 建 Git 仓库

    两种场景:

    (1)把已有的项目代码纳入 Git 管理

    $ cd 项目代码所在文件夹
    $ git init

    (2)新建的项目直接用 Git 管理

    ​$ cd 某个文件夹
    $ git init your_project     #会在当前路径下创建和项目名称同名的文件夹
    $ cd your_project
  2. 在新建仓库中,若同时配置globallocal 的用户信息时,Git 如何处理?

    commit 记录时,用户信息权重优先级比较:

    当前仓库 local 信息 > 其他仓库 local 信息 > 全局 global 信息

04 | 通过几次 commit 来认识工作区和暂存区

  1. 往仓库里面添加文件

    (1)加入 index.html 和 git-logo

    (2)加入 style.css

    (3)加入 scrpit.js

    (4)修改 index.html 和style.css

    工作目录 ---> git add files ---> 暂存区 ---> git commit ---> 版本历史

  2. 指令:git add -u == git add .

    注:将项目中已经被 git 跟踪(管理,控制)的文件

05 | 给文件重命名的简便方法

  1. 步骤

    重命名文件 ---> git add 文件名【添加新文件】---> git rm 文件名【移除旧文件】

    git reset --hard 【清除暂存】 将暂存区和工作区目录上的所有的更改清除掉(慎用)

    简化步骤:

    git mv readme readme.md

    注:在window和os系统中对于大小写的敏感度会影响修改结果,需要特别留心

06 | 通过git log 查看版本演变历史

  1. git log 【查看当前分支的版本历史】的常用用法

    git log --oneline       // 简单的查看版本列表历史有哪些修改
    git log -n4 --oneline   // 查看最近4次的提交历史
    git log -n2 --oneline   // 查看最近2次的提交历史
    git log --all           // 查看所有分支的提交历史
    git log --all --graph   // 图形化提交分支历史
    // 一些组合
    git log --oneline --all     // 所有分支提交历史记录列表
    git log --oneline --all -n4     // 所有分支最近四次的提交历史记录
    git log --oneline --all -n4 --graph     // 所有分支最近四次的提交历史记录图形化
    git log --oneline temp      // 指定分支提交历史记录列表
    // 特例
    git log --oneline --all temp    // all之后再指定分支是不起作用的,all的优先级更高
    // 其他
    git branch        // 查看本地分支信息
    git branch -v     // 查看相对详细的本地分支信息
    git branch -a     // 查看所有分支信息
    git branch -av     // 查看包括远程仓库在内的分支信息
    git help --web log // 跳转到git log 的帮助文档网页
  2. 命令行与图形界面各自利弊

    简单总结:因人而异;

  3. 什么时候用'--'什么时候用'-'的问题

    网友给出的理解:

    (1)与Linux大致规则相同,- 后面跟一个字符,如-a,-b; -- 后面跟的是字符串,如--version,--all

    (2)参考help文档查看规律,详细参数需要使用--,简化参数使用-

  4. git help --web log 报错 fatal:'/usr/local/git/share/doc/git-doc':not a documentation directory.

    问题节点:当前路径下缺少git-doc文件夹,方案百度即可;

    造成问题的原因:电脑跟新git版本冲突,导致文件缺失;

  5. git help -4 <==> git help -n4

    原文档中提示: '-<number>' 通 ‘-n<number>

  6. git log 模式退出需要按q退出,有时则不需要?

    当控制台窗口足够大,能够显示所有的日志信息时,就不会进入vi的浏览模式

07 | gitk: 通过图形界面工具来查看版本历史

  1. git 管理的项目目录下cmd命令窗口输入gitk即可弹出对应可视化窗口;

  2. gitk 可能存在的问题:

    (1)中文乱码;【百度即可找到解决方案】

    (2)直接输入gitk报错,可能原因:git 版本问题;安装时未安装gitk,需要手动安装;

  3. 图形化工具推荐:

    gitkarken、sourcetree、tower、tortoise

  4. 概念理解:

    Author    // 作者
    Committer    // 提交人
    // 意义:尊重原作者  

08 | 探秘 .git 目录


ls -al // linux命令,显示当前目录下的所有文件及文件夹包括隐藏的.和..等的详细信息
  1. 其中常用的有HEAD【作用:告知当前工作分支】

    cat fileName    // linux 指令平时用的最多的主要是在终端查看某个文件
    ref:refs/heads/master   // 意指当前指向分支为 master 分支

    注:当执行 git checkout temp 切换到新创建的temp分支后,其指向将更新为ref:refs/heads/temp

  2. config 内部内容【和本地仓库相关的配置信息】

  3. refs 内容

    heads ---> 对应项目中不同的分支
    
    tags ---> 意味着项目中可以有多个标签【又称里程碑】

    
    
    git cat-file -t 提交关键编号  // 查看编号类型
    // commit 生成的字符串即可以理解为通过算法生成的哈希值

    注:tag 本身拥有一个哈希值--->存放着一个对象,对象的值为另一个哈希值--->这个对象的类型是个commit

  4. objcets

    git cat-file -t // 看类型
    git cat-file -p // 看内容
    tree    //
    blob    // 文件对象
    commit  // 对象
    // tree、blob、commit git的三个核心对象

    注:树的策略为 e9 + 哈希值

09 | commit、tree 和 blob 三个对象之间的关系

  1. commit 【拨开】---> 【含有】tree(特定时间点的所有文件快照)--->blob【具体的文件】

  2. png 为特殊格式的二进制文件,故而命令行cat 解析成乱码;

  3. git 本身有增量存储机制,应对commit无数次后,objects目录中文件的不断累积叠加;

    其次,Git 对于内容相同的文件只会存一个blob,不同的commit的区别是commit、tree和有差异的blob,多数未变更的文件对应的blob都是相同的,如此设计从而对版本管理系统来说节省了很多的存储空间;

  4. git底层的运行流程了:

    (1)当我们添加或者修改了文件并且add到Stage Area之后,首先会根据文件内容创建不同的blob

    (2)当进行提交之后马上创建一个tree组件把需要的blob组件添加进去

    (3)之后再封装到一个commit组件中完成本次提交。

    在将来进行reset的时候可以直接使用 git reset --hard xxxxx 可以恢复到某个特定的版本,在reset之后,git会根据这个commit组件的id快速的找到tree组件,然后根据tree找到blob组件,之后对仓库进行还原,整个过程都是以hash和二进制进行操作,所以git执行效率非常之高

    (4)对于tree的理解:git 中的文件夹是通过 tree 来组织的,so,可以把 tree 对应于文件夹对象;

10 | 练习:数一数 tree 的个数 【待验证】

  1. 题目:新建的Git仓库,有且仅有1个commit,仅仅包含/doc/readme,请问内含有多少个tree,多少个blob?

    commit 【创建后】---> 生成tree 【与文件夹同级,可理解为文件夹目录对象】---> blob 【若对象下只含有一个文件,则指向这个文件对象,即blob对象】

  2. 思考:若不让readme文件中写入信息,加入暂存区后Git是会创建一个空的blob对象,还是不创建呢?

11 | 分离头指针情况下的注意事项

  1. 情况英文描述:

    You are in 'detached HEAD' state.   // 你正处在一个分离头指针状态
  2. 产生原因指令

    git checkout 某个commit的hash值     // 未与分支挂钩
  3. 好处与风险

    (1)好处:可以基于某个commit做任何修改,不满意时,直接切换回之前分支即可;

    (2)风险:分离头指针状态下所做修改如果不和任何分支挂钩,日后切换分支时会被git清理掉,所做更改一并删除;

    注:分离头状态更改在切换分支后虽然扔存在一段时间,但是取回来相对麻烦,并且Git定时会清理不要的东西

  4. 思考:什么情况下可以使用分离头指针?【待补充】

    场景1:若想基于某个commit做变更,试试新的方案是否可行,就可以采用分离头指针的方式。测试后发现不成熟,直接reset会其他分支即可。省却了建、删分支的繁复操作;

  声明:仅做学习记录,交流使用~

  学习资源请访问:https://time.geekbang.org/

 

原文地址:https://www.cnblogs.com/ilaozhao/p/13723908.html