Git基础

说明:本文所有背景色        代表指令、    代表提示、    代表要素说明、    代表场景说明

一、本地操作

1.1本地区域

  1. 工作区(Working Directory)电脑上直接进行文件编辑、创建、删除等操作的地方。工作区中的文件可以是已跟踪的(即已被Git管理)或未跟踪的(即Git尚未开始管理)。
  2. 暂存区(Staging Area)在使用命令时git add,文件从工作区被复制到暂存区。暂存区中的文件是下一次提交(commit)时要包含的文件及其当前状态的快照。
  3. 本地仓库(Local Repository)本地仓库存储了项目的历史记录,包括所有的提交(commits)、分支(branches)、标签(tags)等。在使用git commit命令时,暂存区中的文件快照被永久保存到本地仓库中。

图解如下:

1.2文件状态

  1. 未跟踪(Untracked)新创建的文件,或者之前被Git跟踪但现在已被git rm命令从跟踪中移除的文件。Git不会记录这些文件的变化。
  2. 已跟踪/未修改(Tracked/Unmodified)已经被Git跟踪的文件,并且自从上次提交以来没有被修改。与上次提交时状态相同。
  3. 已跟踪/已修改(Tracked/Modified)已经被Git跟踪的文件,并且自从上次提交以来已经被修改。修改后的文件尚未被添加到暂存区(即未执行git add)。
  4. 已跟踪/已暂存(Tracked/Staged)执行git add命令后,已修改的文件会被移动到暂存区,准备下一次提交。此时,文件处于已暂存状态。
  5. 已跟踪/已提交(Tracked/Committed)当使用git commit命令后,暂存区中的文件被提交到本地仓库,此时文件的状态变为已提交。此时文件的状态会被记录在Git的历史记录中。

1.3版本回退

使用 git log --oneline 命令查看版本

  • 假设需要回退至 群聊相关功能3 那么id为a22e08a,此时有3种选项,分别为
  • git reset --soft a22e08agit reset --hard a22e08agit reset --mixed a22e08a
  • 上述三种指令均可回退至指定的版本,接下来我将分别说明这3种回退指令的特性

git reset --soft :将当前本地仓库版本退回至指定版本,但暂存区 、 工作区的所有修改均被保留,多用于修正不合理的提交。

  • 场景:假设开发者A多个小改动分别提交了多次,此时觉得无意义,应该将之前的小提交作为一个更大的提交来呈现,并使用上述命令回退,并统一进行一次提交。

git reset --mixed :将当前本地仓库版本退回至指定版本,工作区的所有修改均被保留,但撤销所有暂存区的更改,多用于调整已提交的代码,可缩写为git reset

  • 场景:假设开发者A一个小功能拆分了多个文件开发,此时觉得无意义,使用上述命令回退,将该功能合并成一个文件后,git add至暂存区,再重新git commit为新的版本。

git reset --hard :将当前本地仓库版本退回至指定版本,但暂存区 、 工作区的所有修改均被撤销,即全部重置为指定版本,多用于应对灾难性的Bug的临时措施。

  • 场景:假设开发者A在实现某功能时,出现重大Bug导致其他已完善功能无法正常使用,且无法修复,或短时间无法修复,此时着急发布,决定暂时放弃该功能的发布,使用了上述命令回退至正常版本。
  • Tips:若无意中进行了此操作,可执行git reflog 查看历史操作的版本号,并执行 git reset --hard 版本号 可再次重置为指定版本

1.4差异查看

  • 在本地操作中,可以通过git diff命令比较。
  • 区域之间的文件差异、版本之间改动差异、以及分支值之间的差异,分支比较会在远程操作中进行解释。
  • 接下来我将说明区域之间的差异以及版本之间的差异如何查看。

1.4.1区域比较:

工作区VS暂存区:

        命令:git diff

        输出:关注文件名和最后两行,-测试 代表当前暂存区的版本,+测试修改后 代表当前工作区版本

diff --git a/file1.txt b/file1.txt
index 6c493ff..8dbbbfe 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1 @@
-测试
+测试修改后

