欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析3
前言
先前有些git命令我在我的其它文章里面已经写过,若要查看可参考【Linux】环境基础开发工具使用,这篇文章不再概述其中的一些命令
目录
- 👉🏻git 命令
- git config
- git diff
- git log
- SHA-1 校验和
- 👉🏻git怎么进行分布式管理?
- 🌈认识工作区、暂存区和版本库
- 👉🏻版本回退
- 概念
- 当前版本HEAD指的是版本库中的当前版本,还是工作区或暂存区的当前版本?
- git reset命令
- git reflog 在版本回退中的作用
- git版本回退为什么那么快?
- 👉🏻撤销修改
- 对于⼯作区的代码,还没有 add
- 已经 add ,但没有 commit
- 已经 add ,并且也 commit 了
- 👉🏻删除文件
👉🏻git 命令
git config
当你使用Git进行版本控制时,git config
是一个用于配置Git的命令。它允许你设置和查看与Git相关的配置选项,包括全局配置、仓库配置和用户配置等。
以下是git config
命令的一些常见用法及其作用:
- 配置全局用户名和邮箱:
git config --global user.name "Your Name"git config --global user.email "yourname@example.com"
这些配置用于标识你在Git中提交代码时的身份信息。
-
查看和修改配置:
git config --list // 列出当前所有的Git配置选项 git config --global --edit // 编辑全局配置文件 git config --local --edit // 编辑当前仓库的配置文件 git config <key> // 查看指定配置项的值 git config <key> <value> // 设置指定配置项的值
--list
选项用于列出所有配置选项及其值。--global
选项表示对全局配置进行操作,--local
选项表示对当前仓库的配置进行操作。你可以使用--edit
选项来通过文本编辑器修改配置文件。 -
配置其他选项:
git config --global core.editor "nano" // 设置全局文本编辑器(默认为Vi) git config --global color.ui true // 启用全局颜色输出
除了用户名和邮箱外,你可以配置其他的Git选项来满足个人偏好和工作流程要求。上述示例中,我们设置了全局文本编辑器为
nano
,并启用了颜色输出。
需要注意的是,git config
命令的配置选项有多个层级,优先级从高到低依次为:命令行参数(Command-line options) > 仓库级别配置文件(Repository-level configuration file) > 用户级别配置文件(User-level configuration file) > 系统级配置文件(System-level configuration file)。因此,如果针对同一个选项有多个配置设置,Git将使用优先级最高的那个。
4.取消配置
git config --unset
命令用于取消 Git 配置选项的设置,即从配置文件中移除指定的键值对。使用该命令需要提供相应配置选项的名称,例如 user.email
。
以下是一些常见的 git config --unset
命令的示例:
-
取消全局 Git 配置文件中的用户名设置:
git config --global --unset user.name
-
取消当前 Git 仓库的配置文件中的用户名和邮箱地址设置:
git config --unset user.name git config --unset user.email
需要注意的是,git config --unset
命令只会移除特定配置选项的键值对,而不会删除整个配置选项。如果需要删除某个配置选项,可以手动编辑配置文件,或者使用 --unset-all
参数来删除所有匹配选项。
git diff
git diff
是一个用于比较文件差异的 Git 命令。它可以用来查看工作区与暂存区之间或者暂存区与最新提交(HEAD)之间的文件差异。
下面是 git diff
命令的常见用法:
-
比较工作区与暂存区的差异:
git diff
这会显示工作区中未添加到暂存区的文件修改内容。
-
比较暂存区与最新提交(HEAD)的差异:
git diff --cached
这会显示已添加到暂存区但尚未提交的修改内容。
-
比较工作区与最新提交(HEAD)的差异:
git diff HEAD
这会显示自上次提交以来对文件所做的所有更改。
-
比较两个提交之间的差异:
git diff <commit1> <commit2>
这会显示两个提交之间所有文件的差异。
在 git diff
的输出中,以 -
表示被移除的行,以 +
表示新增的行。
除了上述常见用法外,git diff
命令还支持其他选项和参数,例如限制显示的文件范围、忽略空白字符等。你可以通过 git diff --help
查看详细的帮助信息。
git log
git log
是 Git 中一个常用的命令,可以显示当前分支的提交历史。它可以列出每个提交的 SHA-1 校验和、作者、日期、提交信息等。
git log
命令的基础语法如下:
git log
该命令会按照提交时间的倒序列出当前分支的所有提交。
git log
命令还支持多种有用的选项。以下是一些常用的选项:
-n
: 显示最近的 n 个提交(例如git log -3
将显示最近的三个提交)。--oneline
: 用一行显示提交信息(包括 SHA-1 校验和和提交信息)。--graph
: 显示提交历史的 ASCII 图形化表示。--all
: 显示所有分支的提交历史。--decorate
: 显示分支和标签的名称。
除此之外,还有许多其他的选项和参数可以用于 git log
命令。你可以通过 git log --help
查看完整的帮助文档。
git log
命令对于查看提交历史非常有用。它可以让你了解每个提交的详细信息,方便你回溯版本、合并分支等操作。
git log --pretty=oneline
是 Git 中常用的一个命令,表示只显示每条提交记录的 SHA-1 校验和和提交信息,每条记录占用一行。在终端中使用该命令输出即将换行的时候,会将当前行显示为更简洁的形式。
请注意,在 --pretty
选项后面的等号和 oneline
之间不应有空格。
以下是一个示例:
$ git log --pretty=oneline
65246b8d9a6d7d865771d5e08a413d6c3a9ef2d8 Add new feature to the project
f69ad5fcff56a4eeccbc4dbdcfb37a1d22c7317d Fix a bug in the login feature
b6e4737df58135e56cdf9dbb16a87d81b40b0109 Initial commit
通过这个命令,你可以快速查看提交历史,快速了解每个提交的信息和变更内容,对于代码审核、版本回退等操作都非常方便。
SHA-1 校验和
SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,用于产生数据的唯一标识。它可以将任意长度的数据转换为一个固定长度的哈希值,通常以40个十六进制字符(160位)表示。
SHA-1 校验和是通过对数据应用 SHA-1 算法得到的结果。它具有以下特点:
- 唯一性:不同的数据很难产生相同的 SHA-1 校验和。即使数据的微小变化也会导致完全不同的校验和。
- 不可逆性:从 SHA-1 校验和无法还原出原始数据。换句话说,无法通过校验和推导出原始的数据内容。
- 固定长度:SHA-1 校验和的长度固定为40个字符,不管原始数据的大小。
在版本控制系统(如 Git)中,SHA-1 校验和被广泛应用于唯一标识提交对象、文件快照等。通过校验和,可以准确地区分不同的提交或文件,并且可以检查数据的完整性。如果对数据进行了任何修改,SHA-1 校验和也会发生变化。
需要注意的是,由于 SHA-1 已经存在安全漏洞,因此在某些安全敏感的场景中,已经不建议使用 SHA-1。较新的散列算法,如 SHA-256
,提供更高的安全性。
👉🏻git怎么进行分布式管理?
🌈认识工作区、暂存区和版本库
当使用 Git 进行版本控制时,工作区、暂存区和版本库是三个重要的概念。
-
工作区(Working Directory):
工作区是你的项目目录,是你编辑、修改文件的地方。在工作区中可以新增、删除、编辑文件,但这些变化不会直接记录到 Git 中。你可以将工作区比喻为普通的文件夹。
-
暂存区(Staging Area):
暂存区是位于 Git 仓库中的一个特殊区域,它充当了一个缓冲区或者提前准备提交的区域,我们把暂存区有时也叫作
索引(index)
。在暂存区中,你可以选择要提交的文件、对文件进行部分修改,并通过git add
命令将这些修改记录到暂存区。一旦文件被添加到暂存区,Git 就会跟踪这些修改。 -
版本库(Repository):
版本库是 Git 的核心部分,其中记录了项目的完整历史信息。它保存着每个提交(commit),包括文件的更改、作者、时间等元数据。版本库通常位于项目目录的
.git
文件夹下,它包含了暂存区、分支、标签等信息,是 Git 来管理和维护项目历史的地方。
Git 的工作流程如下:
- 在工作区中对文件进行修改。
- 使用
git add
将修改的文件添加到暂存区。 - 使用
git commit
将暂存区的文件提交到版本库,形成一个新的提交记录。
通过将更改逐步从工作区移动到暂存区,再移动到版本库中,Git 可以准确地记录文件的变化历史,并允许用户灵活地管理和回溯项目的不同版本。
下面这张图展示了它们之间的关系:👇🏻👇🏻
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。
当对⼯作区修改(或新增)的⽂件执⾏ git add
命令时,暂存区⽬录树的⽂件索引会被更新。
💫💫
add修改的工作区内容进入暂存库时,实际上,此时会有一个对象库生成一个新的git对象,专门指向刚才add提交在暂存库的内容的索引。
当执⾏提交操作git commit
时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。
我们用linux命令也可以查看当前git仓库下的目录👇🏻👇🏻
⭐️总结一下:
通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到本地仓库中进⾏管理
👉🏻版本回退
概念
Git 版本回退的原理主要涉及 Git 的分支、提交和引用的管理机制。
在 Git 中,每次提交都会生成一个唯一的提交对象(commit object),包含了当前文件状态的快照、作者、时间戳等信息。提交对象会以有向无环图(DAG)的形式组织起来,形成提交历史。
Git 使用分支(branch)来表示不同的开发路径,每个分支都指向一个提交对象。而 HEAD 则是当前分支的引用,指向最新的提交。通过移动 HEAD 和分支引用,可以实现版本回退。
当执行 git reset
命令时,根据命令选项的不同,Git 会调整分支引用和 HEAD 的位置。
-
--soft
选项:
参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。 -
--mixed
选项:
为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。 -
--hard
选项:
参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
🌟HEAD说明
- 可直接写成 commit id,表⽰指定退回的版本
- HEAD 表示当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
- 以此类推…
🌟可以使⽤ 〜数字表⽰:
- HEAD~0 表⽰当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
- 以此类推
总结起来,Git 版本回退的原理就是通过移动分支引用和 HEAD 来改变当前所处的提交位置,并相应地调整工作区和暂存区的状态。
需要注意的是,回退操作会修改提交历史,因此在团队协作或者远程仓库存在的情况下,谨慎使用版本回退功能。
当前版本HEAD指的是版本库中的当前版本,还是工作区或暂存区的当前版本?
HEAD 是 Git 中的一个指针,指向当前所在的分支或提交。它可以理解为对当前版本的引用。
具体来说,HEAD 指向的是当前所在分支的最新提交(即版本库中的当前版本)。当你进行提交操作时,HEAD 将会移动到新的提交上。
与 HEAD 相关的有两个概念需要注意:
-
工作区:工作区是你在电脑上看到和修改的项目目录。当你在工作区修改文件后,这些修改并没有被提交到版本库中。
-
暂存区:暂存区也称为索引(index),是位于工作区和版本库之间的一个中间区域。它用于暂存你想要提交的文件改动。
当你执行 git add
命令将文件添加到暂存区后,HEAD 的指向不会发生变化,仍然指向当前分支的最新提交。只有在执行 git commit
命令后,HEAD 才会移动到新的提交上,并且该提交成为当前分支的最新提交。
总结起来,HEAD 指向的是版本库中当前分支的最新提交,而不是工作区或暂存区的当前版本。工作区和暂存区的当前版本没有直接的指针,它们的状态是相对于最新提交来描述的。
git reset命令
git reset
是 Git 中一个重要的命令,用于移动 HEAD 和分支引用来撤销提交或将分支重置到不同的提交上。它有多种用法和选项,常用的包括 --soft
、--mixed
和 --hard
。
下面是 git reset
命令的常见用法:
-
撤销最新的提交并保留修改:
git reset --soft HEAD^
这会将 HEAD(当前分支的引用)移动到上一个提交,同时保留修改的文件在暂存区中。这样你可以重新提交这些修改。
-
撤销最新的提交并取消暂存的修改:
git reset --mixed HEAD^
这会将 HEAD 移动到上一个提交,并取消暂存区的修改。工作区中的文件保持不变,你可以对这些文件进行新的提交或修改。
-
撤销最新的提交并丢弃修改:
git reset --hard HEAD^
这会完全移除最后一次提交及其修改。工作区、暂存区和版本库都将回退到上一个提交的状态。注意:此操作会丢失未提交的文件修改,慎用!
HEAD^
表示上一个提交,可以使用 HEAD~n
来表示前 n 个提交。例如,HEAD~2
表示上两个提交。
除了上述常见用法外,git reset
命令还支持其他选项和参数,例如通过提交 ID 进行重置,指定分支名等。你可以通过 git reset --help
查看详细的帮助信息。
在使用 git reset
时,请务必小心操作。如果你不确定操作的影响,请备份后再执行。
git reflog 在版本回退中的作用
git reflog
是 Git 中一个非常有用的命令,用于查看本地仓库中的引用日志(reference log)。它记录了分支、标签或 HEAD 移动的历史,包括提交、合并、重置等操作。
在版本回退中,git reflog
的作用非常重要。当你使用 git reset
或 git revert
等命令回退版本时,可能会希望回到之前的某个状态。而此时,如果没有记录每次操作的信息,就很难恢复到之前的状态。
git reflog
可以显示你在本地仓库中执行的所有操作,并提供了每个操作的 HEAD 的位置和提交校验和(commit hash)。通过查看这些记录,你可以找到之前的提交状态,并进行版本回退。
以下是一个示例:
$ git reflog
65246b8 (HEAD -> master) HEAD@{0}: reset: going back to commit 65246b8
f69ad5f HEAD@{1}: commit: Add new feature to the project
b6e4737 HEAD@{2}: commit: Initial commit
在上面的示例中,你可以看到 HEAD@{0}
表示最近一次操作,即回退到的目标 commit。你可以根据需要选择特定的提交进行版本回退。
需要注意的是,git reflog
记录的是本地仓库的操作历史,而不是远程仓库的历史。如果你想查看远程仓库的历史记录,可以使用 git log
命令。
git版本回退为什么那么快?
Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的HEAD 指针, refs/heads/master
⽂件⾥保存当前 master 分⽀
的最新 commit id
。当我们在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解成如下⽰意图:
👉🏻撤销修改
当我们写代码时,觉得当前写的代码太差劲,还不如上一版本时,我们怎么回到上一版本呢?
这里分三种情况。
对于⼯作区的代码,还没有 add
法一:先用git diff
查看代码差别在哪,然后手动删除代码,但不推荐,如果我们写了很多代码了,再手动去删效率太慢。
法二:
使用命令
git checkout --<filename>//回退到该文件上一次add的状态
已经 add ,但没有 commit
这里我们可以使用git reset -- mixed/hard
.
git reset -- hard
:可以一步完成,因为此时版本库中还没有我们刚刚add在暂存区中的代码,所以用hard版本回退,直接让工作区和暂存区的版本回退到版本库的当前版本(即没有该代码文件的时候),这样就实现了工作区的撤销代码效果git reset -- mixed
:这个要分两步完成,第一步git reset – mixed只是让暂存区回退到版本库的当前版本,但是此时我们仔细观察,现在情况变成了情况1——对于⼯作区的代码,还没有 add,所以此时我们再用git checkout --< filename>
命令就可以撤销代码了
下面是指令实现:
已经 add ,并且也 commit 了
既然此时版本库的版本已经更新,那么只有回退到上一个版本才能解决问题。
所以这里我们就要用git reset --hard < filename>
将版本库、暂存区、工作区的代码都回退到上一个版本的状态。
命令实现如下:
注意:前提是commit之后没有push到远程仓库
👉🏻删除文件
如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长