• 【DevOps】Git 图文详解(四):Git 使用入门


    1.创建仓库

    创建本地仓库的方法有两种:

    • 一种是创建全新的仓库:git init,会在当前目录初始化创建仓库。
    • 另一种是克隆远程仓库:git clone [url]
    # 准备一个文件夹“KwebNote”作为仓库目录,命令行进入该文件夹
    Kwongad@Kwongad-T14 MINGW64 ~
    $ cd d:
    Kwongad@Kwongad-T14 MINGW64 /d
    $ cd Project_Files
    Kwongad@Kwongad-T14 MINGW64 /d/Project_Files
    # 多次cd指令进入到仓库目录KwebNote:“cd <目录名称>”指令进入目录,“cd ..”返回上级目录(有空格)
    Kwongad@Kwongad-T14 MINGW64 /d/Project_Files/github.kwong/KwebNote
     
    # 开始初始化项目,也可指定目录:git init [文件目录]
    $ git init
    Initialized empty Git repository in D:/Project_Files/github.Kwong/KwebNote/.git/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    📢注意:Git 指令的执行,都需在仓库目录下。

    创建完多出了一个被隐藏的 .git 目录,这就是本地仓库 Git 的工作场所。

    在这里插入图片描述
    克隆远程仓库,如在 GitHub 上创建的仓库 https://github.com/kwonganding/KWebNote.git

    $ git clone 'https://github.com/kwonganding/KWebNote.git'
    Cloning into 'KWebNote'...
    remote: Enumerating objects: 108, done.
    remote: Counting objects: 100% (108/108), done.
    remote: Compressing objects: 100% (60/60), done.
    remote: Total 108 (delta 48), reused 88 (delta 34), pack-reused 0
    Receiving objects: 100% (108/108), 9.36 KiB | 736.00 KiB/s, done.
    Resolving deltas: 100% (48/48), done.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    会在当前目录下创建 KWebNote 项目目录。

    在这里插入图片描述

    2.暂存区 add

    可以简单理解为,git add 命令就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到仓库。

    指令
    描述
    git add [file1] [file2]添加文件到暂存区,包括修改的文件、新增的文件
    git add [dir]同上,添加目录到暂存区,包括子目录
    git add .同上,添加所有修改、新增文件(未跟踪)到暂存区
    git rm [file]删除工作区文件,并且将这次删除放入暂存区
    # 添加指定文件到暂存区,包括被修改的文件
    $ git add [file1] [file2] ...
     
    # 添加当前目录的所有文件到暂存区
    $ git add .
     
    # 删除工作区文件,并且将这次删除放入暂存区
    $ git rm [file1] [file2] ...
     
    # 改名文件,并且将这个改名放入暂存区
    $ git mv [file-original] [file-renamed]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修改文件 R.md,未暂存:

    在这里插入图片描述

    执行 git add . 暂存:

    在这里插入图片描述

    3.提交 commit 记录

    git commit 提交是以时间顺序排列被保存到数据库中的,就如游戏关卡一样,每一次提交(commit)就会产生一条记录:id + 描述 + 快照内容。

    • 🔸commit id:根据修改的文件内容采用摘要算法(SHA1)计算出不重复的 40 40 40 位字符,这么长是因为 Git 是分布式的,要保证唯一性、完整性,一般本地指令中可以只用前几位( 6 6 6)。即使多年以后,依然可通过 id 找到曾经的任何内容和变动,再也不用担心丢失了。
    • 🔸描述:针对本次提交的描述说明,建议准确填写,就跟代码中的注释一样,很重要。
    • 🔸快照:就是完整的版本文件,以对象树的结构存在仓库下 \.git\objects 目录里,这也是 Git 效率高的秘诀之一。
    • SHA1 是一种哈希算法,可以用来生成数据摘要。
    • Git 不适合大的非文本文件,会影响计算摘要、快照的性能。

    多个提交就形成了一条时间线,每次提交完,会移动当前分支 masterHEAD 的 “指针” 位置。

    在这里插入图片描述
    Sourcetree上的历史记录:

    在这里插入图片描述

    📢一般情况,每完成一个小功能、一个 Bug 就可以提交一次,这样会形成比较清晰的历史记录。

    指令
    描述
    git commit -m ‘说明’提交变更,参数 -m 设置提交的描述信息,应该正确提交,不带该参数会进入说明编辑模式
    git commit -a参数 -a,表示直接从工作区提交到版本库,略过了 git add 步骤,不包括新增的文件
    git commit [file]提交暂存区的指定文件到仓库区
    git commit --amend -m使用一次新的 commit,替代上一次提交,会修改 commithash 值(id
    git log -n 20查看日志(最近 20 20 20 条),不带参数 -n 则显示所有日志
    git log -n 20 --oneline参数 -‌-oneline 可以让日志输出更简洁(一行)
    git log -n 20 --graph参数 -‌-graph 可视化显示分支关系
    git log --follow [file]显示某个文件的版本历史
    git blame [file]以列表形式显示指定文件的修改记录
    git reflog查看所有可用的历史版本记录(实际是 HEAD 变更记录),包含被回退的记录(重要)
    git status查看本地仓库状态,比较常用的指令,加参数 -s 简洁模式

    在这里插入图片描述
    通过 git log 指令可以查看提交记录日志,可以很方便的查看每次提交修改了哪些文件,改了哪些内容,从而进行恢复等操作。

    # 提交暂存区到仓库区
    $ git commit -m [message]
    # 提交所有修改到仓库
    $ git commit -a -m'修改README的版权信息'
     
    # 提交暂存区的指定文件到仓库区
    $ git commit [file1] [file2] ... -m [message]
     
    # 使用一次新的commit,替代上一次提交
    # 如果代码没有任何新变化,则用来改写上一次commit的提交信息
    $ git commit --amend -m [message]
     
    $ git log -n 2
    commit 412b56448568ff362ef312507e78797befcf2846 (HEAD -> main)
    Author: Kanding <123anding@163.com>
    Date:   Thu Dec 1 19:02:22 2022 +0800
     
    commit c0ef58e3738f7d54545d8c13d603cddeee328fcb
    Author: Kanding <123anding@163.com>
    Date:   Thu Dec 1 16:52:56 2022 +0800
     
    # 用参数“--oneline”可以让日志输出更简洁(一行)
    $ git log -n 2 --oneline
    5444126 (HEAD -> main, origin/main, origin/HEAD) Update README.md
    228362e Merge branch 'main' of github.com:kwonganding/KWebNote
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4.Git 的 “指针” 引用

    Git 中最重要的就是提交记录了,其他如 标签分支HEAD 都是对提交记录的 “指针” 引用,指向这些提交记录,理解这一点很重要。

    • 提交记录之间也存在 “指针” 引用,每个提交会指向其上一个提交。
    • 标签:就是对某一个提交记录的 固定 “指针” 引用,取一个别名更容易记忆一些关键节点。存储在工作区根目录下 .git\refs\tags
    • 分支:也是指向某一个提交记录的 “指针” 引用,“指针” 位置可变,如提交、更新、回滚。存储在工作区根目录下 .git\refs\heads
    • HEAD:指向当前活动分支(最新提交)的一个 “指针” 引用,存在在 .git/HEAD 文件中,存储的内容为 ref: refs/heads/master

    在这里插入图片描述
    上图中:

    • HEAD 始终指向当前活动分支,多个分支只能有一个处于活动状态
    • 标签 t1 在某一个提交上创建后,就不会变了。而分支、HEAD 的位置会改变。

    打开这些文件内容看看,就更容易理解这些 “指针” 的真面目了。

    # tag
    $ git tag -a 'v1' -m 'v1版本'
    $ cat .git/refs/tags/v1
    a2e2c9caea35e176cf61e96ad9d5a929cfb82461
     
    # main分支指向最新的提交
    $ cat .git/refs/heads/main
    8f4244550c2b6c23a543b741c362b13768442090
     
    # HEAD指向当前活动分支
    $ cat .git/HEAD
    ref: refs/heads/main
     
    # 切换到dev分支,HEAD指向了dev
    $ git switch dev
    Switched to branch 'dev'
    $ cat .git/HEAD
    ref: refs/heads/dev
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这里的主分支名字为 main,是因为该仓库是从 GitHub 上克隆的,GitHub 上创建的仓库默认主分支名字就是 main,本地创建的仓库默认主分支名字为 master

    📢 “指针” 引用:之所以用引号的 “指针”,是为了便于统一和理解。和指针原理类似,都是一个指向,只是实际上可能更复杂一点,且不同的 “指针” 引用会有区别。

    5.提交的唯一标识 id,HEAD~n 是什么意思?

    每一个提交都有一个唯一标识,主要就是提交的 hashcommit id,在很多指令中会用到,如版本回退、拣选提交等,需要指定一个提交。那标识唯一提交有两种方式:

    • 首先就是 commit id,一个 40 40 40 位编码,指令中使用的时候可以只输入前几位( 6 6 6 位)即可。
    • 还有一种就是 HEAD~n,是基于当前 HEAD 位置的一个相对坐标。
      • HEAD 表示当前分支的最新版本,是比较常用的参数。
      • HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本。
      • HEAD~HEAD~1 表示上一个版本,以此类推,HEAD^10 为最近第 10 10 10 个版本。
      • HEAD@{2} 表示在 git reflog 日志中标记的提交记录索引。

    通过 git loggit reflog 可以查看历史日志,可以看每次提交的唯一编号(hash)。区别是 git reflog 可以查看所有操作的记录(实际是 HEAD 变更记录),包括被撤销回退的提交记录。

    $ git reflog -n 10
    5acc914 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~
    738748b (dev) HEAD@{1}: reset: moving to HEAD~
    9312c3e HEAD@{2}: reset: moving to HEAD~
    db03fcb HEAD@{3}: reset: moving to HEAD~
    1b81fb3 HEAD@{4}: reset: moving to HEAD~
    41ea423 HEAD@{5}: reset: moving to HEAD~
    d3e15f9 HEAD@{6}: reset: moving to d3e15f9
    1b81fb3 HEAD@{7}: reset: moving to HEAD~1
    41ea423 HEAD@{8}: reset: moving to HEAD~
    d3e15f9 HEAD@{9}: reset: moving to HEAD~
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    6.比较 diff

    git diff 用来比较不同文件版本之间的差异。

    指令
    描述
    git diff查看暂存区和工作区的差异
    git diff [file]同上,指定文件
    git diff --cached查看已暂存的改动,就是暂存区与新版本 HEAD 进行比较
    git diff --staged同上
    git diff --cached [file]同上,指定文件
    git diff HEAD查看 已暂存的 + 未暂存的 所有改动,就是与最新版本 HEAD 进行比较
    git diff HEAD~同上,与上一个版本比较。HEAD~ 表示上一个版本,HEAD~10 为最近第 10 10 10 个版本
    git diff [id] [id]查看两次提交之间的差异
    git diff [branch]查看工作区和分支直接的差异

    ☘️ 画个图更清晰些:
    在这里插入图片描述

    # 查看文件的修改
    $ git diff README.md
     
    # 查看两次提交的差异
    $ git diff 8f4244 1da22
     
    # 显示今天你写了多少行代码:工作区+暂存区
    $ git diff --shortstat "@{0 day ago}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【nacos】快速安装
    SpringBoot: Controller层的优雅实现
    Android: HttpURLConnection获取JSON数据
    ChatGPT终于接上视觉能力!
    Day26、认识数据库
    10、Feign使用优化
    kafka保证消息有序性
    【2023美团后端-8】删除字符串的方案,限制不能连续删
    【OpenCV】图像上绘制文字cv2.putText()函数用法,添加倾斜透明水印
    C# 使用 RSA 加密算法生成证书签名产生“The system cannot find the file specified”异常
  • 原文地址:https://blog.csdn.net/be_racle/article/details/134483887