一、规范更新日志
二、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服务器上生成key1. 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 [email protected]
git --version #获取git版本号
5.2 git基本操作命令概述
workspace:工作区
Staging area:暂存区/缓存区
Local repository: 版本库或者本地仓库
Remote repository: 远程仓库
分类
命令
说明
常用参数或者命令
提交与修改
git add
添加文件到暂存区
git add [file1] [file2]
git add [dir]
git add . #添加当前目录所有文件
git add --all #添加当前目录所有文件
git status
查看仓库当前状态
显示有变更的文件
git status -s #获取简单输出结果
git diff
比较文件的不同
即暂存区与工作区的差异
git diff [file]
git diff --cached [file] #显示暂存区和上一次提交的差异
git diff --staged [file] #同上
git diff [first-branch] [second-branch]
git commit
提交暂存区到本次仓库
git commit -m [message]
git commit [file1] [file2]
git commit -a #参数修改设置文件后不需要执行git add,直接提交
**git commit -help #查看commit命令的可用选项**
git reset
回退版本
HEAD当前版本
HEAD^上一个版本
HEAD^3上上上一个版本
git reset [--soft | --mixed | --hard] [HEAD]
git reset [HEAD]
git reset HEAD^ #回退所有内容到上一个版本
git reset HEAD…… hello.py
git reset 052e #回退到指定版本
git rm
将文件从暂存区和工作区中删除
git mv
移动和重命名工作区文件
提交日志
git log
查看历史提交记录
git blame <file>
以列表形式查看指定文件的历史修改记录
远程操作
git remote
远程仓库操作
git fetch
从远程获取代码库
git pull
下载远程代码并合并
git push
上传远程代码并合并
5.4 提交日志命令
基本git log命令1. 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]
- git clone
- git remote update && git rebase origin/<BRANCH>
同步代码
repo upload [PROJECT_LIST]
- git push
上传代码
repo forall [PROJECT_LIST] -c <COMMAND>
- 无
多仓执行
repo start <BRANCH_NAME> [<PROJECT_LIST>]
- git checkout -b
创建并切换分支
repo checkout <BRANCH_NAME> [<PROJECT_LIST>]
- git checkout
切换分支
repo status [<PROJECT_LIST>]
- git status
状态查询
repo branches [<PROJECT_LIST>]
- git branch
分支查询
repo diff [<PROJECT_LIST >]
- git diff
文件对比
repo prune [<PROJECT_LIST>]
删除合并分支
repo stage –i [<PROJECT_LIST >]
- git add --interactive
添加文件到暂存区
repo abandon <branchName> [<PROJECT_LIST > ]
- git branch -d
删除分支
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
常用参数:1. 1. -j:开启多线程同步操作,这会加快sync命令的执行速度。该参数在default.xml中有默认设置。2. -c, –current-branch:只同步指定的远程分支。默认情况下,sync会同步所有的远程分支。
不常用参数:1. -d, –detach:脱离当前的本地分支,切换到manifest.xml中设定的分支。2. -f, –force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。3. –no-clone-bundle:在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。
命令说明:1. 下载远程代码,并将本地代码更新到最新,这个过程称为“同步”。如果不使用任何参数,那么会对所有repo管理的git仓进行同步操作;也可以通过使用PROJECT_LIST参数,指定若干要同步的PROJECT。 根据本地git库代码不同,同步操作会有不同的行为:2. 当本地的git库是第一次触发同步操作时。该命令等价于git clone,会将远程git库直接拷贝到本地。3. 当本地已经触发过同步操作时。该命令等价于git remote update && git rebase origin/<BRANCH>,<BRANCH>就是当前与本地分支所关联的远程分支。在代码合并时可能会产生冲突,当冲突出现时,只需要解决完冲突,然后执行git rebase --continue即可
8.3 repo upload
命令说明:1. 将本地的新增或者修改代码上传到远程服务器。upload命令首先会找出本地分支从上一次同步操作以来发生的改动,然后会将这些改动生成Patch文件,上传至Gerrit服务器。 如果没有指定PROJECT_LIST,那么upload会找出所有git库的改动;如果某个git库有多个分支,upload会提供一个交互界面,提示选择其中若干个分支进行上传操作。2. 执行repo upload之前,需保证代码已经commit。
不常用参数:1. -re2. 当有多个git库的改动提交时,为了避免在网页上频繁的填选Reviewer这种重复劳动, upload提供了–re, –reviewer参数,在命令行一次性指定Reviewer
8.4 repo forall
常用参数:1. -c:后面可以带的任何可以被系统支持的shell命令2. -p:在shell命令输出之前列出项目名称3. -v:列出执行shell指令输出的错误信息
环境变量:1. 环境变量参数: 1. REPO_PROJECT:指定项目的名称2. REPO_PATH:指定项目在工作区的相对路径3. REPO_REMOTE:指定项目远程仓库的名称4. REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值5. REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性6. 如果-c后面的shell指令是上述的环境变量,则需要用单引号把shell命令括起来使用。
打标签:1. repo forall -c git tag 标签名
8.5 repo start
- repo start 的实质就是对git checkout -b 的封装 1. 常用参数: 1. --all:对所有的PROJECT都执行分支切换操作
8.6 repo checkout
- 该命令实际是对git checkout命令的封装。检出之前由repo start创建的分支
用于查看指定仓的工作空间,类似于git status,如果不添加参数,则是查看所有仓 。
8.7 repo status
- 每个小节的第一行显示的是项目名称和所在的分支名称
- 每个小节的第二行的第一个字母表示暂存区文件修改的状态 1. -:没有改变2. A:添加(不在HEAD中,在暂存区中)3. M:修改(在HEAD中,在暂存区中,内容不同)4. D:删除(在HEAD中,不在暂存区)5. R:重命名(不在HEAD中,在暂存区,路径修改)6. C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)7. T:文件状态改变(在HEAD中,在暂存区,内容相同)8. U:未合并,需要冲突解决
- 每个小节的第二行的第二个字母表示工作区文件的更改状态 1. -:新/未知(不在暂存区,在工作区)2. m:修改(在暂存区,在工作区,被修改)3. 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
常用参数:1. -r:保存当前分支revisions。2. -o NAME.xml:输出xml文件名。
命令说明1. 用于显示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错误
错误类型
错误信息提示
错误原因
错误解决方案
版权归原作者 山河故人~ 所有, 如有侵权,请联系我们删除。