Git版本控制工具详解(上) ( 从零开始 、全网最细)


版本控制的功能

  • 不同版本的管理
  • 重大版本的维护
  • 恢复之前的项目
  • 合并代码

集中式和分布式区别

集中式版本控制

它们的主要特点是单一的集中管理的服务器,保存所有文件的修订版本;
在这里插入图片描述

分布式版本控制

Git是属于分布式版本控制系统(Distributed Version Control System,简
称 DVCS)
说明
 客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录
 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复;
因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份;
在这里插入图片描述

Git 的环境安装搭建

官网
git官网

三种执行方式

Bash CMD GUI

区别
Bash,Unix shell 的一种,Linux 与 Mac OS X 都将它作为默认 shell。
Git Bash 就是一个 shell,是 Windows 下的命令行工具,可以执行 Linux 命令
Git Bash 是基于 CMD 的,在 CMD 的基础上增添一些新的命令与功能;
 所以建议在使用的时候,用 Bash 更加方便
Git CMD
 命令行提示符(CMD)是 Windows 操作系统上的命令行解释程序;
 当你在 Windows 上安装 git 并且习惯使用命令行时,可以使用 cmd 来运行 git 命令;
Git GUI
 基本上针对那些不喜欢黑屏(即命令行)编码的人;
 它提供了一个图形用户界面来运行 git 命令;

Git 初始化本地仓库并实现提交到本地仓库

  1. 初始化本地仓库:在您的项目文件夹中打开命令行或终端,输入git init命令来初始化一个新的Git仓库。
  2. 追踪文件:使用git add命令将文件添加到暂存区。您可以添加单个文件,例如git add 文件名,或者使用git add .来添加所有文件。
  3. 提交文件:使用git commit命令将文件从暂存区提交到本地仓库。您可以选择添加提交信息,例如git commit -m "提交信息",这样可以帮助记录每次提交的具体内容。

此外,在进行这些操作之前,您可能需要配置Git的用户信息,以便在提交时能够记录作者身份。这可以通过运行以下命令完成:

  • git config --global user.email "your-email@example.com"
  • git config --global user.name "Your Name"
    请确保将your-email@example.comYour Name替换为您的实际电子邮件地址和姓名。
    总的来说,通上步骤,您就可以成功地将文件提交到本地仓库了。如果您想要将这些提交同步到远程仓库,还需要设置远程仓库并将本地提交推送到远程仓库。

文件状态的划分

