Git 使用笔记

参考链接:

创建版本库 - Git教程 - 廖雪峰的官方网站

Git使用教程,最详细,最傻瓜,最浅显,真正手把手教 - 知乎

命令使用

cd f:        切换目录到 F 盘

cd gitCxl        切换目录到 gitCxl 文件夹

mkdir gitCxl        创建新文件夹 gitCxl

pwd        打印当前目录

git init        将当前目录设置为git可管理的仓库

git add readme.txt        将 readme.txt 添加到暂存区

git commit -m "提交说明"        把暂存区内的所有文件提交到仓库

常用的 git commit 参数和选项:

  • -m <message> 或 --message=<message>
    • 直接在命令行上指定提交信息(commit message)。这是最常用的参数之一,因为它允许你快速附加一条描述性消息来解释更改。
  • -a 或 --all
    • 自动将所有已跟踪文件的更改(包括那些没有被 git add 明确添加到暂存区的文件)提交。这通常用于快速提交所有更改,但请注意,它不会添加新文件到仓库中。
  • -v 或 --verbose
    • 在提交时显示差异(diff)和提交信息。这有助于在提交前再次确认更改。
  • --amend
    • 修改最近的提交。这允许你更改最近的提交信息或添加更多更改到该提交中,而不是创建一个新的提交。
  • --signoff 或 -s
    • 在提交信息中添加一个签名行(Signed-off-by),这通常用于表示你同意某些开发准则或协议。
  • --no-verify
    • 绕过提交前的钩子(hook)脚本。Git 允许你在提交前运行自定义脚本以检查代码风格、测试等。使用此选项可以跳过这些检查。
  • --allow-empty
    • 允许创建一个空的提交(即没有更改的提交)。这通常用于记录项目状态或触发某些构建/部署流程。
  • --allow-empty-message
    • 允许提交一个空的提交信息(即不附带任何描述)。通常,Git 会阻止这种提交以防止无意义的提交记录。
  • --template=<file>
    • 使用指定的文件作为提交信息的模板。这可以帮助你遵循特定的提交信息格式或包含额外的信息。
  • --author=<author>
    • 指定提交的作者信息。这通常用于修复错误的作者信息或代表其他人提交更改。
  • --date=<date>
    • 指定提交的日期和时间。这可以用于调整提交的时间戳,但通常不建议这样做,因为它可能会混淆项目的历史记录。

git status        查看是否还有文件未提交(状态)

git diff readme.txt        查看readme.txt文件内的改动

git log        查看从近到远的提交日志(历史记录)

git log --pretty=oneline        只查看提交说的注释信息

————

回退到上一个版本:git reset --hard HEAD^

回退到上上个版本:git reset --hard HEAD^^

回退到前100个版本:git reset --hard HEAD~100

注:

--hard会回退到上个版本的已提交状态,

--soft会回退到上个版本的未提交状态,

--mixed会回退到上个版本已添加但未提交的状态。

————

cat readme.txt        查看readme.txt的内容(实验发现是本地文件的内容,不是仓库中文件的内容)

git reflog        获取版本号;

git reset --hard 版本号        回退到版本号对应的那个版本

git diff HEAD -- readme.txt        查看工作区和版本库里面最新版本的区别

git checkout -- readme.txt        丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,有两种情况:(其实就是检出)(也可以把checkout换成resrore)

  1. 若自修改后未放到暂存区,则回退到版本库的状态;
  2. 若修改后已经放入暂存区,则回退到添加暂存区后的状态。
  • 注意:命令git checkout -- readme.txt 中的 -- 很重要,若没有 -- 的话,则命令变成创建分支(切换都另一个分支)。

git reset HEAD <file>        把暂存区的修改撤销掉(unstage),重新放回工作区

git restore <file>        丢弃工作区的更改

git restore --staged <file>        撤销暂存区提交(只会删除暂存区的文件,不会影响工作目录)

rm b.txt        删除工作区的b.txt文件

git rm b.txt        从版本库中删除 b.txt 文件(删除后记得 git commit 提交)

👉初始创建版本库

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

注意:git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

cd 是 "change directory" 的缩写,意为“切换目录”;

mkdir 是 "make directory" 的缩写,用于创建新目录(文件夹)

pwd 是 "print working directory" 的缩写,意为“打印当前工作目录”,用于显示当前的目录

git init 把当前的这个目录变成 git可以管理的仓库

git add readme.txt 版本库gitCxl目录下记事本文件 readme.txt添加到暂存区里面去(没有任何提示,则说明已经添加成功)。

git commit 告诉Git,把文件提交到仓库 (-m后" "里的内容为本次提交的注释说明)。

git commit命令执行成功后会告诉你:

  • 1 file changed:1个文件被改动(我们新添加的readme.txt文件);
  • 2 insertions:插入了两行内容(readme.txt有两行内容)。

git status查看是否还有文件未提交

  • 黄色:说明没有任何文件未提交;
  • 蓝色:告诉我们 readme.txt 文件已被修改,但是未被提交的修改。

git diff readme.txt 查看readme.txt文件到底改了什么内容,如下:

如上可看到,readme.txt文件内容从二行改成 三行 添加了一行22222222内容。

知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件一样的2步(第一步是git add 第二步是:git commit)

输入git add readme.txt

报错1:fatal: not a git repository (or any of the parent directories)

原因:Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。

报错2:fatal: pathspec 'readme.txt' did not match any files

原因:添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。

  • 总结:

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

  1. 使用命令git add <file>,(可反复多次使用,添加多个文件);
  2. 使用命令git commit -m <message>,完成。

👉版本管理

1、查看提交日志

git log 查看历史记录,显示从最近到最远的提交日志。

文件修改内容:

初始:(版本一)
Git is a version control system.
Git is free software.第一次修改后:(版本二)
Git is a version control system.
Git is free software.
22222222
33333333第二次修改后:(版本三)
Git is a version control system.
Git is free software.
22222222

如果嫌输出的信息太多,则可加上--pretty=oneline参数。

即,使用命令 git log --pretty=oneline 演示:

黄色一大串类似1094adb...的是commit id(版本号)。

和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。commit id以自己的为准。

commit id需要用这么一大串数字表示是因为:

Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。

2、版本回退

若想把当前的版本回退:

回退到上一个版本:git reset --hard HEAD^

回退到上上个版本:git reset --hard HEAD^^

回退到前100个版本:git reset --hard HEAD~100

注:

--hard会回退到上个版本的已提交状态,

--soft会回退到上个版本的未提交状态,

--mixed会回退到上个版本已添加但未提交的状态。

使用示例:(回退到上一个版本,也就是版本二)

cat readme.txt 查看readme.txt的内容

cat 是“concatenate”的缩写,意为“连接”或“串联”。其原意是用来将文件内容连接并输出到标准输出设备(通常是屏幕),被广泛用于查看文件内容

(此时查看文件内容发现,确实已经回退到上一个版本了。)

此时,再用 git log 查看历史记录信息,看下现在版本库的状态:

发现第二次修改的那个 “删除内容333333,只剩222” 看不到了。

若现在想回退到最新的版本(版本三),也就是刚刚看不到的那个版本,则可通过版本号进行回退。

git reflog 获取版本号

git reset --hard 版本号,用于回退到版本号对应的那个版本

(版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,否则Git可能会找到多个版本号,就无法确定是哪一个了。)

到此,已经又回到了最新那个版本(版本三)。

————

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针。

当你回退版本的时候,Git仅仅是把HEAD从指向(版本三),改为指向(版本二)。

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

  • 总结:
  1. HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  2. 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  3. 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本(利用其版本号)。

3、工作区和暂存区

工作区:就是在电脑上能看到的目录。比如:

  1. 目录下gitCxl里的文件(.git隐藏目录版本库除外)。
  2. 以后需要再新建的目录文件等等都属于工作区范畴。

版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,而是Git的版本库。

  • 其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

我们前面说过使用Git提交文件到版本库有两步:

  • 第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
  • 第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

因为创建Git版本库时,Git自动为我们创建了唯一一个master分支,

所以现在,git commit就是往master分支上提交更改。

可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改。

  • demo演示如下:

修改 readme.txt 的内容,新增加 addnew.txt 文件。

1、先用命令 git status来查看下状态:

Git非常清楚地告诉我们:

  1. readme.txt被修改了;
  2. test.txt还从来没有被添加过,所以它的状态是Untracked

2、使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态:

add之后,此时两个文件皆处于暂存区中。

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),

然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

3、执行git commit就可以一次性把暂存区的所有修改提交到分支:

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的,如上。

4、管理修改

Git跟踪并管理的是修改,而非文件。

  • 举个例子:

1、修改内容后使用 git add 添加到暂存区中;

2、在暂存区中 的前提下,再修改内容;

3、使用 git commit 提交到仓库。

也就是说,过程是【第一次修改 -> git add -> 第二次修改 -> git commit】 。

提交后会发现,第二次的修改并没有被提交。

  • 因为:

Git管理的是修改。

当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交

但是,在工作区的第二次修改并没有放入暂存区

所以,git commit只负责把暂存区的修改提交了

也就是第一次的修改被提交了,第二次的修改不会被提交。

————

提交后,

git diff HEAD -- readme.txt 可以查看工作区和版本库里面最新版本的区别,如上。

若提交第二次修改,可以:

【第一次修改 -> git add -> 第二次修改 -> git add -> git commit】

即可把第二次修改提交。

所以,每次修改,若不用git add到暂存区,则不会加入到commit中。

5、撤销修改

git checkout -- readme.txt 丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,有两种情况:(其实就是检出)(也可以把checkout换成resrore)

  1. 若自修改后未放到暂存区,则回退到版本库的状态;
  2. 若修改后已经放入暂存区,则回退到添加暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

————

撤销修改还有另外两种方法:

  1. 若知道要删掉哪些内容,可直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
  2. 可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^

使用示例:

1、在readme.txt文件里面增加一行内容为5555,通过cat命令查看文件内容,并用git statue查看下当前的状态如下:

2、用git checkout -- readme.txt 丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,并用cat查看文件内容,如下:

会发现工作区的修改 “增加的一行5555” 没了,也就是文件在工作区的修改已被撤销。(情况一)

再测试下情况二:

会发现撤销后,文件内容是回退到了暂存区中的状态,也就是情况二。

注意:命令git checkout -- readme.txt 中的 -- 很重要,若没有 -- 的话,则命令变成创建分支(切换都另一个分支)。

————

git reset HEAD readme.txt暂存区的修改撤销掉(unstage),重新放回工作区

git reset 命令既可回退版本,也可把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

  • 总结:
  1. 场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  2. 场景2:当改乱了工作区某个文件的内容,且添加到了暂存区时,想丢弃修改,分两步:
    1. 第一步用命令git reset HEAD <file>,就回到了场景1,
    2. 第二步按场景1操作。
  3. 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节(回退到上一个版本:git reset --hard HEAD^),不过前提是没有推送到远程库。

6、删除文件

假如我现在版本库testgit目录添加一个文件b.txt,然后提交。如下:

直接在文件目录中把文件删了,或者使用如上rm命令:rm b.txt,此时工作区的b.txt文件已被删除

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了,如下:

此时有两个选择:

  1. 一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
  2. 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
  • 情况一:将版本库中的对应也删除

git rm b.txt 从版本库中删除 b.txt 文件,然后 git commit 提交,如下图:

注:

‘删除’也是一种‘修改’操作,先手动删除文件,然后使用 git add <file> 或者使用 git rm<file> 效果都是一样的。

  • 情况二:删错了,需从版本库中将对应文件恢复

git checkout -- b.txt 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

👉远程仓库

1、添加远程库

拓展

git的命名窗口关闭之后,继续使用之前创建的仓库

无需重新创建。

在你创建仓库文件夹内鼠标右键有个 Git Bash Here打开就好,

或者按住shift加鼠标右键有个 `在此处打开Powershell窗口`,都可以直接 使用git命令。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xilinx系列FPGA视频采集转HDMI2.0输出,基于HDMI 1.4/2.0 Transmitter Subsystem方案,提供6套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我已有的 GT 高速接口解决方案我已有的FPGA图像处理方案 3、详细设计方案设计框图硬件设计架构FPGA开发板输入Sensor之-->OV5640摄像头动态彩条Video In To AXI4-S…

机器学习面试重点第二部分(动画版)

​ 目录 ​ 第一章、聚类算法 ​1.1 K-means 聚类 ​1.1.1 算法​编辑流程 1.1.2 优缺点 ​1.1.3 应用场景 ​1.2 层次聚类 ​1.2.1 算法流程 1.2.2 优缺点 ​1.2.3 应用场景 ​1.3 DBSCAN ​1.3.1 算法流程 1.3.2 优缺点 ​1.3.3 应用场景 1.3.4. 参数 ε&…

剑指Offer精选:Java与Spring高频面试题深度解析

一、Java底层核心机制 &#x1f525; 问题1&#xff1a;谈谈对Java的理解&#xff1f; &#x1f4cc; 核心技术特性 平台无关性 "一次编译&#xff0c;到处运行"&#xff1a;通过JVM实现跨平台兼容 字节码&#xff08;.class&#xff09;作为中间语言&#xff0c;…

RabbitMQ 集群降配

这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配&#xff08;滚动操作&#xf…

【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”&#xff1a;手把手玩转STM32的外部中断控制器&#xff08;EXTI&#xff09; 引言&#xff1a;为什么我们需要“中断”&#xff1f; &#xff08;类比生活场景&#xff1a;用“快递按门铃”解释中断的意义&#xff09; 想象一下&#xff1a;当你在…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面&#xff0c;循环播放视频。思路是直接调用gr.HTML插件实现&#xff0c;简单有效&#xff01;&#xff01;&#xff01; 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f; 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源&#xff08;使用切面拦截&#xff0c;使用注解&#xff09; 总结 资源权限控制 2.2. 需要有一个用户&#xff1b;&#xff08;从数据库查询用户&#xff09; 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节&#xff0c;但是我们又不想通过建模实现&#xff0c;这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的&#xff0c;在基于Babylon.js的Shader入门之四&#xff1a;让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时&#xff0c;活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料&#xff0c;还是面临用户分流压力的线上客服&#xff0c;动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后&#xff0c;仍出现TLSv1.2协议的数据包&#xff0c;原因如下&#xff1a; 1. ‌协议层次关系‌ ‌TCP是传输层协议‌&#xff0c;而‌TLS属于应用层协议‌&#xff0c;后者直接运行于TCP之上‌28。因此&#xff0c;所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy&#xff08;抽象策略类&#xff09;​ Context&#xff08;环境类 / 上下文类&#xff09;​ ConcreteStrategy&#xff08;具体策略类&#xff09;​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…