Git - 初识版本库

版本库也叫仓库,英文名 repository。

创建版本库

之前我们说了版本库的概念:

存储版本的地方(存放各个版本之间差异的地方),通常称为版本库。通常版本库是以文件(夹)的形式存放在磁盘上:

  • Git 是用一个目录来存储各个版本和差异的文件,目录名字为 .git​;
  • SVN 同理,用 .svn​ 目录来存储的
  • CVS 同理,用 .csv​ 目录来存储的

一般情况下这几个目录是隐藏的(防止被随意的删除和修改等),在 Windows 上可以通过显示隐藏文件夹来查看,Linux 下可以用 ls -ah​ 命令查看

有了版本库,我们就可以跟踪里面所有的文件的改动,包括添加,修改和删除,并且可以追踪历史(什么时候被添加,修改了多少次,每次修改了什么),还可以还原到某个历史。

接下来我们来实践,也建议读者一起动手。

在 Git 中,创建一个版本库非常简单,新建一个文件夹(名字最好不要带有中文和空格),打开 cmd 或者 Git Bash,输入以下命令即可:

$ git init

或者同时创建文件夹并初始化:

$ git init demo

示例:

> mkdir LearnGit
> cd LearnGit
> git init
Initialized empty Git repository in D:/Projects/LearnGit/LearnGit/.git/

可以看到 Git 告诉我们已经创建好了版本库,并且是该仓库目前是空的(还没有管理任何文件)。

此时我们可以看到有一个.git 文件夹被创建了,这就是版本库,默认是隐藏的。

如果是 Linux 环境下,读者也可以使用 ls -ah ​命令查看当前目录下有什么文件。

特别注意:如果你使用 Windows 系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文和空格。

也不一定必须在空目录下创建 Git 仓库,选择一个已经有东西的目录也是可以的,但推荐用空目录开始练习,避免在学习过程中对那些文件有什么影响。

添加文件到版本库

将文件用版本库管理起来只需两步:

  1. 将文件添加到版本库
  2. 提交到版本库

实践:将刚刚我们演示 diff 和 patch 命令的文件添加到版本库里。我们创建 1-diffAndPath 文件夹,然后将文件挪到该文件夹里。此时的目录结构为:

LearnGit
└── 1-diffAndPath├── diff.txt├── hello.txt└── world.txt

那么开始第一步,使用 git add 文件名 ​来告诉 Git,添加文件到版本库

git add 1-diffAndPath/hello.txt

执行上面的命令,没有任何显示,这就对了,Unix 的哲学是“没有消息就是好消息”。

如果是在 Windows 下,可能会有如下警告(warning):

warning: LF will be replaced by CRLF in 1-diffAndPath/hello.txt.
The file will have its original line endings in your working directory

这是说在版本库里,换行符会被替换为 CRLF;但我们自己的原始文件不会有影响,我们后续展开来说。如果你实在感兴趣并有一定的基础,可以参考这个回答:newline - LF will be replaced by CRLF in git - What is that and is it important? - Stack Overflow

第二步,我们就可以用 git commit ​命令,告诉 Git,将文件提交到版本库:

> git commit -m "add diff and patch hello.txt"
[master (root-commit) abf2051] add diff and patch hello.txt1 file changed, 2 insertions(+)create mode 100644 1-diffAndPath/hello.txt

我们提交后,这次 Git 有好消息显示了:

  • 1 file changed​:有一个文件被改动(添加也是一种改动)
  • 2 insertions(+)​:插入了 2 行内容(hello.txt 有 2 行)

其他消息我们暂且不表。


-m​ 参数后面是对本次提交的说明,这里我简单写了下添加一个文件。说明应该是有意义的,方便自己或其他人知道这次提交了什么内容,不建议随便输入说明,甚至不输入说明。

事实上,如果不使用-m 参数,是有报错的:Aborting commit due to empty commit message.

强烈建议使用 -m 参数,如果实在不想输入,请自行 Google,这里不演示这种不好的用法


为什么 Git 添加文件需要 add​,commit ​一共两步呢?因为 commit ​可以一次提交很多文件,所以你可以多次 add ​不同的文件,比如:

> git add 1-diffAndPath/world.txt 1-diffAndPath/diff.txt
> git commit -m "add world.txt and diff.txt"
[master 0b3cfef] add world.txt and diff.txt2 files changed, 11 insertions(+)create mode 100644 1-diffAndPath/diff.txtcreate mode 100644 1-diffAndPath/world.txt

