git&repo入门

一、规范更新日志

二、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

  1. 在vnc服务器上生成key

    1. ssh-keygen -t rsa -C xxx@xiaopeng.com; (xxx@xiaopeng.com)是gitlab登录的邮箱账号

  2. 第二步回车之后会让你选择生成文件的保存位置和设置密码,文件保存位置默认即可,密码为空,生成之后去默认保存的位置找到.ssh文件夹

  3. 在.ssh目录下打开id_rsa.pub,复制里面的内容

  4. 登录gitlab,点击右上角的账户

  5. 点击setting

  6. 点击SSH keys

  7. 把id_rsa.pub里面的内容粘贴到Key对应的地方,然后点击Add Key即可

  8. 在VNC上下载buildroot代码,如果能下载成功,代表配置成功

3.3 下载buildroot代码

  1. 下载命令,不需要输入密

四、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 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 提交日志命令

  1. 基本git log命令

    1. Git log 不带任何参数,显示出所有历史记录,按q退出历史记录

  2. 显示参数

log参数

含义

-p

按照补丁显示每个更新间的差异

--stat

显示每次更新的修改文件的统计信息

--shortstat

只显示--stat中最后的行数添加修改删除统计

--name-only

在已经修改的提交信息后显示文件清单

--name-status

显示新增,修改和删除的文件清单

--abbrev-commit

仅显示SHA-1的前几个字符,而非所有的40个字符

--relative-date

使用较短的相对时间显示

--graph

显示ASCII图形显示的分支合并历史

--date

按照规定日期格式显示

  1. 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

  1. 筛选参数

参数

含义

--after=

某个日期之后的

--before=

某个日期之前的

--author=

某个作者的

--grep=

- -

按照文件搜索

branchname

按照分支搜索

Since untile

按照范围搜索

--no-merges

过滤掉merge信息

-merges

只显示merge信息

Git log v1.0

查询标签之前的commit

  1. 别名

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)

  1. 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>

  1. 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 的默认分支
  1. Project

子项目仓库配置,可以多个。

  • path: repo sync 同步时,相对于根目录的子仓库文件夹路径
  • name: 子仓库的 git 仓库名称
  • group: 分组
  • revision: 使用的分支名
  • clone-depth: 仓库同步 Git 的 depth
  1. Copyfile

project 的子节点属性.

  • src: project 下的相对路径
  • dest: 整个仓库根路径下的相对路径
  1. 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会同步所有的远程分支。
  2. 不常用参数:

    1. -d, –detach:脱离当前的本地分支,切换到manifest.xml中设定的分支。
    2. -f, –force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。
    3. –no-clone-bundle:在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。
  3. 命令说明:

    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. 命令说明:

    1. 将本地的新增或者修改代码上传到远程服务器。upload命令首先会找出本地分支从上一次同步操作以来发生的改动,然后会将这些改动生成Patch文件,上传至Gerrit服务器。 如果没有指定PROJECT_LIST,那么upload会找出所有git库的改动;如果某个git库有多个分支,upload会提供一个交互界面,提示选择其中若干个分支进行上传操作。
    2. 执行repo upload之前,需保证代码已经commit。
  2. 不常用参数:

    1. -re
    2. 当有多个git库的改动提交时,为了避免在网页上频繁的填选Reviewer这种重复劳动, upload提供了–re, –reviewer参数,在命令行一次性指定Reviewer

8.4 repo forall

  1. 常用参数:

    1. -c:后面可以带的任何可以被系统支持的shell命令
    2. -p:在shell命令输出之前列出项目名称
    3. -v:列出执行shell指令输出的错误信息
  2. 环境变量:

    1. 环境变量参数:
      1. REPO_PROJECT:指定项目的名称
      2. REPO_PATH:指定项目在工作区的相对路径
      3. REPO_REMOTE:指定项目远程仓库的名称
      4. REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
      5. REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性
      6. 如果-c后面的shell指令是上述的环境变量,则需要用单引号把shell命令括起来使用。
  3. 打标签:

    1. repo forall -c git tag 标签名

8.5 repo start

  1. repo start 的实质就是对git checkout -b 的封装
    1. 常用参数:
      1. --all:对所有的PROJECT都执行分支切换操作

8.6 repo checkout

  1. 该命令实际是对git checkout命令的封装。检出之前由repo start创建的分支

用于查看指定仓的工作空间,类似于git status,如果不添加参数,则是查看所有仓 。

8.7 repo status

  1. 每个小节的第一行显示的是项目名称和所在的分支名称
  2. 每个小节的第二行的第一个字母表示暂存区文件修改的状态
    1. -:没有改变
    2. A:添加(不在HEAD中,在暂存区中)
    3. M:修改(在HEAD中,在暂存区中,内容不同)
    4. D:删除(在HEAD中,不在暂存区)
    5. R:重命名(不在HEAD中,在暂存区,路径修改)
    6. C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)
    7. T:文件状态改变(在HEAD中,在暂存区,内容相同)
    8. U:未合并,需要冲突解决
  3. 每个小节的第二行的第二个字母表示工作区文件的更改状态
    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. 常用参数:

    1. -r:保存当前分支revisions。
    2. -o NAME.xml:输出xml文件名。
  2. 命令说明

    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错误

错误类型

错误信息提示

错误原因

错误解决方案

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值