type
status
date
slug
summary
tags
category
password
icon

Git 仓库数据结构

  • Git 仓库由⼀个个的 commit 组成
  • 某些 commit 上会有⼀些 branch 指向它们,这些 branch 的本质是引⽤
  • 有⼀个特殊的引⽤叫做 HEAD,它始终指向当前的位置,这个位置可以是 commit,也可以是 branch
notion image

常⽤概念:commit

commit 表示对于⼀次改动的提交,它可以代表当前时刻下 Git 仓库的完整快照,但本质上,commit 只是记录了距离上⼀次 commit 之间的改动。
notion image

常⽤概念:staging area 暂存区和 add

  • staging 原意:舞台表演前的筹划准备(例如汇集道具和演员)。Git 中的意思:把改动内容汇集起来以待提交。
  • staging area:待提交的修改内容暂时存放的地⽅。主要⽤于和已经改动但不打算提交的内容区分开来。
  • add 指令:把指定的内容放进暂存区。

常⽤概念:branch 和 master

  • branch 的含义是分⽀,指的是仓库结构出现分叉时的不同的「叉」
  • 本质上,git 的 branch 是引⽤(reference),即指向某个 commit 的指针
直观感觉的 branch:
notion image
或:
notion image
而实质上的 branch:
notion image
所以,branch 和你什么时候创建的它⽆关,也和仓库的起点⽆关,只和它当前指向哪个 commit 有关。
  • master 是⼀个特殊的 branch,因为它是 Git 的默认 branch(默认 branch 可以修改)。默认branch 的特点:
    • 执⾏ clone ⽅法把仓库取到本地的时候,默认 checkout 出来的是默认 branch,即 master;
    • 在执⾏ push 命令把本地内容推送到远端仓库的时候,远端仓库的 HEAD 永远跟随默认branch,⽽不是和本地 HEAD 同步。换句话说,只有 push master 分⽀到远端的时候,远端的 HEAD 才会移动。

常⽤概念: HEAD

  • HEAD 也是引⽤,但它不是 branch,它代表了当前所处的位置。HEAD 不仅可以指向某个 commit,也可以指向某个 branch(例如 master、feature1)
  • 当每次 commit 的时候,HEAD 不仅随着新的 commit ⼀起移动,⽽且如果它指向了某个 branch,那么它也会带着 branch ⼀起移动
commit 前
notion image
commit 后
notion image

常⽤概念:clone

clone 是从远端仓库初次把数据取下来:
clone 命令具体会做两件事:
  1. 把整个仓库中的所有 branch 取下来,并把从初始 commit 到达这些 branch 的路径上的所有 commit 都取下来:
    1. notion image
  1. 从初始 commit 开始,向 master 指向的 commit,⼀个个地把每个 commit 应⽤,最终得到⼀个「当前」状态的仓库内容,写进 Git 所在的⽬录(这个⽬录叫做 working tree)

常⽤概念:log

从 HEAD 指向的 commit 开始,倒序显示每⼀个 commit 的摘要信息
notion image

常⽤概念:merge

merge 就是合并,它会把当前 commit 和指定 commit(所谓 commit,可以直接⽤它的 hash 值来指定,例如 4a0a1b ,也可以⽤⼀个直接或间接指向它的引⽤来指定,例如 master 或者 HEAD )进⾏合并,并把这个合并⾏为创建成⼀个新的 commit。
notion image
notion image
merge ⾏为所产⽣的 commit,是⼀种特殊的 commit:
  1. 它不需要有改动,只要指定两个(或更多个)⽗ commit 就好
  1. 正如上⾯这句说的,它有两个或更多个⽗ commit,这是⼀般的 commit 不具有的性质

merge 冲突

当 Git 不知道怎么合并某两处冲突的修改时,会中断⾃动合并,并对冲突⽂件进⾏标记。解决⽅法:
  1. 把⽂件⼿动修改好
  1. 把修改的内容使⽤ add 来添加进暂存区
  1. git merge --continue 来继续⾃动合并流程

关于 origin/ 打头的 branch

本地仓库中,有⼀些以 origin/ 打头的 branch,它们是远端仓库(别名为 origin)的本地镜像。它们的作⽤是⽅便在本地查看远端仓库的 branch 状态
远端仓库默认名称是 origin,但也可以给它们起别的名称
origin/ 分⽀并不在本地直接操作,它们⼀般只在两种情况下会进⾏⾃动更新:
  1. 在执⾏ push 的时候,push 成功后,push 成功的 branch 会把它对应的 origin/ branch 更新到当前 commit(因为远端的 branch 已经随着 push 的成功⽽更新,所以本地镜像也⼀起更新)
  1. 在执⾏ pull 或者 fetch 的时候,由于从远端拿到了所有最新的 branch 状态,所以也会⼀同更新所有的 origin/ branch
关于 origin/HEAD:这是⼀个永远跟随 origin/master 的引⽤,它最⼤的作⽤是⽤来标记默认 branch

常⽤概念:push

把当前 branch 推送到远端仓库的指定分⽀。
具体做两件事:
  1. 把 HEAD 所指向的 branch (只是⼀个引⽤哦)推送到远端仓库
  1. 从这个 branch 向前回溯,远端仓库缺少的每⼀个 commit 也推送到远端仓库。
  1. 将 push 的 branch 的本地镜像 origin/xxx 更新
notion image
notion image
notion image
notion image
💡
注意:origin/HEAD 并没有在图上画出来,但如果 push 是 master(即默认 branch),那么本地的 origin/HEAD 也会更新到 master 的最新位置;当 push 的是其他 branch 的时 候, origin/HEAD 并不会更新。 也就是说, origin/HEAD 只和默认分⽀相关,和 HEAD 是⽆关的。

常⽤概念:pull

把远端 branch 取到本地。
具体做的事有三件:
  1. 把远端所有 branch 的最新位置更新到本地的 origin/xxx 镜像
  1. 要到达这些 branch,本地所缺少的所有 commit,也取到本地
  1. origin/当前branch 的内容合并到当前 branch
notion image
notion image
notion image
notion image
事实上,git pull origin feature1 会分成两部执⾏,它等价于下⾯两⾏:
 
apk构建流程Feature Branching
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL