1. git介绍
Git是一个分布式版本控制系统(DVCS),其数据库中保存所有版本下的所有文件。Git本地数据库是远程数据库的备份,几乎所有操作都可在本地完成(如浏览项目历史,文件缓存,文件commit)。当需要时再上传到远程数据库中。
分布式版本控制系统的优点:未联网下本地仍可以执行所有操作,反应速度快。
Git数据上传时会根据数据计算出唯一的40位的哈希校验和,然后以这个校验和来进行引用。实际上数据库保存的信息都是以文件内容的哈希值来进行索引,而不是文件名。
Git的作用是管理一批文件的集合,已追踪文件的变化。使用仓库来存储这些信息;信息包含:传输对象及指向传输对象的指针Git仓库及工程都存储在.git文件夹下。
本地系统中文件修改有三种状态,已提交,已暂存,已修改。其对应三个不同的区域,Git仓库,暂存区域,工作目录。其关系对应如下:
|
状态 |
对应区域 |
备注 |
|---|---|---|
| 已修改 | 工作目录 | 该树与本地文件系统同步,代表对文件和目录中内容的立即更改。 |
| 已提交 | Git本地仓库 | 数据存放在本地数据库中,包含了commit的所有记录 |
| 已暂存 | 暂存区域 | 对修改文件做标识放入缓存区域中,跟踪git add命令添加更改的文件,这些更改的文件将用于下次的commit。 |
1.1 git 工作流程
|
编号 |
过程 |
命令 |
|---|---|---|
| 1 | 工作目录修改文件 | NA |
| 2 | 文件快照放入暂存区 | git add |
| 3 | 暂存区文件存储咋本地仓库中 | git commit |
| 4 | 上传都远程仓库 | git pus |
2 git 命令集
|
2.1 克隆 |
命令解析 |
命令作用 |
|---|---|---|
|
git clone [url] [Usr_name] |
[url]:远程仓库链接地址 [Usr_name]:可选条件,为本地文件夹命名,如不设置则默认远程仓库数据。 |
从远程仓库拷贝所有数据到本地。用于首次从远程仓库下载数据。 |
|
2.2 下载与上传 |
命令解析 |
命令作用 |
|---|---|---|
| git fetch | 将远程所有更新取回到本地 | 从远程数据库中拷贝最新数据到本地,用于同步本地数据仓库与远程数据仓库一致。 |
| git fetch origin master | 将远程的master分支所有更新取回到本地 | |
| git push [远程主机名] [本地分支名]:[远程分支名] | git push origin HEAD:refs/for/master | 本地分支更新推送到远程数据库中 |
| git push – all origin | 将所有本地分支都推送到origin主机 |
|
2.3 查看变更内容 |
命令解析 |
命令作用 |
|---|---|---|
| git tree -10 | 查看最近10次的树 | 看分支 |
| gitk | 图形页面打开Git | 图形页面 |
| git log -10 | 擦看最近10次的log | 记录 |
| git diff | 查看所有文件修改点 | 工作目录与暂存区的差异 |
| git diff bob.c | 查看指定文件修改点 | 工作目录与暂存区的差异 |
| git diff -staged | 查看暂存文件与上次提交的差异点 | 暂存区与本地数据库的差异 |
| git diff HEAD | 查看工作目录与本地HEAD之间的差异 | |
| git diff branch1 | 查看当目录与分支branch1之间的差异 | |
| git diff HEAD^ HEAD | 查看上次提交与上上次提交的差异 | |
| git diff SHA1 SHA2 | 比较俩个历史版本的差异 | |
| git status | 当前工作区状态 | |
| git show Hash | 查看某次具体修改点 | 查看某次具体修改 |
Note:1 每次上传的page都有唯一的40字节的Hash校验码来表示,该码可表示某个特定的版本。
2 Hash校验码的前6字节是唯一的,一般使用前6字节即可。
2 Hash校验码的前6字节是唯一的,一般使用前6字节即可。
|
2.4 本地操作数据 |
命令解析 |
命令作用 |
|---|---|---|
| git add hello.c | 文件添加到缓存区 | 添加指定文件 |
| git add . | 所以修改 | 添加所有文件 |
| git add -A | 所有修改 | 包含追踪的文件(修改,删除),未追踪的文件 |
| git add *.c | 指定格式所有文件 | 指定格式所有文件 |
| git add -u <path> | path路径中的文件 | 只添加追踪的文件 |
| git commit | 文件从缓冲区上传至服务器;新增一个新patch | 会打开提示信息书写界面,人为添加相关备注。 |
| git commit -m 'BBBBBBB' | 文件从缓冲区上传至服务器;新增一个新patch | 不会打开提示信息书写界面,相关信息添加到后面的字符串数组中 |
| git commit --amend | 重新提交;提交到上一个上传的patch,不会新增patch | 会打开提示信息书写界面,人为添加相关备注。 |
执行git commit命令后,会自动生成change-id这一行信息(在信息中最好一行),该信息表示数据push放到的点;
当执行git commit --amend,change-id会与上次生成的信息一次,本次上传与上次上传会push到同一位置;
当执行git commit后,如果我们在最后一行手动加入以后的change-id信息,则本次命令执行后不会生成新的change-id,本次上传会上传到change-id指定的点。
|
2.5 分支操作 |
命令解析 |
命令作用 |
|---|---|---|
| git branch | 显示当前分支 | 当前分支 |
| git branch -a | 显示所有分支 | 本地鱼远程 |
| git branch branch_A | 创建 | 创建一个名为branch_A的分支 |
| git checkout branch_A | 跳转 | 跳转到名为branch_A的分支上去 |
| git checkout -b branch_A | 创建并跳转 | 创建分支Branch_A并跳转 |
| git branch -D branch_A | 删除 | 删除分支 |
| git branch -m branch_A branch_B | 重命名 | branchA重名命名未branchB |
| 合并分支 | 合并分支 |
注意:如在提交点C3创建一个新的分支Branch1后,当前Head指针仍指向原有分支,当执行提交后,原有分支指向C4;而Branch1最新点仍在C3
|
2.6 切换版本 |
命令解析 |
命令作用 |
|---|---|---|
| git branch | 查看当前分支 | 查看未跳转前分支指向的Head指针 |
| git tree/log | 查看记录 | 察看过往记录,每个记录都有唯一的HASH值 |
| git checkout hash_value | 版本跳转 | 跳转到Hash_value指定的版本中去 |
| git branch | 查看当前分支 | 查看跳转后分支指向的Head指针,判断是否跳转成功。 |
| git submoudle uapdate | 更新子模块 | 更新子模块 |
Note:
版本切换前,必须先commit当前版本。
|
2.7 子模块 |
|
|---|---|
|
git submodule update --init --recursive |
从远程下载子模块 |
| git submodule sync | 本地同步显示子模块 |
| 2.8 取消操作 | |
|---|---|
| git checkout hash_value | 将HEAD指针移动到hash_value指向的提交; |
| git reset --hard HEAD |
git仓库更新为指定的提交,缓存区与本地工作目录将重置(与仓库一致);意味着将丢失缓存与本地的所有变更 |
| git reset --mixed HEAD | git仓库更新为指定的提交,缓存区的修改全部撤销并转移到工作目录,工作目录内容维持不变 |
| git reset --soft HEAD |
git仓库更新为指定的提交,缓存区与工作目录变更维持不变; --soft只会重置提交的历史记录,当使用HEAD参数时,由于提交记录已经是HEAD,所以执行该命名,没有任何变化。 |
| git reset == git reset --mixed HEAD | |
| git reset HEAD~2 | mixed命令行参数下,重置到当前HEAD指向的位置的前面第2次提交; |
Git reset:用于撤销变更,该命令有三种主要的调用形式,对应的三个命令行参数 --soft, --mixed, – hard;这三命令行一次对应着内部状态管理机制的Commit Tree (HEAD), The Staging Index, 跟 The Working Directory。
Git reset默认调用具有–mixed 和HEAD的隐形参数,这表明git reset 等同于git reset --mixed HEAD(可以使用任何哈希值来代替HEAD)
Git reset 与 Git checkout的差异点:
从表面上来看,这俩个命令的表现是非常相似的,
git chckout:只是将HEAD指针指向指定的提交;
git reset:会将HEAD指针与branch 指针指向指定的提交;
目前HEAD指针与BRANCH指针都指向点d;在此基础上分别执行 git checkout b 与 git reset b指令后,表现如下:
git checkout b
master指针依旧指向d,但HEAD指针指向为b
git reset b
maser branch 指针与HEAD指针都指向b
| 2.9数据上传流程 | ||
|---|---|---|
| 1 | git add . | 添加所有修改到缓存 |
| 2 | git commit | 缓存区添加到本地数据库 |
| 3 | git branch NewBranch | 创建一个新的branch用于保存当前数据 |
| 4 | git fetch origin | 本地数据库同步远程数据库数据 |
| 5 |
git log |
得到本地最新与远程最新处的Hash值;Hash_Local,Hash_Remotes |
| 6 | git checkout Hash_Remotes | |
| 7 | git cherry-pick Hash_Local |
综合本地与远程最新处的修改并创建一个新的package;如有冲突,需解决冲突,并再次add,commit |
| 8 | git push origin HEAD:refs/for/master | 本地分支更新推送到远程数据库中 |
| 9 | cd config | 切换到子模块 |
| 10 | 参考步骤1~8 | 子模块的更新与代码更新步骤一致(后面步骤仅仅适用于按子模块的项目) |
| 11 | Bump: step1 | 在configcheckout merge 后的config最新点 |
| 12 | Bump: step2 | 在autosar里点击git status,会显示config更改,此时git add,commit,push |
注:当需要上传代码时,本地代码Loacl_hash需要与最新点代码remote_hash处的代码进行合并及同步;首先add,commit创建一个新的Local_hash,接着下载remote_hash,并再remote_hash上cherry-pick local_hash指定的版本;
此时会产生一个新的patch,如有该patch存在冲突,需手动解决冲突后,并再次add,commit。最后push上去
参考资料:
https://learngitbranching.js.org/