工作区VS本地仓库:

        命令:git diff HEAD

        输出:关键信息同 工作区VS暂存区  ,对比 变为 工作区 和 本地仓库 之间的对比

暂存区VS本地仓库:

        命令:git diff --cached

        输出:关键信息同 工作区VS暂存区  ,对比 变为 暂存区 和 本地仓库 之间的对比

1.4.1本地版本比较:

依然使用 git log --oneline 查询

比较指定的两个版本之间差异

        命令:git diff a22e08a 8829306

        输出:关键信息同 工作区VS暂存区  ,对比 变为 两个版本 之间的对比

比较当前版本与上一个版本之间差异

        命令:git diff HEAD~ HEAD    或   git diff HEAD^ HEAD

        输出:关键信息同 工作区VS暂存区  ,对比 变为 两个版本 之间的对比,HEAD代表当前版本,HEAD~代表上一版本

比较当前版本与当前版本之前的N个版本之间的差异

        命令:git diff HEAD~2 HEAD

        输出:关键信息同 工作区VS暂存区  ,对比 变为 两个版本 之间的对比,HEAD代表当前版本,HEAD~2 代表当前版本之前的第2个版本

Tips:git diff HEAD~2 HEAD xxx.java 可以对比指定文件的差异,上述所有差异比较命令均适用

1.5删除跟踪

场景:假设开发者A,使用Visual Studio Code编辑器,从项目中删除了test.xml,那么此时对于git来说开发者只是删除了工作区的该文件,其实并没有将该文件从暂存区和本地仓库中删除。

针对上述场景可以使用 git add test.xml,该命令可以理解为告诉git,同步工作区test.xml文件的被删除状态。或直接使用git add * 同步工作区所有文件的操作。

另一种非常用方式 git rm test.xml 可以直接删除 暂存区和工作区的test.xml

最后一定要记得提交!

1.6命令介绍

git init

⬆️初始化一个新的本地仓库,会在执行该命令的目录下创建一个.git的隐藏文件夹,其中包含Git管理此仓库的所有文件资源

git status

⬆️显示工作区的状态,包括未跟踪的文件、已跟踪文件的修改状态(未修改、已修改、已暂存)及当前所在分支信息

git log

 ⬆️查看仓库的历史提交记录,包含提交的哈希值(唯一标识)、作者、提交时间、提交说明。

git log --oneline

⬆️简洁模式查看仓库的历史提交记录

git reflog

⬆️查看Git的本地操作记录,包含提交、回退、更改等所有分支的所有操作记录,对于版本恢复有用

git add *

⬆️将此工作区的所有文件或目录添加至暂存区,你也可以指定一个文件、多个同后缀文件或目录