需要注意的是,版本库里的子文件夹下,也可以执行 git add 等命令。但如果不是在版本库里执行 git add 和 git commit 等命令,是没有意义的,因为都还没创建版本库。比如我们随便在一个没有创建版本库的地方执行:

> git add .
fatal: not a git repository (or any of the parent directories): .git

这个报错(fatal)是告诉我们,目前的文件夹并没有版本库,并且其所有父目录也没有版本库。

小技巧:

如果文件比较多,一个一个添加比较麻烦,可以使用 git add . ​表示添加所有,然后再 commit;

或者直接一条命令解决:git commit -am​,注意该方式只适用于已被 git 追踪的文件(即文件至少提交过一次)。

版本库的状态:git status

我们在一个新的目录来演示。

$ mkdir 2-versionControl
$ cd 2-versionControl

我们新建一个文件,readme.txt,并准备以下内容:

$ touch readme.txt
$ echo "Git is a version control system" >> readme.txt
$ echo "Git is free software" >> readme.txt
$ cat readme.txt
Git is a version control system
Git is free software

我们介绍下 git status 命令,该命令可以让我们时刻掌握仓库当前的状态:

$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)./

结果显示,当前目录 ./ ​没有纳入 Git 来管理跟踪(Untracked )。

我们可以用 git add ​命令来添加当前目录:

$ git add ./

然后我们再次查看仓库状态:

$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file:   readme.txt

此时 Git 告诉我们添加了一个新文件(new file: readme.txt),并且可以被提交(Changes to be committed)。

我们来提交下:

$  git commit -m "wrote a readme file"
[master 0282c44] wrote a readme file1 file changed, 2 insertions(+)create mode 100644 2-versionControl/readme.txt

然后再次查看 Git 仓库状态:

$ git status
On branch master
nothing to commit, working tree clean

此时 Git 告诉我们,目前没有什么需要被提交的,工作目录是干净的(working tree clean,其他信息我们晚点再讲)

如果我们修改文件呢?例如修改 readme.txt 文件,改成如下内容:

Git is a distributed version control system.
Git is free software.

我们来看看仓库状态:

$ vim readme.txt$ cat readme.txt
Git is a distributed version control system
Git is free software$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   readme.txt

Git 告诉我们,readme.txt 被修改了( modified: readme.txt),但还没准备提交(Changes not staged for commit)。

比较差异:git diff

有时候,我们需要比较下当前版本和上一个版本的差异(比如你度蜜月回来,已经记不清上次改了什么),此时我们就可以用 git diff 命令了:

$ git diff readme.txt
diff --git a/2-versionControl/readme.txt b/2-versionControl/readme.txt
index f7249b8..2fdf0c4 100644
--- a/2-versionControl/readme.txt
+++ b/2-versionControl/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed version control systemGit is free software

可以看到,git diff 命令的输出,和我们之前讲的 diff 命令的输出很像,这里就不再一一说明了。通过输出我们可以看到,第一行被修改了,添加了一个 distributed ​单词。

此时我们可以继续提交:

$ git add readme.txt$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified:   readme.txt$ git commit -m "add distributed word"
[master 750360e] add distributed word1 file changed, 1 insertion(+), 1 deletion(-)

深入 Git diff

  • git diff ​比较的是工作区和暂存区的所有差别

    • git diff -- 文件名​:查看具体某个文件 在工作区和暂存区之间的差异
    • git diff -- 文件名1 文件名2 文件名3​:查看多个文件在工作区和暂存区之间的差异
  • git diff --cached​ 比较的是暂存区和版本库的差别

  • git diff HEAD​ 可以查看工作区和版本库的差别

  • git diff --name-status​:仅查看被修改的文件名和状态。有时候我们只想知道哪些文件被修改了,不想知道修改了什么,可以使用这个命令。

我们来演示下。首先创建一个 txt,并添加和提交到版本库

$ echo "test diff" > 4-diff/testDiff.txt
$ git add .
$ git commit -m "add testDiff.txt"

我们修改下该文件:

$ echo "test diff" >> 4-diff/testDiff.txt

然后使用 git diff ​查看

$ git diff 4-diff/testDiff.txt
diff --git a/4-diff/testDiff.txt b/4-diff/testDiff.txt
index b69a2df..47bb840 100644
--- a/4-diff/testDiff.txt
+++ b/4-diff/testDiff.txt
@@ -1 +1,2 @@test diff
+test diff

