gitrepo入门

一、规范更新日志

二、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 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 git checkout . 或者 git checkout -- 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
  • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 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

以列表形式查看指定文件的历史修改记录

远程操作

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

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 -m "版本标签"

git tag -s -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例子

  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 才行,不然会报错

 

八、repo基础命令

repo命令

等同git命令改造

备注

repo init -u []

初始化

repo sync [PROJECT_LIST]

  • git clone
  • git remote update && git rebase origin/

同步代码

repo upload [PROJECT_LIST]

  • git push

上传代码

repo forall [PROJECT_LIST] -c

多仓执行

repo start []

  • git checkout -b

创建并切换分支

repo checkout []

  • git checkout

切换分支

repo status []

  • git status

状态查询

repo branches []

  • git branch

分支查询

repo diff []

  • git diff

文件对比

repo prune []

删除合并分支

repo stage –i []

  • git add --interactive

添加文件到暂存区

repo abandon [ ]

  • 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/就是当前与本地分支所关联的远程分支。在代码合并时可能会产生冲突,当冲突出现时,只需要解决完冲突,然后执行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 -c : 在(所有)子仓库下执行命令,比如 repo 没有类似git stash, 的命令,利用 forall 就可以实现:repo forall -c git stash
  • repo prune: 删除已经合并分支
  • repo stage: 把文件添加到 index 表(暂存区)中
  • repo manifest: 显示当前使用的 manifest 信息内容

九、repo高级命令

十、gitlab工作流程

十一、gitlab基础用法

十二、gitlab高级用法

二十、常见git&repo错误

错误类型

错误信息提示

错误原因

错误解决方案


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部