1. git介绍


   Git是一个分布式版本控制系统(DVCS),其数据库中保存所有版本下的所有文件。Git本地数据库是远程数据库的备份,几乎所有操作都可在本地完成(如浏览项目历史,文件缓存,文件commit)。当需要时再上传到远程数据库中。

    分布式版本控制系统的优点:未联网下本地仍可以执行所有操作,反应速度快。

    Git数据上传时会根据数据计算出唯一的40位的哈希校验和,然后以这个校验和来进行引用。实际上数据库保存的信息都是以文件内容的哈希值来进行索引,而不是文件名。

  Git的作用是管理一批文件的集合,已追踪文件的变化。使用仓库来存储这些信息;信息包含:传输对象及指向传输对象的指针Git仓库及工程都存储在.git文件夹下。

 

本地系统中文件修改有三种状态,已提交,已暂存,已修改。其对应三个不同的区域,Git仓库,暂存区域,工作目录。其关系对应如下:

状态

对应区域

备注

已修改 工作目录 该树与本地文件系统同步,代表对文件和目录中内容的立即更改。
已提交 Git本地仓库 数据存放在本地数据库中,包含了commit的所有记录
已暂存 暂存区域 对修改文件做标识放入缓存区域中,跟踪git add命令添加更改的文件,这些更改的文件将用于下次的commit。

 

Git 使用笔记

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 使用笔记

git checkout b

master指针依旧指向d,但HEAD指针指向为b

Git 使用笔记

git reset b

maser branch 指针与HEAD指针都指向b

Git 使用笔记

 

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
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://www.yiibai.com/git

https://learngitbranching.js.org/

 

相关文章: