Android使用Git作为代码管理工具,并开发了Gerrit进行代码审核以便更好的对代码进行集中式管理,还开发了Repo命令行工具(Repo是谷歌用Python脚本写的调用git的一个脚本),对Git部分命令封装,将百多个Git库有效的进行组织。
继Gerrit之后,广泛使用的GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。具有wiki和issue跟踪功能。安装方法参考GitLab在GitHub上的Wiki页面。
序号 | 操作场景 | 操作时机 | GIT + Gerrit(or Gitlab) (git:代码管理工具;gerrit/gitlab: 代码审核管理工具) |
Repo (repo: 封装git的命令行工具;) |
||
命令 | 说明 | 命令 | 说明 | |||
一、基本操作:增、删、改、查 | ||||||
1.1 | 环境配置 | 配置公钥 | ssh-keygen -t rsa -C "[email protected]" | 生成rsa类型的非对称密钥,并添加一个comments。ssh key 一般在 ~/.ssh/id_rsa.pub 文件内。 |
||
配置用户名 | git config --global user.name "shaoyoushi" | |||||
配置邮件 | git config --global user.email "[email protected]" | |||||
修改manifest仓库分支信息 | 修改.repo/manifests下真正的manifest文件***.xml | 表面上调用的.repo/manifest.xml其实是个链接,查看实际链到的.xml后,修改该具体的.xml即可。 | ||||
1.2 | 本地建仓,初始化 | 新建并初始化空仓 | git init | 进入新建的本地工作目录后,下载git或repo工具并初始化,会在本地生成.git或.repo(内含仓库信息),类似SVN上的.svn。 | repo init | 初始化git仓库,如“repo init -u git://172.16.1.11/manifest.git -b 分支名称 -m wanglei.xml” |
1.3 | 拉代码 | 获取库上代码 | git clone 中心库地址 例如:git clone ssh://[email protected]:2222/myname/soundeffectehb.git |
克隆中心库到本地,不指定本地库名则克隆到本地的库名默认和中心库一致。 关于中心库的地址,Git 支持许多数据传输协议。可以使用git:// 协议、 http(s):// 或者 user@server:/path.git 表示的 SSH 传输协议。 |
更新所有工程代码: repo sync(sync之前先repo init,下载repo并克隆manifest仓) |
如果版本库尚不存在,则执行repo sync 命令相当于执行git clone;如果项目版本库已经存在,则相当于执行下面的两条指令: git remote update (相当于对每一个remote源执行了fetch操作) git rebase origin/branch (针对当前分支的跟踪分支执行rebase操作。) |
git fetch 远端库名称 例如:git fetch kirin |
获取远端库的更新到本地库(但不更新工作拷贝)。 | |||||
git fetch 远端库名称 git checkout origin/master -- path/to/file |
先从远端库更新到本地库,然后从本地库更新单个文件到本地拷贝。 | |||||
更新指定工程代码: git pull <中心库地址> <远端库分支>:<本地分支> 如:git pull k br_trunk_bsp:HEAD(或本地的分支名) (注意,这样会再本地生成一个HEAD的分支,手动删掉即可) |
取回远程主机某个分支的更新,再与本地的指定分支合并(相当于先做git fetch,再做git merge)。如果是本地当前分支合并,则冒号后的部分都可以不输入。 | repo forall -c git checkout -b 本地分支名称(自定义) 中心库分支名称 | 实际是一个迭代器操作。 | |||
1.4 | 建分支 | 创建本地分支 | git branch 新分支名 | 注:若在分支名后加上commitID则表示是基于该commitID拉出的新分支。 | 创建本地分支: repo start 分支名 --all |
创建分支。repo start实际是对git checkout –b 命令的封装。为指定的项目或所有项目(若使用—all参数),以清单文件中为设定的分支,创建特性分支。 |
切换到某个已存在的工作分支 | git checkout 分支名 | repo checkout |
切换分支。实际上是对git checkout 命令的封装,但不能带-b参数,所以不能用此命令来创建特性分支。 | |||
创建并且切换到本地分支 | git checkout -b local_branch | |||||
删除本地分支 | git branch -d 分支名 | 注:”-d”只删除已合并到其他分支的部分。删除分支前会检查分支中的内容是否都已经合并到其他分支,如果没有,则命令不执行;”。 | repo prune [ |
实际上是对git branch –d命令的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支。 | ||
git branch -D 分支名 | 注:”-D”不进行检查,直接删除分支。 | 删除本地分支: repo abandon |
实际上是对git branch –D 命令的封装。 | |||
创建远程分支 | 步骤一: 创建本地分支,并切换到新建的本地分支工作 步骤二: git push 远程版本库名 本地分支名 |
|||||
删除远程分支 | git remote rm 远端库目标 | repo remote rm 远端库目标 | 删除远端库上的指定目标。Repo remote命令用于设置远端库,类似的还有“repo remote add 目标 远端库URL” | |||
分支合并 | 场景1:直接合并"分支1"到"分支2": 步骤一:切换工作空间到"分支2" git checkout "分支2" 步骤二:合并 "git merge ""分支1"" 场景2:挑选合并某次commit到当前分支: 步骤一:切换到目标分支 步骤二:git cherry-pick commitID" |
|||||
重命名分支 | git branch -m oldbranch newbranch | 注:此操作是将“oldbranch”分支的名称改成“newbranch”。如果需要拉出分支,并同时切换到新分支可以用“git checkout –b oldbranch newbranch” | ||||
1.5 | 修改代码 | 添加单个文件的修改 | git add 文件名 | 添加某个文件 | repo stage -i [ |
把文件添加到index表中。实际是对git add --interactive命令的封装、用于挑选各个项目工作区中的改动以加入暂存区。 |
添加整个目录的修改 | git add . | 添加当前目录 | ||||
提交到本地库 | git commit -m "新的提交信息" --amend | 此操作将所有缓存区的修改提交到本地版本库,同时可添加comments注释。 注:此操作只能修改最新的一次提交,之前的提交无法修改。 |
同git | |||
修改最近一次提交的注释 | git commit --amend | 注意:必须是最近提交,还没有push并且merged的注释。 | ||||
新建标签 | git tag -a 标签 -m 标签信息 | 用 -a (译注:取 annotated 的首字母)指定标签名字,而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。另外,还可通过其他命令参数添加标签签署信息,便于校验。 | tag | |||
为指定提交增加tag | git tag tag_name a_commit_id | 对当前分支的指定提交打一个tag | ||||
删除tag | git tag -d a_tag_name | |||||
跟踪(add)时忽略某些文件 | 在工作目录下新建一个名为.gitignore的文件,然后在里面规定忽略那些文件 | |||||
删除文件 | git rm 文件名 | 删除文件并将删除的信息转移至缓存区,要想删除库上的文件需要执行commit操作,同样使用git reset 恢复删除文件。 | 同git | |||
重命名文件或目录 | git mv 原文件名 新文件名 | 重命名或者移动本地文件或目录,mv后直接到缓存区,需要执行commit操作。 | ||||
新增修改至本地缓存(暂存区) | git stash | 保存工作区现场,并将工作区置为clean状态。每次保存,最新的stash都被命名为stash@{0},而之前的保存的stash的命名都会加1,也就是说stash的保存类似于stack,是FILO的。 注:此操作是将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修改,运行“git stash pop ”即可,如果要恢复指定的stash修改则用git stash pop stash@{1} // 从指定的一个stash恢复,并删除该stash。 |
||||
保存至暂存区时添加说明 | git stash save "message" | 保存一个stash,并附加一条说明消息到这个stash上,方便后面的查看 | ||||
1.6 | 提交 | 提交代码到中心库 | git push <远端库名称> <本地分支名(或HEAD)>:<远端分支名> 例如:git push ssh://[email protected]:2222/myname/soundeffectehb.git HEAD:master |
注1:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可省略。 注2:gerrit不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。这也是为什么我们需要使用gerrit的原因。gerrit本身就是个代码审核工具。因此需要使用以下命令提交:git push k(or origin) HEAD:refs/for/br_develop_20190817 |
repo upload 注解: 我们产品代码通过gerrit和repo禁用掉了直接用git push来上库 只能通过repo upload project_name 把修改上传到 “伪库”,必须经过代码review才可以真正”漂白”上库,共享给主线. |
repo upload相当于git push,但是又有很大的不同。它不是将版本库改动推送到克隆时的远程服务器,而是推送到代码审核服务器(Gerrit软件架设)的特殊引用上,使用SSH协议。代码审核服务器会对推送的提交进行特殊处理,将新的提交显示为一个待审核的修改集,并进入代码审查流程,只有当审核通过后,才会合并到官方正式的版本库中。 |
git push | 将本地当前分支推送到相关联的远程仓库中去。需要通过以下操作预先关联一个远程库: 在本地添加远程库 git remote add name url // 在本地添加关联一个远程仓库 git remote add origin [email protected]:shaoyoushi/hello-world.git // 在本地添加关联一个远程库,命名为origin(习惯),采用的是ssh协议进行传输 git remote add abc https://github.com:shaoyoushi/hello-world.git // 在本地添加关联一个远程库,命名为abc,采用的是https协议进行传输 |
|||||
推送tag到远程仓库 | git push origina_tag_name(推送一个指定的tag到远程仓库origin) git push origin --tags(推送所有未推送的tags到远程仓库origin) |
创建tag repo forall -c 'git tag -a tag_name -m "创建tag的原因和描述" ' repo forall -c ' git push origin tag_name ' 删除tag repo forall -c 'git tag -d tag_name' 回退代码到某个tag(只读) repo forall -c ' git checkout tag_name ' 回退代码到某个tag(可写) repo forall -c 'git checkout -b new_branch_name tag_name' |
||||
把另一个分支的修改合并到当前分支 | git checkout mywork git rebase origin |
这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。参考:https://blog.csdn.net/hudashi/article/details/7664631/ |
1.7 | 查看库配置信息 | 查看manifest内容 | repo manifest –o xml文件 | 显示manifest文件内容。 | ||
查看git版本号 | git version | 显示git版本号。 | repo version | 显示repo版本号。 | ||
查看单个git配置信息 | 例如:git config user.name | 显示user.name的配置信息。 | ||||
查看git配置列表信息 | git config --list | 有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig和~/.gitconfig),不过最终 Git 实际采用的是最后一个。 | ||||
查看分支信息 | 查看分支 | git branch (或直接查看.git/HEAD中的内容,即为当前HEAD指针所指向的内容) | 查看git库中的所有分支,后面加参数“-r”则可显示git库中对应的远程分支参照。 | repo branches | ||
查看指定分支信息 | git show a_branch | |||||
查看对应的远程分支 | git branch -r | |||||
查看本地关联的远程仓库 | git remote // 查看远程仓库的名称 git remote -v // 查看远程参考的名称和对应的url |
|||||
更新绑定的远端库路径 | git remote set-url 远端库名称 远端库新地址 例如:git remote set-url gitlab ssh://[email protected]:2222/ics/icsv1/audiosoundeffects/audiocontrol.git |
当远端库地址更新时通过该操作重新绑定,否则会push失败。 | ||||
查看分支合并记录 | git branch --merged | 查看已经合并到当前分支的所有分支。 | ||||
git branch --no-merged | 查看还没有合并到当前分支的所有分支。 | |||||
查看修改提交信息 | 查看当前仓下文件状态 | git status | 修改完之后,查看本地库中所有文件的状态,包括未受控的,已修改,已缓存。冲突文件的状态也表现为已修改的。 | repo status (可选加参数:文件,目录,分支) | ||
查看log | git log --all (查看全部详细的log信息) git log --pretty=oneline //查看当前分支的提交历史 里面包含 commit id (查看全部log概要列表) |
查看日志 | 同git | |||
统计所有提交者各自的代码行数 | git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --since ==2019-11-01 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done | |||||
查看命令历史 | git reflog | |||||
查看所有的stash | git stash list | |||||
查看指定提交信息 | git show a_commit_id | |||||
显示图形化的git日志树 | gitk --all | |||||
查看标签信息 | 查看所有tag标签 | git tag | 列出所有已有的标签。也可按照正则表达式列出指定的部分标签。 | |||
查看指定tag信息 | git show 已知标签 | 可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。 | ||||
分享标签 | git push 中心库 --tags | 默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。--tags可一次把所有本地新增标签都推送上去。 |
1.8 | 恢复 | 清除未跟踪(未add)文件 | git checkout -- filename或git checkout . | 恢复工作区文件(如果暂存区有文件就从暂存区恢复,否则从仓库恢复) | ||
清除所有未跟踪(未add)文件 | git clean -dxf | 清除所有未跟踪文件,包括纳入.gitignore中的文件。 | ||||
撤销已修改(已add)文件 | git reset HEAD <文件路径> | |||||
恢复本地工作区内容(相对于本地版本库):已经修改,且已经add,未commit,回退整套代码到最近一次提后的状态 |
|
参数 --hard 表示删除自该次提交后所有的修改记录(未跟踪文件除外),如果需要保留目前的修改,则使用--soft参数。 | ||||
回退至最近几次提交状态 | git reset –hard HEAD ^ (^表示回到上一个版本,如果需要回退到上上个版本的话,将HEAD^改成HEAD^^)(hard选项,表示彻底将工作区、暂存区和版本库记录恢复到指定的版本库) | |||||
回退某次提交 | git revert commitID | 注:此操作将回退某次提交,并作为一次新的提交到库中。 | ||||
1.9 | 比较 | 比较内容区别 | git diff OldCommitID NewCommit ID(前6位) | 比较文件/目录下所有文件修改前后的不同。 注:新添加的文件使用git diff的时候不能显示。 |
repo diff 目标1 目标2 | repo diff实际是对git diff 命令的封装,用于分别显示各个项目工作区下的文件差异。只看着两个目标的区别。 |
git diff | 比较本地的与缓存的区别 | repo diff | 查看所有项目的区别。 | |||
git diff --cached | 比较缓存的与本地库中的区别 |
|
||||
git diff commitID1 commitID2 --文件名 | 对比该文件在特定commit之间的区别 | 同git | ||||
git diff [filename] | 查看文件变化 | |||||
1.10 | 构建 | 发起构建时 | - | repo build CommitID branch | 构建通过就可以正式合入到中心库了。 | |
1.11 | 查看帮助 | 查看帮助文档 | git help | repo help | ||
查看某个命令的帮助文档 | git CMD -help (CMD为add、log等实际命令) | repo CMD -help (CMD为sync、diff等实际命令) |