例如: git add aaa.dart   、 git add *.java  、 git add  ./src/*

git reset --soft 版本号

⬆️回退至某个版本,但保留工作区以及暂存区的提交。

git reset --mixed 版本号

⬆️回退至某个版本,保留工作区,但不保留暂存区的提交。

git reset --hard

⬆️回退至某个版本,不保留工作区,不保留暂存区的提交。此命令将导致整个工作区重置为指定版本,且丢弃所有未提交至本地仓库的修改或创建(不建议使用)。

git ls-files

⬆️列出当前仓储所有被跟踪的文件

二、了解.gitignore

若您想要在使用git add * 命令时,想要忽略掉一些非必要性文件
例如:

java开发中的 .class .log .jar 等

前端开发中的 node_modules  dist 等

flutter开发中的  .dart_tool  .flutter-plugins 等

其他语言的开发者也应该会知道,自己一定会有需要排除的文件。

就比如常规的log文件几乎所有语言都会存在的,在一个多人团队中,如果每个人都把自己的调试log推送至远程仓库,那么在合并冲突时将会是一场灾难。。。。😅。当然,你可以做任何你想做的事,如果你将这些日志视为珍宝的话,我不是你的老板,无法强迫你做任何事。

那么即可在项目根目录创建一个.gitignore

一般在Git分布式托管平台,如gitee、github等,创建远程仓库时,都可选择创建

这其中有各种语言的,各种gitignore模板

如需自定义配置排除文件,请自行搜索资料,本文不再赘述。。。

三、远程操作

        实际开发过程中,本地操作大多是基层开发者的一些个人操作行为,那么当你担任技术管理岗时,你需要对开发者们进行统一的代码审查,分支管理等,那么Git远程操作将是你必须掌握的技术之一。

        接下来我将介绍什么是远程仓库,和本地仓库之间的区别,以及分支管理的基本常识。

3.1远程仓库概念

        学到这里,我们应该都知道Git是一个免费开源的分布式版本控制系统。

版本控制很好理解,即对每个文件的每个历史版本都记录下提交者,提交时间,提交版号,变化内容等参数,提高团队开发的协作效率。

        那么分布式该如何理解呢?首先我们需要知道版本控制系统,除了我们所知道的分布式版本控制系统(git)还有,集中式版本控制系统,如SVN、CVS、Perforce等,以及综合性版本控制系统(TFS)和本地版本控制系统(RCS)。

        我们的重点只需要放在分布式版本控制系统和集中式版本控制系统上即可,接下来我将向你介绍他们之间的区别。

3.1.1分布式和集中式的版本控制系统之间的区别

集中式版本控制系统,如下图:

这种模式下对于开发者来说只需要上传下载,操作较为简单,无需关心分支,本地库,暂存区等概念,适用于小型项目。缺点是操作过程中需要全程保持联网,并且如果中央远程库出现问题将导致开发者无法工作。

特点:

  • 有一个单一的中央仓库,所有开发者都从这个仓库获取代码并提交更改。
  • 开发者在提交更改前需要连接到中央仓库。
  • 操作相对简单,因为不需要管理多个仓库或分支。

优点:

  • 易于管理,特别是对于小型团队或项目。
  • 有一个统一的代码库,便于跟踪和协调。

缺点:

  • 依赖网络连接,如果中央仓库不可用,开发者无法提交或获取代码。
  • 中央仓库成为单点故障,一旦出现问题,整个开发过程可能会中断。

分布式版本控制系统,如下图:

分布式模式会在每个开发者的设备上创建一个本地仓库,并且保持与远程仓库的版本记录保持同步以及完整的代码副本,也就是说就算远程仓库崩溃了,本地仓库也可以支持开发者的提交记录,等待远程仓库恢复后,直接将本地仓库的记录推送至远程仓库即可,正因为这个特性,使得即使在无网络环境下,开发者依然可以正常提交代码,进行离线操作。

特点:

  • 每个开发者都有一个完整的本地仓库,包含项目的完整历史记录。
  • 开发者可以在本地进行提交、分支和合并操作,无需网络连接。
  • 当网络连接可用时,开发者可以将本地更改推送到远程仓库,或从远程仓库拉取更改。

优点:

  • 提高了灵活性和可靠性,因为即使远程仓库不可用,开发者也可以继续在本地工作。
  • 支持离线工作,开发者可以在没有网络连接的情况下进行代码更改和提交。
  • 分支和合并操作更加高效和灵活(后面会讲到)。

缺点:

  • 初始设置和学习曲线可能更陡峭,因为开发者需要理解本地仓库和远程仓库之间的同步机制。
  • 对于大型团队或项目,可能需要额外的协调来确保不同开发者之间的更改不会发生冲突。

总结:

        Git中远程仓库就是一个位于网络上的分布式版本控制系统,它可以是在github、gitee、GitLub等基于分布式托管系统的线上托管平台,也可以是在企业私有化部署的私有代码仓库中。

        远程仓库的作用:

一、项目代码和历史的备份,以防本地仓库丢失或损坏;

二、多个开发者从同一个远程仓库拉取代码、提交更改,从而实现团队协作;

三、可以作为项目发布和部署的源头,方便用户或客户获取最新版本;

3.2远程仓库创建

3.2.1 GitHub创建远程仓库

  1. 登录GitHub账号,细节请自行查阅资料。
  2. 找到此处+号创建仓库
  3. 初始化选项中,添加任意一种后,远程仓库都会自动初始化,此时本地仓库就无需初始化,直接通过git clone http://xxxxx 将远程仓库克隆下来即可
  4. 创建完成后如图,我们按照没有仓库的方式以https协议进行测试。
  5. 按照他推荐的方式一步一步执行
  6. 最后一步,往远程仓库推送时,会让你登录你的账号,直接点击浏览器认证即可
  7. 可以看到这个第一步创建的README.md,并写入了# test-poj1 已经显示出来了,# test-poj1是markdown语法,代表H1标签

3.2.2 Gitee创建远程仓库

  1. 与GitHub同理,登录gitee账号
  2. 顶部导航栏找到
  3. 我们依然不初始化整个仓库,方便进行本地有仓库的测试。
  4. 那么这次测试本地有仓库的情况
  5. 依然是刚刚的地址,这次打开终端,我先随便创建一个项目。
  6. 随便拉一个前端项目测试
  7. 此时点进去是没有.git的,接下来我们先初始化他
  8. 此处第一条命令cd .\test-git-v3\ 进入项目 ,然后git init初始化仓库,再执行git status查看一下跟踪状态,发现都没进行git跟踪。
  9. 执行git add *,将所有文件添加至暂存区
  10. 接下来按照这个操作第一步:cd existing_git_repo ,我们已经在该仓库了。第二步:
    git remote add origin https://gitee.com/xxx/test-poj1.git 添加远程仓库。第三步:git push -u origin "master" 推送至远程仓库的master分支。
  11. 弹出此弹窗,与GitHub同理,让你登录自己的gitee账号。

补充:上面说过了,再重新说一次,如果在创建时,选择了初始化选项

那么就直接在本地执行 git clone http://xxx 即可

大家应该注意到gitee提供SVN,也就是集中式版本控制系统。

3.2.3 SSH协议通信

        之前的创建方式都是以https的方式,接下来我们用SSH的方式创建一次。创建之前先简单的介绍一下SSH。

        SSH(Secure Shell)是一种网络协议,用于在不安全的网络环境中提供安全的远程登录和其他网络服务。常用于服务器管理、网络设备管理、远程开发。支持多种身份验证方式,包括密码、公钥和多因素认证。

  1. 创建仓库,步骤与之前一样
  2. 创建完成后切换至SSH,可以看到步骤没有任何差别,但是前置操作会多一层
  3. 点击头像账号设置
  4. 菜单中找到SSH公钥
  5. 注意一点,这里是让你输入密钥名称,如果你喜欢一个项目一个密钥,你可以选择输入你的项目名称,如果你只想一台电脑只有一个密钥,那么就不输入名称,这个名称不能重复,否则会直接覆盖。
  6. 然后输入密码后,如上图
  7. 继续按照文档操作
  8. 将打印出来的公钥复制进去
  9. 然后继续刚刚的操作,依然使用之前的vue3脚手架
  10. 推送成功

3.3命令介绍

git remote add origin http://xxxx

⬆️给一个已经初始化的本地仓库添加一个远程仓库地址,并命名为origin。origin是默认远程仓库名称,通常用于指向主要的、初始克隆的仓库。

git pull

⬆️从远程仓库拉取最新版本并自动尝试合并到当前分支。也可以写为git fetch或git merge FETCH_HEAD。

git push

⬆️将本地仓库的更改推送到远程仓库。默认推送至主分支(master),如你正在开发单独的分支,那么需要指定推送到的远程仓库名称和分支,如:git push origin zhangsan 即 将本地zhangsan分支的更改推送到远程仓库origin的main分支

git clone https://xxxxx

⬆️克隆一个远程仓库的全部内容到本地。它会创建一个新的目录,并将远程仓库的所有文件和版本历史复制到该目录中。

3.4分支

累了,纯手写,等我休息好了再更新😳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值