此时我们使用 git diff HEAD​,和上面的输出一样。

此时由于我们还没添加到暂存区,使用 git diff --cached 是没有输出的。我们添加到暂存区后再次查看:

$ git diff --cached 4-diff/testDiff.txt$ git add .$ git diff --cached 4-diff/testDiff.txt
diff --git a/4-diff/testDiff.txt b/4-diff/testDiff.txt
index b69a2df..47bb840 100644
--- a/4-diff/testDiff.txt
+++ b/4-diff/testDiff.txt
@@ -1 +1,2 @@test diff
+test diff

此时再使用 git diff HEAD​,就没有输出了,说明版本一致。

我们来看看–name-status 参数:

$ echo "fuck" >> fuck
$ git add fuck
$ echo "echo" >> ./3-branch/branch.txt
$ git diff head --name-status
M       3-branch/branch.txt
A       fuck

可以看到输出了文件名,并且前面有个字母:M 指修改,A 指添加,D 指删除

查看某个文件的修改记录

使用 git blame 文件名​,可以看到某个文件的修改记录,包括修改用户,修改时间等;:

$ git blame 3-branch\branch.txt
dd140df7 (peterjxl          2023-01-14 16:27:11 +0800 1) Creating a new branch is quick and simple
8f876055 (peterjxl          2023-01-14 16:55:07 +0800 2) test no fast forward
17942124 (peterjxl          2023-01-14 20:06:01 +0800 3) test cherry-pick
00000000 (Not Committed Yet 2023-01-15 10:05:59 +0800 4) test

练习

将 readme.txt 文件修改如下,并提交:

Git is a distributed version control system.
Git is free software distributed under the GPL.

答案(仅供参考):

$ vim readme.txt$ cat readme.txt
Git is a distributed version control system
Git is free software distributed under the GPL.$ git add readme.txt$ git commit -m "append GPL word"
[master efc9138] append GPL word1 file changed, 1 insertion(+), 1 deletion(-)

小结

本文我们介绍了以下几个概念

  • 创建版本库:git init​​
  • 将文件添加到版本库:git add​,可添加多个文件 git add 文件名1,文件名2​,添加所有文件 git add .
  • 提交: git commit -m 提交说明
  • 查看版本库的状态:git status​​
  • 比较文件的差异:git diff​​

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

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

相关文章

处理RabbitMQ连接和认证问题

在使用RabbitMQ进行消息队列管理时&#xff0c;我们可能会遇到各种连接和认证问题。本文将介绍如何诊断和解决这些问题&#xff0c;并通过使用RabbitMQ的管理端进行登录验证来确保配置正确。 1. 问题概述 在最近的一次部署中&#xff0c;我们遇到了两个主要问题&#xff1a; …

成为谷歌开发者专家(GDE)的经历

大家好&#xff0c;我是张海龙(Jason)。经过一年多的准备&#xff0c;GDE申请 终于正式成功通过面试&#xff0c;成为了国内第一位Firebase GDE。下面对整个过程做个总结&#xff0c;希望对大家有所帮助。 1.什么是 GDE&#xff1f; Google Developers上面有详细的说明&#x…

Apache Druid命令执行(CVE-2021-25646)

漏洞详情&#xff1a; Apache Druid 是用Java编写的面向列的开源分布式数据存储系统&#xff0c;旨在快速获取大量事件数据&#xff0c;并在数据之上提供低延迟查询。 Apache Druid含有能够执行嵌入在各种类型请求中由用户提供的JavaScript代码功能。此功能适用于高度信任环境…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21 1. AIvril: AI-Driven RTL Generation With Verification In-The-Loop Authors: Mubashir ul Islam, Humza Sami, Pierre-Emmanuel Gaillardon, and Valerio Tenace AIVRIL: 人工智能驱动的RTL生成与验证内…

如何在Excel中快速找出前 N 名,后 N 名

有如下销售额统计表&#xff1a; 找出销售额排前 10 名的产品及其销售额&#xff0c;和销售额排倒数 10 名以内的产品及其销售额&#xff0c;结果如下所示&#xff1a; 前 10 名&#xff1a; spl("E(?1).sort(ProductSales:-1).to(10)",A1:C78)后 10 名&#xff1…

