当前位置: 首页 > news >正文

Android学习总结之git篇

 Git 的原理时,你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍:

1. 基本数据结构和对象存储

Git 底层主要基于四种对象来存储数据:blob(数据块)、tree(树)、commit(提交)和 tag(标签)。这些对象都存储在 .git/objects 目录下,以哈希值作为文件名。

Blob 对象

Blob 对象用于存储文件的内容。当你执行 git add 命令时,文件内容会被计算哈希值,并存储为一个 Blob 对象。以下是简化的 Java 代码示例,模拟创建 Blob 对象的过程:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class BlobObject {public static String createBlob(String filePath) throws IOException, NoSuchAlgorithmException {File file = new File(filePath);FileInputStream fis = new FileInputStream(file);byte[] data = new byte[(int) file.length()];fis.read(data);fis.close();MessageDigest digest = MessageDigest.getInstance("SHA-1");byte[] hash = digest.digest(data);StringBuilder sb = new StringBuilder();for (byte b : hash) {sb.append(String.format("%02x", b));}return sb.toString();}
}
Tree 对象

Tree 对象用于表示目录结构,它包含了 Blob 对象和其他 Tree 对象的引用。Tree 对象的哈希值同样基于其内容计算得出。

Commit 对象

Commit 对象记录了一次提交的元数据,包括父提交、作者、提交信息等。每次执行 git commit 时,会创建一个新的 Commit 对象。

Tag 对象

Tag 对象用于给某个特定的提交打标签,方便后续引用。

2. 引用管理

Git 使用引用(refs)来指向特定的 Commit 对象。常见的引用包括分支(branches)和标签(tags),它们存储在 .git/refs 目录下。

分支

分支实际上是一个指向 Commit 对象的引用。当你执行 git branch 命令时,Git 会在 .git/refs/heads 目录下创建一个新的文件,文件内容为该分支所指向的 Commit 对象的哈希值。

标签

标签与分支类似,只不过标签是一个固定的引用,不会随着新的提交而移动。标签存储在 .git/refs/tags 目录下。

3. 分支与合并

分支切换

当你执行 git checkout 命令切换分支时,Git 会更新 HEAD 引用,使其指向新的分支。HEAD 引用存储在 .git/HEAD 文件中,它通常指向当前分支的引用文件。

合并操作

合并操作分为快进合并(Fast-forward)和三方合并(Three-way merge)。

  • 快进合并:当一个分支是另一个分支的直接后继时,Git 会直接将当前分支的引用指针向前移动到目标分支的位置。
  • 三方合并:当两个分支有不同的提交历史时,Git 会找到两个分支的共同祖先(Base),然后将 Base、当前分支和目标分支的内容进行合并。合并结果会生成一个新的 Commit 对象。

4. 分布式版本控制

Git 是一个分布式版本控制系统,每个开发者的本地仓库都包含完整的版本历史。当你执行 git clone 命令时,会将远程仓库的所有对象和引用复制到本地。

远程仓库与本地仓库的交互
  • git fetch:从远程仓库获取最新的对象和引用,但不会合并到本地分支。
  • git pull:相当于 git fetch 和 git merge 的组合,会将远程分支的更新合并到本地分支。
  • git push:将本地分支的提交推送到远程仓库。

常用的 Git 指令:

仓库操作

  • git clone <仓库地址>:从远程仓库复制项目到本地。例如,若要克隆一个 GitHub 上名为 example-repo 的仓库,指令如下:
git clone https://github.com/username/example-repo.git
  • git init:在当前目录创建一个新的 Git 仓库。进入想要创建仓库的目录,然后执行:
git init

提交操作

  • git add <文件路径>:把文件的修改添加到暂存区。若要添加所有修改的文件,可使用:
git add .
  • git commit -m "提交信息":将暂存区的修改提交到本地仓库。提交信息要清晰地说明此次提交的内容,例如:
git commit -m "修复登录页面的样式问题"
  • git commit --amend:对上一次提交进行修改,可用于补充遗漏的文件或者修改提交信息。

分支操作

  • git branch:列出本地所有分支。
  • git branch <分支名>:创建一个新的分支。例如创建一个名为 feature-new 的分支:
git branch feature-new
  • git checkout <分支名>:切换到指定的分支。切换到 feature-new 分支:
git checkout feature-new
  • git checkout -b <分支名>:创建并切换到新的分支。创建并切换到 bugfix 分支:
git checkout -b bugfix
  • git merge <分支名>:将指定分支的修改合并到当前分支。若要将 feature-new 分支合并到当前分支:
git merge feature-new
  • git branch -d <分支名>:删除指定的本地分支。删除 feature-new 分支:
git branch -d feature-new

远程仓库操作

  • git remote add <远程仓库名> <仓库地址>:将本地仓库与远程仓库关联。通常远程仓库名为 origin,关联操作如下:
git remote add origin https://github.com/username/example-repo.git
  • git push <远程仓库名> <分支名>:把本地分支的修改推送到远程仓库。将本地的 main 分支推送到 origin 远程仓库:
git push origin main
  • git pull <远程仓库名> <分支名>:从远程仓库拉取指定分支的修改并合并到本地分支。拉取 origin 远程仓库的 main 分支更新:
git pull origin main
  • git fetch <远程仓库名>:从远程仓库获取最新的分支和提交信息,但不进行合并。

查看信息

  • git status:查看当前仓库的状态,包括文件的修改、添加和删除情况。
  • git log:查看提交历史记录。
  • git diff:查看工作区与暂存区文件的差异。若要查看暂存区与上一次提交的差异,可使用 git diff --staged

相关文章:

  • 根据pdf文档生成问答并进行评估
  • 集成电路流片随笔10:UART模块tinyriscv 通信协议和RIB接口总线区别
  • 【day5】调用AI接口,生成自动化测试用例
  • JVM 垃圾回收
  • 一个简单的Python文件MCP服务器
  • OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线
  • Google-Tensorflow-NLP
  • NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?
  • 什么样的游戏需要用到游戏盾SDK呢?
  • vue 表格某列超出显示...,悬浮tip
  • 【HarmonyOS 5】AttributeModifier和AttributeUpdater详解
  • 【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
  • MAC-​​需求​​:10万订单异步执行库存扣减、短信通知。
  • #include<bits/stdc++.h>
  • macos下 ~/.zshrc~ 和 ~/.zshrc
  • WEB安全--蓝队日志--RCE数据包分析
  • 系统架构设计师:系统架构概述知识体系、考点详解、高效记忆要点、练习题并提供答案与解析
  • LeetCode面试热题150中12-18题学习笔记(用Java语言描述)
  • Java项目之基于ssm的QQ村旅游网站的设计(源码+文档)
  • Redis 适合作为微服务架构中的哪些组件?
  • 高进华“控股”后首份年报出炉,史丹利账上可动资金大幅缩水
  • 俄乌互相空袭、莫斯科机场关闭,外交部:当务之急是避免局势紧张升级
  • 上海市政府常务会议部署提升入境旅游公共服务水平,让国际友人“无障碍”畅游上海
  • 以总理:在加沙地带扩大的军事行动将是“高强度”的
  • 伊朗港口爆炸最新事故调查报告公布,2名管理人员被捕
  • 浙江“胖都来”开业多位明星祝贺,“胖东来”称已取证投诉,律师:碰瓷侵权