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

news2025/1/16 18:06:53

Git 图文详解(四):Git 使用入门

  • 1.创建仓库
  • 2.暂存区 add
  • 3.提交 commit 记录
  • 4.Git 的 “指针” 引用
  • 5.提交的唯一标识 id,HEAD~n 是什么意思?
  • 6.比较 diff

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/

📢注意: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.

会在当前目录下创建 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]

修改文件 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

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

这里的主分支名字为 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~

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}"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMSIS-RTOS在stm32使用

目录&#xff1a; 一、安装和配置CMSIS_RTOS.1.打开KEIL工程&#xff0c;点击MANAGE RUN-TIME Environment图标。2.勾选CMSIS CORE和RTX.3.配置RTOS 时钟频率、任务栈大小和数量&#xff0c; 软件定时器. 二、CMSIS_RTOS内核启动和创建线程。1.包含头文件。2.内核初始化和启动。…

MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,

1.MySQL 1.1.正确写法 select * from student where find_in_set(s_id, 1,2,3); 1.2.错误示范 select * from student where find_in_set(s_id, 1,2 ,3); -- 注意&#xff0c;中间不能有空格。1、3 select * from student where find_in_set(s_id, 1,2, 3); -- 注意…

快速搜索多个word、excel等文件中内容

如何快速搜索多个word、excel等文件中内容 操作方法 以win11系统为介绍对象。 首先我们打开“我的电脑”-->“文件夹选项”-->“搜索”标签页,在“搜索内容”下方选择&#xff1a;"始终搜索文件名和内容&#xff08;此过程可能需要几分钟&#xff09;"。然后…

浏览器黑暗模式插件

1.Opera浏览器本身黑暗主题 2.Chrome 3.Edge

JRC Monthly Water History, v1.4数据集

简介&#xff1a; JRC Monthly Water History产品&#xff0c;是利用1984至2020年获取的landsat5、landsat7和landsat8的卫星影像&#xff0c;生成的一套30米分辨率的全球地表水覆盖的月度地表水监测地图集。该数据集共有442景数据&#xff0c;包含1984年3月至2020年12月间的月…

Python大数据之linux学习总结——day09_hive调优

hive调优 hive官方配置url: https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮…

图新地球地图导入操作步骤

1、下载图源&#xff0c;如下&#xff1a; 2、将其全部复制或部分复制&#xff0c;然后回到桌面&#xff0c;打开文件所在位置&#xff0c;如下&#xff1a; 3、将复制的数据粘贴到文件夹下&#xff0c;具体如下&#xff1a; 4、复制到路径如下&#xff1a; 5、复制结果如下&am…

记一次解决Pyqt6/Pyside6添加QTreeView或QTreeWidget导致窗口卡死(未响应)的新路历程,打死我都想不到是这个原因

文章目录 💢 问题 💢🏡 环境 🏡📄 代码💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 我在窗口中添加了一个 QTreeWidget控件 ,但是程序在运行期间,只要鼠标进入到 QTreeWidget控件 内进行操作,时间超过几秒中就会出现窗口 未响应卡死的 状态 🏡 环境 �…

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

在这篇博客中&#xff0c;我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作&#xff0c;还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能&#xff0c;我们将更全面地理解这个程序的实现。 资源获取&a…

微信(小程序开发): 解决播放音乐没有声音的情况 代码不报错的情况下依旧没有声音的解决方案

解决无声的问题 在此之前&#xff0c;确保代码能够正常执行哈&#xff01;发这个其实没什么&#xff0c;就是有些人光写代码不调试出现了这个问题 其实解决方法特别简单 第一步&#xff1a; 打开项目后&#xff0c;点击三个点&#xff0c;然后选择模拟操作 第二步&#xff…

nodejs微信小程序-慢性胃炎健康管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

rollout

构建 测试 代码扫描 打包 打镜像 推送镜像 部署应用 Rollout 是 Kubernetes 中用于管理部署应用的资源对象。它通过控制多个 ReplicaSets 对象的创建、缩放和更新&#xff0c;以实现无宕机升级和回滚应用程序版本的能力。 一般来说&#xff0c;在 Kubernetes 中&#xff0c;我…

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!

之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui&#xff0c;支持 VmessWSTLS。 最近 Docker 视频出的比较多&#xff0c;前阵子又出现了宝塔国内版存在隐私泄露的问题&#xff0c;很多小伙伴其实都不用宝塔了&#xff0c;那么&#xff0c;在我们现在…

分支限界法(1)--旅行商问题

一、概述 有n个城市&#xff0c;旅行者要访问所有n个城市&#xff0c;最终回到起始点&#xff0c;假设起始点给定为1&#xff0c;城市间距离已知&#xff0c;求能够完成旅行的最短距离。题干如下图。 算法&#xff1a;分支限界法&#xff0c;使用队列进行bfs搜索。 二、代码 i…

AIGC 是通向 AGI 的那条路吗?

AIGC 是通向 AGI 的那条路吗&#xff1f; 目录 一、背景知识 1.1、AGI&#xff08;人工通用智能&#xff09; 1.1.1、概念定义 1.1.2、通用人工智能特质 1.1.3、通用人工智能需要掌握能力 1.2、AIGC 二、AIGC 是通向 AGI 的那条路吗&#xff1f; 三、当前实现真正的 A…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的&#xff0c;svg画布只是用于展示svg世界中某一个范围的内容&#xff0c;而对于超过了svg画布范围的内容&#xff0c;则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

组合模式 rust和java的实现

文章目录 组合模式介绍实现javarsut 组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计…

Flutter笔记:桌面端应用多窗口管理方案

Flutter笔记 桌面端应用多窗口管理方案 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…