K8S精进之路-控制器StatefulSet有状态控制 -(2)

状态说明 在进行StatefulSet部署之前&#xff0c;我们首先可能要了解一下&#xff0c;什么是"有状态应用"和"无状态应用"。无状态应用就是pod无论部署在哪里&#xff0c;在哪台服务器上提供服务&#xff0c;都是一样的结果&#xff0c;比如经常用的nginx。…

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系

Debian与Ubuntu&#xff1a;深入解读两大Linux发行版的历史与联系 引言 在开源操作系统的领域中&#xff0c;Debian和Ubuntu是两款备受瞩目的Linux发行版。它们不仅在技术上有着密切的联系&#xff0c;而且各自的发展历程和理念也对开源社区产生了深远的影响。本文将详细介绍…

主数据的前世今生与治理方法论(附PPT | 某集团公司主数据项目案例与方法论)

主数据&#xff08;Master Data&#xff09;是指企业内核心业务实体数据&#xff0c;具有共享、稳定、跨部门和系统的特点。主数据在企业数据管理中扮演着至关重要的角色&#xff0c;它是企业核心业务实体数据的核心组成部分。它是企业经营运作的主体对象&#xff0c;也是企业数…

HTTP中的event-stream,eventsource,SSE,chatgpt,stream request,golang

我们都知道chatgpt是生成式的&#xff0c;因此它返回给客户端的消息也是一段一段的&#xff0c;所以普通的HTTP协议无法满足&#xff0c;当然websocket是能满足的&#xff0c;但是这个是双向的通信&#xff0c;其实 SSE&#xff08;Server-Sent Events&#xff09; 正好满足这个…

[数据集][目标检测]手机识别检测数据集VOC+YOLO格式9997张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9997 标注数量(xml文件个数)&#xff1a;9997 标注数量(txt文件个数)&#xff1a;9997 标注…

用Python提取PowerPoint演示文稿中的音频和视频

将多种格式的媒体内容进行重新利用&#xff08;如PowerPoint演示中的音频和视频&#xff09;是非常有价值的。无论是创建独立的音频文件、提取视频以便在线分发&#xff0c;还是为了未来的使用需求进行资料归档&#xff0c;从演示文稿中提取这些媒体文件可以为多媒体内容的多次…

Remotion:使用前端技术开发视频

前言 最近做文章突然想到很多文章其实也可以用视频的方式来展现&#xff0c;以现在短视频的火爆程度&#xff0c;肯定能让更多的人看到。 恰巧最近看了很多关于动画的前端 js 库&#xff0c;那如果将这些动画帧连续起来&#xff0c;岂不是就成了一个视频吗&#xff1f; 而且…

本地电脑基于nginx的https单向认证和双向认证(自制证书+nginx配置)保姆级

目录 1、背景 2、运行环境 3、工具下载 3.1、OpenSSL下载 3.2、nginx下载 4、制作https证书&#xff1a; 4.1、CA与自签名&#xff1a; 4.2、制作CA根证书&#xff08;公钥&#xff09; 4.3、制作服务端证书&#xff1a; 4.4、制作客户端证书&#xff1a; 4.5、制作…

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

性能指标前言:`DOMContentLoaded`和`load`

前言&#xff1a;DOMContentLoaded和load 最初&#xff0c;评价前端页面加载性能有两个指标&#xff1a;DOMContentLoaded和load事件&#xff0c;分别代表 DOM 树构造完成和首屏资源加载完成。 DOM 文档加载步骤&#xff1a; 解析 html 结构加载外部脚本和样式表文件解析并执…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中&#xff0c;我们常常会遇到一些看似合理实则错误的表达习惯。今天&#xff0c;我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先&#xff0c;我们需要明确&#xff0c;“double confi…

线性基定义性质及例题

线性基的定义 以上是官方给出的线性基的定义&#xff0c;但是需要一定的线性代数的基础&#xff0c;其实线性基很好理解&#xff0c;我们用下面一个例子去讲解 假设有3个数&#xff0c;1,2,3&#xff0c;我们这三个数互相异或总共有八种可能&#xff0c;我们能否找到一组数去…

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…

探索GPU算力在大模型和高性能计算中的无限潜能

在当今科技领域&#xff0c;大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等&#xff0c;规模越来越大&#xff0c;精度越来越高&#xff0c;能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力&#xff0c;推动着科学研究、工程设…

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…