【玩转Git三剑客笔记】第一章 Git基础

第一章 Git基础

    • 1.综述
    • 2.安装Git
    • 3.使用Git之前需要做的最小配置
    • 4.创建第一个仓库并配置local用户信息
      • 1.创建Git仓库
      • 2.设置Git最小配置
    • 5.通过几次commit来认识工作区和暂存区
      • 1.将工作区中所有已经被git追踪的文件一起添加到暂存区
      • 2.git log查看提交日志
    • 6.给文件重命名的简便方法
      • 方法一:三个步骤
      • 方法二:一条指令
      • 关于大小写的问题:
    • 7.通过git log查看版本演变历史
      • 1.git log的扩展使用
      • 2.创建临时分支,并在临时分支上进行修改提交
    • 8.gitk:通过图形界面工具来查看版本历史
    • 9.探秘.git目录
      • 1.HEAD文件
      • 2.config文件,存储git仓库的配置信息
      • 3. refs
        • heads
        • tags
      • 4.objects中有三种对象类型:commit,blob,tree
    • 10.commit、tree和blob三个对象之间的关系
    • 11.小练习:数一数tree的个数
    • 12.分离头指针情况下的注意事项
      • 分离头指针的危险:
      • 分离头指针的好处
    • 13.进一步理解HEAD和branch

前言:本系列笔记是基于极客时间的《玩转Git三剑客》专栏的笔记。

1.综述

Git是一种分布式的代码管理工具。

2.安装Git

git官网:Git - Installing Git
【玩转Git三剑客笔记】第一章 Git基础_第1张图片

3.使用Git之前需要做的最小配置

我们在使用git前首先要设置git 的用户名和邮箱,这样git在版本管控的时候,就可以知道哪些变更、改动是哪个用户进行的改动,一目了然。(只有做了相关配置,git才能进行版本控制)

1.配置基本的用户名,用户邮箱

$ git config --global user.name 'your_name'
$ git config --global user.email '[email protected]'

2.config的三个作用域

#缺省等于local
$ git config --local  #只针对某个仓库有效,对其他仓库无效。作用域为局部
$ git config --global #global对当前用户所有仓库有效
$ git config --system #system对系统所有登录的用户都有效

3.显示config的配置,加–list

$ git config --list --local
$ git config --list --global
$ git config --list --system

【玩转Git三剑客笔记】第一章 Git基础_第2张图片

小结

添加配置

git config [–local | --global | --system] user.name ‘Your name’
git config [–local | --global | --system] user.email ‘Your email’

查看配置

git config --list [–local | --global | --system]

区别

local:区域为本仓库
global: 当前用户的所有仓库
system: 本系统的所有用户

4.创建第一个仓库并配置local用户信息

1.创建Git仓库

两种场景:

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

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

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

$ cd 某个文件夹
$ git init your_project #your_project就是你要新建的项目,会在当前路径下创建与项目名称相同的文件夹
$ cd your_project

【玩转Git三剑客笔记】第一章 Git基础_第3张图片

2.设置Git最小配置

为了区分config的local设置和global设置不同时,仓库采用哪个设置,我们这里用local进行设置。(结论:局部优先于全局)

【玩转Git三剑客笔记】第一章 Git基础_第4张图片

3.做一次简单的提交

【玩转Git三剑客笔记】第一章 Git基础_第5张图片

5.通过几次commit来认识工作区和暂存区

【玩转Git三剑客笔记】第一章 Git基础_第6张图片
【玩转Git三剑客笔记】第一章 Git基础_第7张图片

1.将工作区中所有已经被git追踪的文件一起添加到暂存区

$ git add -u

【玩转Git三剑客笔记】第一章 Git基础_第8张图片

2.git log查看提交日志

$ git log
commit abe254ce11b429b6f19ff8b5cbc84e4e27de242c (HEAD -> master)
Author: Jack-song-gif <562054870@qq.com>
Date:   Fri Apr 22 00:15:45 2022 +0800

    Add refering projects

commit 675f2d69f9a0e197e7338bc7dd61bd81a6913aa2
Author: Jack-song-gif <562054870@qq.com>
Date:   Fri Apr 22 00:05:56 2022 +0800

    Add js

commit 0cbe4a5ddd935fbdc380bb51b23cc5798ca6430f
Author: Jack-song-gif <562054870@qq.com>
Date:   Fri Apr 22 00:03:49 2022 +0800

    Add style.css

commit 57a9d1467bbd12c7e3507c3d21bfdc926e83ddda
Author: Jack-song-gif <562054870@qq.com>
Date:   Thu Apr 21 23:59:07 2022 +0800

    Add index+logo

commit e2ed4a8b41dd52cb8e31d345f9b4e41e50d3c92a
Author: Jack-song-gif <562054870@qq.com>
Date:   Thu Apr 21 23:44:13 2022 +0800

    Add readme

【玩转Git三剑客笔记】第一章 Git基础_第9张图片

