一、规范更新日志
二、git&repo介绍
2.1 git介绍
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
他是Linus Torvarlds为了帮助管理linux内核开发而开发的一个开放源码的版本控制软件
2.2 repo介绍
Repo 是对 Git 构成补充的多(可以巨多的那种)代码库管理工具,简单说就是使用 Python 在 Git 基础上开发的一系列脚本命令。当前整个 Android 项目(AOSP)就是通过 repo 来管理,最新版本的仓库大约 七百多个
三、Gitlab配置与权限申请
3.1 申请相关权限
3.2 更新Key
-
在vnc服务器上生成key
-
ssh-keygen -t rsa -C xxx@xiaopeng.com; (xxx@xiaopeng.com)是gitlab登录的邮箱账号
-
-
第二步回车之后会让你选择生成文件的保存位置和设置密码,文件保存位置默认即可,密码为空,生成之后去默认保存的位置找到.ssh文件夹
-
在.ssh目录下打开id_rsa.pub,复制里面的内容
-
登录gitlab,点击右上角的账户
-
点击setting
-
点击SSH keys
-
把id_rsa.pub里面的内容粘贴到Key对应的地方,然后点击Add Key即可
-
在VNC上下载buildroot代码,如果能下载成功,代表配置成功
3.3 下载buildroot代码
-
下载命令,不需要输入密
四、git工作流程
4.1 git一般工作流程:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
4.2 git工作区,暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
- 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
五、git基础命令
5.1 git配置命令
git config --list #显示当前git配置信息
git config -e #针对当前仓库配置文件
git config -e --global #针对系统上所有仓库配置文件
git config --global user.name "mahy1"
git config --global user.email mahy1@xiaopeng.com
git --version #获取git版本号
5.2 git基本操作命令概述
workspace:工作区
Staging area:暂存区/缓存区
Local repository: 版本库或者本地仓库
Remote repository: 远程仓库
分类 |
命令 |
说明 |
常用参数或者命令 |
提交与修改 |
git add |
添加文件到暂存区 |
|
git status |
查看仓库当前状态 显示有变更的文件 |
|
|
git diff |
比较文件的不同 即暂存区与工作区的差异 |
|
|
git commit |
提交暂存区到本次仓库 |
|
|
git reset |
回退版本 HEAD当前版本 HEAD^上一个版本 HEAD^3上上上一个版本 |
|
|
git rm |
将文件从暂存区和工作区中删除 |
||
git mv |
移动和重命名工作区文件 |
||
提交日志 |
git log |
查看历史提交记录 |
|
git blame <file> |
以列表形式查看指定文件的历史修改记录 |
||
远程操作 |
git remote |
远程仓库操作 |
|
git fetch |
从远程获取代码库 |
||
git pull |
下载远程代码并合并 |
||
git push |
上传远程代码并合并 |
5.4 提交日志命令
-
基本git log命令
-
Git log 不带任何参数,显示出所有历史记录,按q退出历史记录
-
-
显示参数
log参数 |
含义 |
-p |
按照补丁显示每个更新间的差异 |
--stat |
显示每次更新的修改文件的统计信息 |
--shortstat |
只显示--stat中最后的行数添加修改删除统计 |
--name-only |
在已经修改的提交信息后显示文件清单 |
--name-status |
显示新增,修改和删除的文件清单 |
--abbrev-commit |
仅显示SHA-1的前几个字符,而非所有的40个字符 |
--relative-date |
使用较短的相对时间显示 |
--graph |
显示ASCII图形显示的分支合并历史 |
--date |
按照规定日期格式显示 |
-
Git log --pretty
pretty参数 |
含义 |
%H |
Commit has |
%h |
Abbeviated commit hash |
%T |
Tree hash |
%t |
Abbreviated tree has |
%P |
Parent hashes |
%p |
Abbreviated parent hashes |
%an |
Author name |
%aN |
Author name |
%ae |
Author email |
%ad |
Author date, RFC2822 style |
%ad |
Author date |
%aD |
Author date, RFC2822 style |
%ar |
Author date, relative |
%at |
Author date, UNIX timestamp |
%ai |
Author date, ISO 8601-like format |
%aI |
Author date, strict ISO 8601 |
%cn |
Commiter name |
%ce |
Commited email |
%cE |
Commite email(respecting .mailmap) |
%cd |
Commited date |
%cD |
Commited date, RFC2822 style |
%cr |
Commited date, relative |
%ct |
Committer date, UNIX timestamp |
%ci |
Commited date, ISO 8601-like format |
%cI |
Commitr date, strict ISO 8601 |
%d |
Ref names |
%D |
Ref names without the , |
%e |
encoding |
%s |
subject |
%f |
Sanitized subject line, suitable for a filename |
%b |
body |
%B |
Raw body |
%N |
Commit notes |
-
筛选参数
参数 |
含义 |
--after= |
某个日期之后的 |
--before= |
某个日期之前的 |
--author= |
某个作者的 |
--grep= |
|
- - |
按照文件搜索 |
branchname |
按照分支搜索 |
Since untile |
按照范围搜索 |
--no-merges |
过滤掉merge信息 |
-merges |
只显示merge信息 |
Git log v1.0 |
查询标签之前的commit |
-
别名
git config --global alias.lm "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --author='你的名字!自己修改!' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.lms "log --no-merges --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --author='你的名字!自己修改!' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.ls "log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.lss "log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
5.3 分支管理命令
git分支实际上是指向更改快照的指针。
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
当我们切换到 testing 分支的时候,我们添加的新文件 被移除了。切换回 master 分支的时候,它们又重新出现了
git branch (branchname) #创建分支命令
git checkout (branchname) #切换分支命令
git merge #合并分支命令
git branch #列出在本地的分支
git checkout -b (branchname) #创建新分支并立即切换到该分支下
git branch -d (branchname) #删除分支
5.4 git查看提交历史
git log
git log --oneline #查看历史记录的简洁的版本
git log --graph #查看历史中什么时候出现了分支,合并
git log --reverse --oneline #倒序显示
git log --author #查找指定用户的提交日志
git log --oneline --before={3.weeks.ago} --after={2020-04-13}
git blame <file>
git reflog 可查看到所有历史代码修改信息,可用于恢复未备份代码情况下误删代码的问题
5.5 远程仓库管理
git remote #查看有哪些远程仓库
git remote -v #可以看到每个别名的实际链接地址
git fetch origin
git merge origin/master #更新远程仓库
git push origin master #推送新分支和数据到远程仓库
git remote rm [别名] #删除远程仓库
六、git高级命令
6.1 git标签
git tag -a v1.0 #创建带注解的标签
git log --decorate #可以查看标签
git tag -a v0.9 85fc7e7 #根据patch id来打标签
git tag #查看所有标签
git tag -a <tagname> -m "版本标签"
git tag -s <tagname> -m "版本标签" #PGP签名标签
git tag -d v1.1 #删除标签
git show v1.0 #展示标签内容
七、repo工作流程
7.1 Manifest
Repo 管理的核心就在于 Manifest
,每个采用 repo 管理的复杂多仓库项目都需要一个对应的 manifest 仓库,如 AOSP 的 manifest ,此仓库用来存储所有子仓库的配置信息,repo 也是读取此仓库的配置文件来进行管理操作。里面的配置就是 xml 定义的结构,一般有两个主要的配置:子仓库用到的仓库地址(remote)、子仓库详细配置信息(project)
-
Manifest例子
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch=".." name="origin" review="https://gitlab.xiaopeng.us"/>
<default remote="origin" revision="master"/>
<project path="cornerstone/device" name ="cornerstone_os/device" >
<linkfile src="XP/common/build.sh" dest="cornerstone/build.sh" />
</project>
<project path="cornerstone/XP_CI/repo" name="cornerstone_repo/repo" />
<project path="cornerstone/manifest" name="cornerstone_repo/manifest" >
<copyfile src="default.xml" dest="cornerstone/default.xml" />
</project>
<project path="cornerstone/rtos/zephyr" name ="cornerstone_rtos/kernel/zephyr" />
<!--...-->
</manifest>
-
Remote
远程仓库地址配置,可以多个。
- name: 名字,也用于子仓库的 git remote 名称(.git/config 里的 remote)
- alias: 别名,可省略,建议设为 origin, 设置了那么子仓库的 git remote 即为此名,方便不同的 name 下可以最终设置生成相同的 remote 名称
- fetch: 仓库地址前缀,即 project 的仓库地址为: remote.fetch + project.name
- pushurl: 一般可省略,省略了则直接用 fetch
- review: Gerrit code review 的地址,如果没有用 Gerrit 则不需要配置(也就不能用 repo upload 命令了)
- revision: 使用此 remote 的默认分支
-
Project
子项目仓库配置,可以多个。
- path: repo sync 同步时,相对于根目录的子仓库文件夹路径
- name: 子仓库的 git 仓库名称
- group: 分组
- revision: 使用的分支名
- clone-depth: 仓库同步 Git 的 depth
-
Copyfile
project 的子节点属性.
- src: project 下的相对路径
- dest: 整个仓库根路径下的相对路径
-
Linkfile
project 的子节点属性,类似 copyfile,只是把复制文件变为创建链接文件。
7.2 Local Manifest
local_manifest 简单说就是一个比 repo init 时设置的 manifest 有更高优先级的本地配置,一般用在不改动远程 manifest 配置又想设置到本地的专属配置时用得到。版本高一点的 repo 下,在工作根目录新建配置文件即可: .repo/local_manifests/local_manifest.xml
有一点需要注意的是如果需要覆盖主 manifest 文件已有 project 的配置那么需要先 remove-project 才行,不然会报错
<remove-project name="project_name" />
<!-- 再重写 project 配置 -->
<project path="xxx" name="xxx" revision="xxxx" remote="xxxx" />
八、repo基础命令
repo命令 |
等同git命令改造 |
备注 |
repo init -u <URL> [<OPTIONS>] |
初始化 |
|
repo sync [PROJECT_LIST] |
|
同步代码 |
repo upload [PROJECT_LIST] |
|
上传代码 |
repo forall [PROJECT_LIST] -c <COMMAND> |
|
多仓执行 |
repo start <BRANCH_NAME> [<PROJECT_LIST>] |
|
创建并切换分支 |
repo checkout <BRANCH_NAME> [<PROJECT_LIST>] |
|
切换分支 |
repo status [<PROJECT_LIST>] |
|
状态查询 |
repo branches [<PROJECT_LIST>] |
|
分支查询 |
repo diff [<PROJECT_LIST >] |
|
文件对比 |
repo prune [<PROJECT_LIST>] |
删除合并分支 |
|
repo stage –i [<PROJECT_LIST >] |
|
添加文件到暂存区 |
repo abandon <branchName> [<PROJECT_LIST > ] |
|
删除分支 |
repo version |
查看版本号 |
8.1 repo init
-b 选取的 manifest 仓库分支,默认 master
-m 选取的默认配置文件,默认 default.xml
--depth=1 git clone 的深度,一般如在 Jenkins 上打包时可用,加快代码 clone 速度
--repo-url=URL 使用自定义的 git-repo 代码,如前面说到的 fix 了 bug 的 git-repo
--no-repo-verify 不验证 repo 的源码,如果自定义了 repo url 那么这个一般也加上
8.2 repo sync
-
常用参数:
-
- -j:开启多线程同步操作,这会加快sync命令的执行速度。该参数在default.xml中有默认设置。
- -c, –current-branch:只同步指定的远程分支。默认情况下,sync会同步所有的远程分支。
-
-
不常用参数:
- -d, –detach:脱离当前的本地分支,切换到manifest.xml中设定的分支。
- -f, –force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。
- –no-clone-bundle:在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。
-
命令说明:
- 下载远程代码,并将本地代码更新到最新,这个过程称为“同步”。如果不使用任何参数,那么会对所有repo管理的git仓进行同步操作;也可以通过使用PROJECT_LIST参数,指定若干要同步的PROJECT。 根据本地git库代码不同,同步操作会有不同的行为:
- 当本地的git库是第一次触发同步操作时。该命令等价于git clone,会将远程git库直接拷贝到本地。
- 当本地已经触发过同步操作时。该命令等价于git remote update && git rebase origin/<BRANCH>,<BRANCH>就是当前与本地分支所关联的远程分支。在代码合并时可能会产生冲突,当冲突出现时,只需要解决完冲突,然后执行git rebase --continue即可
8.3 repo upload
-
命令说明:
- 将本地的新增或者修改代码上传到远程服务器。upload命令首先会找出本地分支从上一次同步操作以来发生的改动,然后会将这些改动生成Patch文件,上传至Gerrit服务器。 如果没有指定PROJECT_LIST,那么upload会找出所有git库的改动;如果某个git库有多个分支,upload会提供一个交互界面,提示选择其中若干个分支进行上传操作。
- 执行repo upload之前,需保证代码已经commit。
-
不常用参数:
- -re
- 当有多个git库的改动提交时,为了避免在网页上频繁的填选Reviewer这种重复劳动, upload提供了–re, –reviewer参数,在命令行一次性指定Reviewer
8.4 repo forall
-
常用参数:
- -c:后面可以带的任何可以被系统支持的shell命令
- -p:在shell命令输出之前列出项目名称
- -v:列出执行shell指令输出的错误信息
-
环境变量:
- 环境变量参数:
- REPO_PROJECT:指定项目的名称
- REPO_PATH:指定项目在工作区的相对路径
- REPO_REMOTE:指定项目远程仓库的名称
- REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
- REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性
- 如果-c后面的shell指令是上述的环境变量,则需要用单引号把shell命令括起来使用。
- 环境变量参数:
-
打标签:
- repo forall -c git tag 标签名
8.5 repo start
- repo start 的实质就是对git checkout -b 的封装
- 常用参数:
- --all:对所有的PROJECT都执行分支切换操作
- 常用参数:
8.6 repo checkout
- 该命令实际是对git checkout命令的封装。检出之前由repo start创建的分支
用于查看指定仓的工作空间,类似于git status,如果不添加参数,则是查看所有仓 。
8.7 repo status
- 每个小节的第一行显示的是项目名称和所在的分支名称
- 每个小节的第二行的第一个字母表示暂存区文件修改的状态
- -:没有改变
- A:添加(不在HEAD中,在暂存区中)
- M:修改(在HEAD中,在暂存区中,内容不同)
- D:删除(在HEAD中,不在暂存区)
- R:重命名(不在HEAD中,在暂存区,路径修改)
- C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)
- T:文件状态改变(在HEAD中,在暂存区,内容相同)
- U:未合并,需要冲突解决
- 每个小节的第二行的第二个字母表示工作区文件的更改状态
- -:新/未知(不在暂存区,在工作区)
- m:修改(在暂存区,在工作区,被修改)
- d:删除(在暂存区,不在工作区)
8.8 repo diff
该命令实际是对git diff命令的封装。用于显示各项目工作区下的文件差异,可指定只显示某一项目工作区下的文件差异
8.9 repo prune
删除指定PROJECT中,已经合并的分支。当在开发分支上代码已经合并到主干分支后,使用该命令就可以删除这个开发分支。随着时间的演进,开发分支会越来越多,在多人开发同一个git库,多开发分支的情况会愈发明显
8.10 repo stage
该命令实际是对git add --interactive命令的封装,用于将项目工作区中的改动添加到暂存区
8.11 repo abandon
该命令实际是对git branch -D命令的封装。作用是删除分支
8.12 repo manifest
-
常用参数:
- -r:保存当前分支revisions。
- -o NAME.xml:输出xml文件名。
-
命令说明
- 用于显示manifest文件内容。
8.13.repo version
用于显示repo版本号
Work in progress
开发过程中需要用到的常用命令:
- repo status: 跟 git status 类似,会把当前 repo 工作区的状态信息列出来
- repo diff: 同理 git diff
- repo forall <PROJECT_LIST> -c : 在(所有)子仓库下执行命令,比如 repo 没有类似git stash, 的命令,利用 forall 就可以实现:repo forall -c git stash
- repo prune: 删除已经合并分支
- repo stage: 把文件添加到 index 表(暂存区)中
- repo manifest: 显示当前使用的 manifest 信息内容
九、repo高级命令
十、gitlab工作流程
十一、gitlab基础用法
十二、gitlab高级用法
二十、常见git&repo错误
错误类型 |
错误信息提示 |
错误原因文章来源:https://www.toymoban.com/news/detail-503694.html |
错误解决方案文章来源地址https://www.toymoban.com/news/detail-503694.html |
到了这里,关于git&repo入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!