那么我们需要对文件来划分不同的状态,以确定这个文件是否已经归于Git仓库的管理:
未跟踪:默认情况下,Git仓库下的文件也没有添加到Git仓库管理中,我们需要通过add命令来操作
已跟踪:添加到Git仓库管理的文件处于已跟踪状态,Git可以对其进行各种跟踪管理
已跟踪文件又可以分为
① staged( 已暂存 ): 暂缓区中的文件状态
② Unmodified(未修改:文件已被纳入版本控制,其内容与版本库中的记录完全相同,没有任何更改。当一个Modified状态的文件通过git checkout命令恢复到版本库中的状态时,它会变成Unmodified状态。
③ Modified(已修改):文件已经被修改但尚未暂存或提交。当对文件做出更改后,它从Unmodified转变为Modified状态。通过git add可以进入下一个状态,即Staged

在这里插入图片描述

Git 操作

在这里插入图片描述

基本指令

检测文件的状态 - git status

git status

在这里插入图片描述
如果文件处于修改状态
在这里插入图片描述
文件添加到暂存区 – git add

git add aaa.js

git 忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
在实际开发中,这个文件通常不需要手动创建,在必须的时候添加自己的忽略内容即可

**文件更新提交 - git commit **
每次准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了;
再运行提交命令 git commit;
可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行;

git commit –m "修改了xxx文件"

Git的校验和
Git的校验和(checksum)是一种用于验证文件完整性的机制。它通过计算文件内容的哈希值来生成一个唯一的标识符,用于检测文件是否被篡改或损坏
在Git中,校验和是通过SHA-1算法来计算的。SHA-1算法将文件内容作为输入,并输出一个40个字符长度的十六进制字符串作为校验和。这个校验和可以被视为文件的唯一指纹,任何对文件内容的微小更改都会导致校验和的变化。
举个例子,假设我们有一个名为example.txt的文件,其内容如下:

Hello, world!
This is an example file.

我们可以使用Git命令行工具来计算该文件的校验和:

$ git hash-object example.txt
d670460b4b4aece5915caf5c68d12f560a9fe3e4

上述命令会输出文件example.txt的校验和,即d670460b4b4aece5915caf5c68d12f560a9fe3e4。如果文件内容发生了任何更改,校验和也会相应地发生变化。
校验和在Git中具有重要的作用,例如在版本控制、对象存储和数据完整性检查等方面。它们确保了文件的一致性和可靠性,使得Git能够有效地追踪和管理代码变更。

查看提交的历史 – git log
在提交了若干更新,又或者克隆了某个项目之后,有时候我们想要查看一下所有的历史提交记录。
◼ 这个时候我们可以使用git log命令:
 不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面;
 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明;

git log    // 详细版 输入 Q 退出
git log --pretty=oneline   // 简洁版
git log --pretty = oneline --graph  // 可以用来看分支

版本回退 - git reset
如果想要进行版本回退,我们需要先知道目前处于哪一个版本:Git通过HEAD指针记录当前版本。
我们可以通过HEAD来改变Git目前的版本指向:
 上一个版本就是HEAD^;
 如果是上1000个版本,我们可以使用HEAD~1000;
 我们可以可以指定某一个commit id;

git reset --hard HEAD^
git reset --hard HEAD~1000
git reset --hard 2d44982

远程仓库 ( Remote Repository )

在真实开发中,我们通常是多人开发的,所以我们会将管理的代码共享到远程仓库中
目前我们有如下方式可以使用Git服务器:
 使用第三方的Git服务器:比如GitHub、Gitee、Gitlab等等;
 在自己服务器搭建一个Git服务;
常见的远程仓库有哪些呢?目前比较流行使用的是三种:
 GitHub:https://github.com/
 Gitee:https://gitee.com/
 自己搭建Gitlab:http://152.136.185.210:7888/
目前Git服务器验证手段主要有两种:
 方式一:基于HTTP的凭证存储(Credential Storage);
 方式二:基于SSH的密钥;
因为本身HTTP协议是无状态的连接,所以每一个连接都需要用户名和密码:
 如果每次都这样操作,那么会非常麻烦;
 幸运的是,Git 拥有一个凭证系统来处理这个事情;

补充: 什么是 HTTP 协议无状态连接

HTTP协议是无状态的,这意味着服务器不会保留与客户端交互的任何状态信息
详细来说,无状态连接的特点有以下几点:

  1. 独立性:每个HTTP请求都是独立的,服务器处理完一个请求后不会保存任何关于这个请求的信息。即使同一个用户发起连续的请求,服务器也不会知道这些请求是否来自同一用户。
  2. 性能影响:因为服务器不保留状态,所以每次通信时可能需要重复传输相同的数据(例如认证信息),这增加了额外的网络负担,但同时也意味着服务器能快速响应,因为它不需要维护客户端的状态信息。
  3. 保持状态的技术:为了在无状态的HTTP协议上维持一定的状态,发展出了Cookie和Session这样的技术。Cookie将状态信息存储在客户端,而Session将状态信息存储在服务器端,两者都可以在多次请求间保持用户的状态信息。
  4. 误解澄清:无状态不表示HTTP不能维持TCP连接,实际上HTTP/1.1版本的Keep-Alive功能允许在一个TCP连接上发送多个HTTP请求,但这并不改变HTTP本身无状态的特性。
    总的来说,由于HTTP协议的无状态特性,服务器无法自动识别返回的用户,因此需要借助其他机制如登录认证来验证用户身份,这就涉及到了在每个请求中发送用户名和密码的过程。

凭证

下面有一些 Git Crediential 的选项:
 选项一:默认所有都不缓存。 每一次连接都会询问你的用户名和密码;
 选项二:“cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除;
 选项三:“store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
 选项四:如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中(加密的)
 选项五:如果你使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具;
可以在 https://github.com/Microsoft/Git-Credential-Manager-for-Windows 下载。( 其实在我们安装好 GitBash 就已经有这个工具了 )

配置 Gitee SSH 访问

官方配置文档
① 获取公钥

ssh-keygen -t ed25519 -C "Gitee SSH Key"  // -C 后面表示 注释

② 打开 公钥文件
在这里插入图片描述
在这里插入图片描述
③ 在 Gitee 配置
在这里插入图片描述

管理远程服务器

添加远程地址

比如在李四的电脑添加远程地址服务器 (建立本地仓库和远程服务器建立连接 )

git remote add <shortname><url>  
git remote add origin https://gitee.com/jelly-mulberry/git-demo.git     

在这里插入图片描述
查看连接的服务器

git remote -v

在这里插入图片描述
从远程服务器获取文件
默认情况下是从origin中获取代码;

git fetch
git fetch origin
// 获取到代码后默认并没有合并到本地仓库,我们需要通过merge来合并;
git merge
// 下面这个指令 是直接合并
git pull

补充

git fetchgit pull都是用于从远程仓库更新本地仓库的命令,但它们在操作方式和安全性等方面存在区别。
具体分析如下:

  1. 操作方式git fetch仅将远程仓库的变更拉取到本地仓库,但不会自动合并到本地工作目录中,用户需要额外执行git merge命令来合并这些变更。这为用户提供了一个检查和审查变更的机会,然后决定是否以及如何将这些变更合并到当前工作分支。而git pull则是将远程仓库的变更拉取并直接合并到本地工作目录中,相当于执行了git fetch后立即执行git merge
  2. 安全性:由于git fetch不会自动合并变更,它提供了更高的安全性,因为它避免了自动合并可能带来的冲突风险。用户可以在合并前手动检查和解决可能出现的冲突。相比之下,git pull由于会自动合并变更,可能会在没有提前检查的情况下引入冲突,这在某些情况下可能导致工作目录出现意外状态。
  3. 使用场景:当你希望获取远程仓库的最新变更,但并不马上想要或不需要合并这些变更时,可以使用git fetch。这样做可以让你有机会先行查看变更内容,再决定如何处理这些变更。而如果你希望获取并立即整合远程的最新变更到你的当前工作分支,那么git pull是一个更便捷的选择。
    综上所述,git fetch提供了一个两步过程,让用户有机会在合并之前检查和审查来自远程仓库的变更,而git pull简化了这个过程,通过一个命令即可完成获取和合并操作。在实际使用中,根据不同需求选择合适的命令非常重要。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值