6.给文件重命名的简便方法

场景:给git-learning目录下的readme文件重命名

方法一:三个步骤

 mv readme readme.md
 git add readme.md
 git rm readme

【玩转Git三剑客笔记】第一章 Git基础_第10张图片

方法二:一条指令

 git mv readme readme.md

【玩转Git三剑客笔记】第一章 Git基础_第11张图片

关于大小写的问题:

【玩转Git三剑客笔记】第一章 Git基础_第12张图片

【玩转Git三剑客笔记】第一章 Git基础_第13张图片

网友补充:

针对“零维”和“Sleeves” git mv 命令大小写敏感问题的补充实验

我使用的是Windows系统,系统的大小写是不敏感的。
core.ignorecase 默认配置是 true

基于此配置做 git mv readme Readme 操作的话,可以在 git status 看到文件名的变化。
但是,同样基于此配置,做 mv readme Readme 操作后,再使用 git status 查看文件状态,发现 status 仍为 clean 的状态。

当 core.ignorecase 配置修改为 false 时,两个操作的执行结果正好相反。

当切换到Ubuntu这种大小写敏感的系统上,不管 core.ignorecase 配置是什么,使用 git mv 和 mv 命令的结果都是一样的。

OS大小写敏感问题对 git mv 命令和 git status 命令产生了什么样的影响,想不出来可以怎么解释清楚,还希望可以有小伙伴可以继续来讨论。

总结:

直接一步修改文件名:git mv file newfile

先用mv修改,再用git管理:mv file newfile ; git add newfile;git rm file

撤销工作区和暂存区的全部修改,回退到版本库最后一次commit状态:git reset --hard

也可以指定回退到具体某一次commit:git reset --hard commitID

7.通过git log查看版本演变历史

1.git log的扩展使用

git log --oneline  #只显示commit ID和commit message,显示一行
git log -n4 #显示最近四次提交的日志
git log -n4 --oneline #组合使用
git log --oneline -n4 #组合使用
git log #默认查看的是当前分支的日志
git log --all #查看所有分支的日志,--all表示所有分支
git log --all --graph  #图形化查看版本演进历史,可以查看父子关系
git log --all --graph --oneline
git log --all --graph --oneline -n4 #n4表示显示所有分支的最近四个提交
#example
$ git log --oneline
abe254c (HEAD -> master) Add refering projects
675f2d6 Add js
0cbe4a5 Add style.css
57a9d14 Add index+logo
e2ed4a8 Add readme

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8dF4y2B-1682954068503)(D:\数字媒体技术\程序员资料\笔记汇总\玩转Git三剑客笔记.assets\image-20220502222722585.png)]

【玩转Git三剑客笔记】第一章 Git基础_第14张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-paM4mJSR-1682954068508)(D:\数字媒体技术\程序员资料\笔记汇总\玩转Git三剑客笔记.assets\image-20220502223057254.png)]

2.创建临时分支,并在临时分支上进行修改提交

git checkout -b temp(新分支名)  commitID
或者:
git checkout -b temp master #基于master分支的最新提交新建temp临时分支

【玩转Git三剑客笔记】第一章 Git基础_第15张图片

git log默认查看当前分支的日志

【玩转Git三剑客笔记】第一章 Git基础_第16张图片

git log --all 查看所有分支的日志

【玩转Git三剑客笔记】第一章 Git基础_第17张图片

 git log --all --graph  #图形化查看版本演进历史,可以查看父子关系

【玩转Git三剑客笔记】第一章 Git基础_第18张图片

git log --all --graph --oneline

【玩转Git三剑客笔记】第一章 Git基础_第19张图片

git log --all --graph --oneline -n4 #n4表示显示所有分支的最近四个提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ir6Liah4-1682954068519)(D:\数字媒体技术\程序员资料\笔记汇总\玩转Git三剑客笔记.assets\image-20220502225605462.png)]

3.如果想查看详细的git log的使用

git help --web log #通过浏览器查看文档

【玩转Git三剑客笔记】第一章 Git基础_第20张图片

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

gitk

【玩转Git三剑客笔记】第一章 Git基础_第21张图片

9.探秘.git目录

1.HEAD文件

【玩转Git三剑客笔记】第一章 Git基础_第22张图片

2.config文件,存储git仓库的配置信息

【玩转Git三剑客笔记】第一章 Git基础_第23张图片

修改当前仓库的用户名和邮箱

【玩转Git三剑客笔记】第一章 Git基础_第24张图片

【玩转Git三剑客笔记】第一章 Git基础_第25张图片

3. refs

【玩转Git三剑客笔记】第一章 Git基础_第26张图片

heads

【玩转Git三剑客笔记】第一章 Git基础_第27张图片

git cat-file -t 对象名 #查看对象类型
git cat-file -p 对象名 #查看对象内容

【玩转Git三剑客笔记】第一章 Git基础_第28张图片

