一、git的基本使用流程
git clone
克隆远程资源到本地目录,作为工作目录;- 然后在本地的克隆目录上添加或修改文件;
- 如果远程修改了,需要同步远程的内容,直接
git pull
就可以更新本地的文件; - 本地在修改之后,可以通过
git status
查看修改的文件。然后使用git add
添加修改的文件暂到缓冲区; - 在添加之后,可以使用
git commit
添加到当前的工作区; - 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交;
git push
将本地的修改推送到远程的git服务器。
二、Git对象实现原理
在git中以存储键值对(key-value)的方式来存储文件。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。git的kv中value一般有以下几种类型blob
、tree
、commit
。
1.git add底层原理
简单说就是:在调用git add后会生成一个blob对象,然后将该对象add放进进index区。
详细的说:git add命令把工作目录里的修改保存到暂存区(也就是索引)。它会为每个文件生成一个 Blob 对象(存储文件内容的哈希值)或树对象(记录目录结构),并将这些对象存于.git/objects
目录。
暂存区的信息保存在.git/index
文件中,该文件会记录文件路径、时间戳和哈希值等。
每次执行git add
,都会覆盖暂存区中对应文件之前的记录,这样就能分多次对同一文件进行部分更新。暂存区的作用是让用户可以把逻辑相关的修改组合在一起,方便后续处理。
2.git commit底层原理
简单说就是:进行代码提交时,需要根据暂存区的内容,先生成tree
对象,再生成commit
对象,然后会将记录记录到logs
文件夹下。
详细的说:git commit在底层会依据暂存区的内容生成一个提交对象(Commit Object),该对象包含父提交哈希(用于链接历史提交)、作者 / 提交者信息、提交信息以及指向根树对象(Tree Object)的哈希值。
树对象记录了文件路径、权限和 Blob 对象(存储文件内容)的引用关系。提交对象以 SHA - 1 哈希值为标识存储在.git/objects
目录中。
提交操作会更新当前分支指针(如master
),使其指向新生成的提交哈希,同时 HEAD 指针仍指向当前分支。多次提交会形成一条通过父哈希链接的提交链。
3.git Merge和Rebase的区别使用
1.Merge
创建一个新的「合并提交」(Merge Commit),同时保留两个分支的历史路径。父提交指向两个分支的最新提交,形成一个树形结构。
git checkout main # 切换到目标分支
git merge feature # 合并 feature 分支到 main
2.Rebase
将当前分支的提交「复制」到目标分支的末尾,形成一条线性的提交历史。原始提交会被丢弃,生成新的提交对象(哈希值改变)。
git checkout feature # 切换到待变基的分支
git rebase main # 将 feature 分支的提交移到 main 分支末尾
Git 的合并工具有 Merge 和 Rebase 两种核心方式,它们的目标都是整合分支修改,但实现路径不同。
Merge 通过创建一个新的「合并提交」(Merge Commit)来整合分支,这个提交同时指向两个分支的最新提交,形成树形结构,完整保留分支的创建和合并历史。
其优点是操作简单、适合团队协作,能清晰展示分支演变过程;缺点是可能使提交历史变得复杂。
例如,将 feature
分支合并到 main
分支后,会保留两条分支路径及合并节点。Merge 适用于需要保留完整时间线的场景,如多人并行开发时快速集成代码。
Rebase 则是将当前分支的提交「复制」到目标分支的末尾,通过丢弃原始提交并生成新的提交对象,形成一条线性的提交历史。
这种方式使提交记录更简洁,适合个人在推送到远程前整理本地分支,但需注意避免对已共享的远程分支执行 rebase,以免导致团队协作冲突。
例如,将 feature
分支变基到 main
分支后,历史记录会变成一条直线,隐藏分支分叉的过程。Rebase 的优势在于生成清晰的线性历史,便于快速浏览和理解代码演进,但其本质是「历史重写」,操作时需格外谨慎。
4.Reset重置使用
简单来说:git reset
是 Git 中用于撤销提交或移动分支指针的核心命令,其本质是通过修改分支指针的指向来改变当前工作目录的状态。根据不同的参数,它可以精确控制撤销的范围(仅修改提交历史、重置暂存区或同时回滚工作目录)。
详细来说:Git 的git reset
命令用于撤销提交或移动分支指针,通过修改分支指针的指向来改变工作目录状态,
其核心参数有三种模式:
--soft
仅移动分支指针,保留暂存区和工作目录,撤销的提交内容仍可直接提交;
--mixed
(默认)移动分支指针并重置暂存区,保留工作目录,需重新git add
才能提交;
--hard
则彻底回滚,移动分支指针、重置暂存区并丢弃工作目录的修改,可能导致永久丢失数据。
此外,--keep
模式会在回滚时自动储藏未提交的修改,重置后可恢复。
git reset
适用于本地未推送的错误提交,但需避免对已共享的远程分支使用,以免引发协作冲突。与git revert
不同,reset
是删除提交记录,而revert
是创建新提交来撤销旧提交。
三、Android studio的Git工作区使用
Git管理代码分为工作区间、暂存区和版本库三个区域,我们在工作区间写代码,写完之后需要将创建的文件或修改的代码添加到暂存区,然后才能提交到版本库,我们不能把工作区间的修改直接提交到版本库。
1.工作区(Working Directory)即项目在磁盘上的实际文件,包括你正在编辑的代码。初始状态下,Git 不会跟踪未添加的新文件。
2.暂存区(Staging Area)也称为索引(Index),是一个中间区域,用于准备提交的内容。可以选择部分文件或文件的部分内容添加到暂存区。
3.本地仓库(Local Repository)存储已经提交的历史版本,包含提交对象和引用。
4.远程仓库(Remote Repository)托管在 GitHub、GitLab 等平台的共享仓库。
在 Android Studio 中使用 Git 工作区
1. 初始化 Git 仓库
-
操作步骤:VCS → Enable Version Control Integration → 选择 Git
-
此时项目根目录会生成一个隐藏的
.git
文件夹
2. 添加文件到暂存区
-
操作 1:通过 Git 菜单提交
-
选择需要提交的文件(变更列表中显示)
-
右键 → Git → Commit File...
-
在弹出的对话框中,未勾选的文件仅添加到暂存区
-
# 添加单个文件到暂存区
git add app/src/main/java/com/example/MainActivity.java# 添加所有修改的文件到暂存区
git add .# 添加特定目录下的所有文件
git add app/src/
3. 提交到本地仓库
-
操作 2:在 Commit 对话框中
-
填写提交信息
-
点击 Commit 按钮(仅提交到本地仓库)
-
点击 Commit and Push 可直接推送到远程仓库
-
4. 推送到远程仓库
-
操作 3:Push 操作
-
VCS → Git → Push
-
选择远程仓库和分支
-
点击 Push 按钮
-
5. 撤销操作
-
撤销工作区修改:右键文件 → Git → Revert
-
撤销暂存区文件:使用
git reset HEAD <file>
-
撤销提交:使用
git revert <commit>
创建一个反向提交
四、Git总结
Git 是一种分布式版本控制系统,
其基本使用流程包括:
首先通过git clone
将远程仓库克隆到本地作为工作目录,在本地进行文件的添加或修改;若远程仓库有更新,使用git pull
同步内容;
本地修改后,通过git status
查看状态,使用git add
将修改添加到暂存区,再用git commit
提交到本地仓库,若提交有误可通过git reset
或git revert
撤回并重新提交,最后使用git push
将本地修改推送到远程仓库。
Git 以键值对方式存储文件,其中值的类型有 blob、tree、commit,git add
会生成 blob 对象并存于.git/objects
目录,暂存区信息保存在.git/index
文件中;git commit
会依据暂存区内容生成提交对象和树对象,更新当前分支指针。
Git 的合并方式有 Merge 和 Rebase,Merge 通过创建新的合并提交整合分支,保留分支历史路径,Rebase 则将当前分支的提交复制到目标分支末尾,形成线性提交历史。
git reset
用于撤销提交,有--soft
、--mixed
、--hard
等模式。在 Android Studio 中使用 Git,可通过 VCS 菜单启用版本控制、添加文件到暂存区、提交到本地仓库、推送到远程仓库,还能通过右键操作撤销工作区修改、使用命令撤销暂存区文件或提交。