Git使用【上】

在这里插入图片描述

欢迎来到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命令的一些常见用法及其作用:

  1. 配置全局用户名和邮箱:
   git config --global user.name "Your Name"
   git config --global user.email "[email protected]"

这些配置用于标识你在Git中提交代码时的身份信息。

  1. 查看和修改配置:

    git config --list            // 列出当前所有的Git配置选项
    git config --global --edit   // 编辑全局配置文件
    git config --local --edit    // 编辑当前仓库的配置文件
    git config <key>             // 查看指定配置项的值
    git config <key> <value>     // 设置指定配置项的值
    

    --list选项用于列出所有配置选项及其值。--global选项表示对全局配置进行操作,--local选项表示对当前仓库的配置进行操作。你可以使用--edit选项来通过文本编辑器修改配置文件。

  2. 配置其他选项:

    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 命令的常见用法:

  1. 比较工作区与暂存区的差异:

    git diff
    

    这会显示工作区中未添加到暂存区的文件修改内容。

  2. 比较暂存区与最新提交(HEAD)的差异:

    git diff --cached
    

    这会显示已添加到暂存区但尚未提交的修改内容。

  3. 比较工作区与最新提交(HEAD)的差异:

    git diff HEAD
    

    这会显示自上次提交以来对文件所做的所有更改。

  4. 比较两个提交之间的差异:

    git diff  
    

    这会显示两个提交之间所有文件的差异。

git diff 的输出中,以 - 表示被移除的行,以 + 表示新增的行。

除了上述常见用法外,git diff 命令还支持其他选项和参数,例如限制显示的文件范围、忽略空白字符等。你可以通过 git diff --help 查看详细的帮助信息。
Git使用【上】_第1张图片

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 算法得到的结果。它具有以下特点:

  1. 唯一性:不同的数据很难产生相同的 SHA-1 校验和。即使数据的微小变化也会导致完全不同的校验和。
  2. 不可逆性:从 SHA-1 校验和无法还原出原始数据。换句话说,无法通过校验和推导出原始的数据内容。
  3. 固定长度:SHA-1 校验和的长度固定为40个字符,不管原始数据的大小。

在版本控制系统(如 Git)中,SHA-1 校验和被广泛应用于唯一标识提交对象、文件快照等。通过校验和,可以准确地区分不同的提交或文件,并且可以检查数据的完整性。如果对数据进行了任何修改,SHA-1 校验和也会发生变化

需要注意的是,由于 SHA-1 已经存在安全漏洞,因此在某些安全敏感的场景中,已经不建议使用 SHA-1。较新的散列算法,如 SHA-256,提供更高的安全性。

git怎么进行分布式管理?

认识工作区、暂存区和版本库

当使用 Git 进行版本控制时,工作区、暂存区和版本库是三个重要的概念。

  1. 工作区(Working Directory):

    工作区是你的项目目录,是你编辑、修改文件的地方。在工作区中可以新增、删除、编辑文件,但这些变化不会直接记录到 Git 中。你可以将工作区比喻为普通的文件夹。

  2. 暂存区(Staging Area):

    暂存区是位于 Git 仓库中的一个特殊区域,它充当了一个缓冲区或者提前准备提交的区域,我们把暂存区有时也叫作索引(index)。在暂存区中,你可以选择要提交的文件、对文件进行部分修改,并通过 git add 命令将这些修改记录到暂存区。一旦文件被添加到暂存区,Git 就会跟踪这些修改。

  3. 版本库(Repository):

    版本库是 Git 的核心部分,其中记录了项目的完整历史信息。它保存着每个提交(commit),包括文件的更改、作者、时间等元数据。版本库通常位于项目目录的 .git 文件夹下,它包含了暂存区、分支、标签等信息,是 Git 来管理和维护项目历史的地方。

Git 的工作流程如下:

  1. 在工作区中对文件进行修改。
  2. 使用 git add 将修改的文件添加到暂存区。
  3. 使用 git commit 将暂存区的文件提交到版本库,形成一个新的提交记录。

通过将更改逐步从工作区移动到暂存区,再移动到版本库中,Git 可以准确地记录文件的变化历史,并允许用户灵活地管理和回溯项目的不同版本。

下面这张图展示了它们之间的关系
Git使用【上】_第2张图片
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。

当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。


add修改的工作区内容进入暂存库时,实际上,此时会有一个对象库生成一个新的git对象,专门指向刚才add提交在暂存库的内容的索引。

当执⾏提交操作git commit时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中