tags

【玩转Git三剑客笔记】第一章 Git基础_第29张图片

4.objects中有三种对象类型:commit,blob,tree

首先切换到objects文件夹,可以发现里面有两种文件夹一种是02类型,另一种是pack文件夹

cd objects/
ls  -al

【玩转Git三剑客笔记】第一章 Git基础_第30张图片

【玩转Git三剑客笔记】第一章 Git基础_第31张图片

注意:在git眼里只要文件的内容相同就是唯一的blob

10.commit、tree和blob三个对象之间的关系

一个commit就对应一个tree树,一个tree就是存储某个commit的快照,改快照就是当前commit对应的仓库内所有文件夹,文件的信息。(即tree记录在那个时间点,文件夹和文件的信息)

tree树就是文件夹,文件夹就是树

blob跟文件名无关,只要文件内容一样就是唯一的blob

网友解读:

现在我们应该明白git底层的运行流程了,当我们添加或者修改了文件并且add到Stage Area之后,首先会根据文件内容创建不同的blob,当进行提交之后马上创建一个tree组件把需要的blob组件添加进去,之后再封装到一个commit组件中完成本次提交。在将来进行reset的时候可以直接使用git reset --hard xxxxx可以恢复到某个特定的版本,在reset之后,git会根据这个commit组件的id快速的找到tree组件,然后根据tree找到blob组件,之后对仓库进行还原,整个过程都是以hash和二进制进行操作,所以git执行效率非常之高。

【玩转Git三剑客笔记】第一章 Git基础_第32张图片

【玩转Git三剑客笔记】第一章 Git基础_第33张图片

11.小练习:数一数tree的个数

【玩转Git三剑客笔记】第一章 Git基础_第34张图片

【玩转Git三剑客笔记】第一章 Git基础_第35张图片

【玩转Git三剑客笔记】第一章 Git基础_第36张图片

$ git cat-file -t 2d832d9044
blob
$ git cat-file -p 2d832d9044
hello,world

【玩转Git三剑客笔记】第一章 Git基础_第37张图片

网友总结:

没有文件也就是没有blob对象的目录是不会被git管理的,因为git要对文件进行版本管理,所以没有必要对空目录生成对象。基于这一点,readme文件的全路径是这样:[仓库根目录]/doc/readme。那么tree的数量与全路径中“/”的数量一致。

我的总结

git add操作会生成blob对象

git commit操作后才会生成tree,因为tree的作用就是为了记录commit快照。

12.分离头指针情况下的注意事项

你可以直接用git checkout commitID切换到某一个提交上,此时并没有和任何分支进行挂钩。

分离头指针的危险:

假设你基于某个提交进行了一些修改,此时你接收到紧急任务,需要fig一个bug,然后你就切换到master分支进行修改bug了,而原来基于某个提交的变更就会被git当作垃圾给丢弃。

分离头指针的好处

当你想要进行一些变更,但是只是想要实验一下看看效果,你就可以分离头指针到某个提交,然后进行修改,不满意效果就直接切换到别的分支,那些你原来基于提交的修改就会被丢弃。

【玩转Git三剑客笔记】第一章 Git基础_第38张图片

【玩转Git三剑客笔记】第一章 Git基础_第39张图片

将基于commit修改的变更保存到新分支

git branch <new-branch-name> 1df216a #1df216a是变更后的最新提交

【玩转Git三剑客笔记】第一章 Git基础_第40张图片

【玩转Git三剑客笔记】第一章 Git基础_第41张图片

13.进一步理解HEAD和branch

1.我们通过一个场景来演示:

#新建一个fix_readme分支,并且切换到新分支
git checkout -b fix_readme fix_css

$ git checkout -b fix_readme fix_css
Switched to a new branch 'fix_readme'
$ git branch -av #查看所有分支,发现头指针指向fix_readme分支
  fix_css    1df216a Backgroud to green
* fix_readme 1df216a Backgroud to green
  master     abe254c Add refering projects
  temp       025f501 Add zhangsan
$ cat .git/HEAD
ref: refs/heads/fix_readme
#本质上HEAD还是指向某一个提交的,HEAD指向的是分支的最新提交。
$ git cat-file -t refs/heads/fix_readme 
commit

【玩转Git三剑客笔记】第一章 Git基础_第42张图片

2.使用git diff比较两次提交的差异

 $ git diff 1df216 675f2d69f9  #根据ID比较两次提交
 $ git diff HEAD HEAD^1   #根据头指针比较当前提交与前一次提交(父提交)
 $ git diff HEAD HEAD~n   #比较当前提交和前n次提交
 #注:git diff a b 显示的差异是b-a的结果,也就是b相对a没有的用-显示,b比a多的用+显示

【玩转Git三剑客笔记】第一章 Git基础_第43张图片

扩展阅读:

git dif

repo

repo1

你可能感兴趣的:(Git笔记,git,源代码管理)