我们用linux命令也可以查看当前git仓库下的目录
Git使用【上】_第3张图片

⭐️总结一下

通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到本地仓库中进⾏管理

版本回退

概念

Git 版本回退的原理主要涉及 Git 的分支、提交和引用的管理机制。

在 Git 中,每次提交都会生成一个唯一的提交对象(commit object),包含了当前文件状态的快照作者时间戳等信息。提交对象会以有向无环图(DAG)的形式组织起来,形成提交历史。

Git 使用分支(branch)来表示不同的开发路径,每个分支都指向一个提交对象。而 HEAD 则是当前分支的引用,指向最新的提交。通过移动 HEAD 和分支引用,可以实现版本回退

当执行 git reset 命令时,根据命令选项的不同,Git 会调整分支引用和 HEAD 的位置

  1. --soft 选项:
    参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。

  2. --mixed 选项:
    为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。

  3. --hard 选项:
    参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
    Git使用【上】_第4张图片

HEAD说明

  • 可直接写成 commit id,表⽰指定退回的版本
  • HEAD 表示当前版本
  • HEAD^ 上⼀个版本
  • HEAD^^ 上上⼀个版本
  • 以此类推…

可以使⽤ 〜数字表⽰

  • HEAD~0 表⽰当前版本
  • HEAD~1 上⼀个版本
  • HEAD^2 上上⼀个版本
  • 以此类推

总结起来,Git 版本回退的原理就是通过移动分支引用和 HEAD 来改变当前所处的提交位置,并相应地调整工作区和暂存区的状态。

需要注意的是,回退操作会修改提交历史,因此在团队协作或者远程仓库存在的情况下,谨慎使用版本回退功能。

当前版本HEAD指的是版本库中的当前版本,还是工作区或暂存区的当前版本?

HEAD 是 Git 中的一个指针,指向当前所在的分支或提交。它可以理解为对当前版本的引用。

具体来说,HEAD 指向的是当前所在分支的最新提交(即版本库中的当前版本)。当你进行提交操作时,HEAD 将会移动到新的提交上。

与 HEAD 相关的有两个概念需要注意:

  1. 工作区:工作区是你在电脑上看到和修改的项目目录。当你在工作区修改文件后,这些修改并没有被提交到版本库中。

  2. 暂存区:暂存区也称为索引(index),是位于工作区和版本库之间的一个中间区域。它用于暂存你想要提交的文件改动。

当你执行 git add 命令将文件添加到暂存区后,HEAD 的指向不会发生变化,仍然指向当前分支的最新提交。只有在执行 git commit 命令后,HEAD 才会移动到新的提交上,并且该提交成为当前分支的最新提交。

总结起来,HEAD 指向的是版本库中当前分支的最新提交,而不是工作区或暂存区的当前版本。工作区和暂存区的当前版本没有直接的指针,它们的状态是相对于最新提交来描述的。

git reset命令

git reset 是 Git 中一个重要的命令,用于移动 HEAD 和分支引用来撤销提交或将分支重置到不同的提交上。它有多种用法和选项,常用的包括 --soft--mixed--hard

下面是 git reset 命令的常见用法:

  1. 撤销最新的提交并保留修改:

    git reset --soft HEAD^
    

    这会将 HEAD(当前分支的引用)移动到上一个提交,同时保留修改的文件在暂存区中。这样你可以重新提交这些修改。

  2. 撤销最新的提交并取消暂存的修改:

    git reset --mixed HEAD^
    

    这会将 HEAD 移动到上一个提交,并取消暂存区的修改。工作区中的文件保持不变,你可以对这些文件进行新的提交或修改。

  3. 撤销最新的提交并丢弃修改:

    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 resetgit 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,可以简单理解成如下⽰意图:
Git使用【上】_第5张图片

撤销修改

当我们写代码时,觉得当前写的代码太差劲,还不如上一版本时,我们怎么回到上一版本呢?
这里分三种情况。

对于⼯作区的代码,还没有 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>命令就可以撤销代码了

下面是指令实现:
Git使用【上】_第6张图片

已经 add ,并且也 commit 了

既然此时版本库的版本已经更新,那么只有回退到上一个版本才能解决问题。
所以这里我们就要用git reset --hard < filename>将版本库、暂存区、工作区的代码都回退到上一个版本的状态。
命令实现如下
Git使用【上】_第7张图片
注意:前提是commit之后没有push到远程仓库

删除文件

Git使用【上】_第8张图片

分支管理

你可能感兴趣的:(git,分布式管理,linux)