工作使用 git 和 gerrit, 记录一下操作, 为以后再次使用提供便利.
Gerrit详情
Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统,Git作为底层。
注册 添加邮件以及 ssh (需要git生成 ssh-dss)
生成 ssh1
2
3$ ssh-keygen -t dsa //生成 ssh
$ cat ~/.ssh/id_dsa.pub //获得 ssh, 将该 ssh 粘贴至 gerrit 中
$ vi ~/.ssh/known_hosts //将 gerrit 中的该值, 粘贴至该文件中
获取代码库
登录Gerrit后在Projects => List, 选择相应工程your_project,进入该工程的General界面。
选中“clone with commit-msg hook”和“SSH”:
由管理员提供这个 clone 地址
git clone 克隆至 master, 创建一个 dev 分支, 通过下面的两个命令, 创建分支1
2$ git clone url //clone 远程代码
$ git checkout -b dev //创建分支并切换至 dev 分支git本地设置
本地的 git 用户名登录和邮箱需要和 gerrit 的一致, 不然在 push 时会出现问题.
git 有全局配置文件, 本地配置文件, 可以在项目下修改本地配置文件配置本地用户名和邮箱
1
2
3$ git config -l 查看 git 配置文件
$ git config user.name "name" 修改本地用户名
$ git config user.email "XXX@XXX.com" 修改本地邮箱设置默认 push
当执行push命令时,需要将代码我们需要push到refs/for/dev 那条线上
编辑本地 git config 文件1
$ vim .git/config
在 [remote “origin”] 中添加这一行添加如下内容
1
push = +refs/heads/*:refs/for/*
也可以通过如下方法设置( 使用该命令报错了, 所以我是手动添加的):
1
$ git config origin.remote.push refs/heads/*:refs/for/*
这样,push代码时,可以直接使用git push origin branch名称将代码提交到gerrit
1
$ git push origin dev //push 代码
如果不设置,需要使用如下方式来提交到远程dev分支
1
$ git push origin HEAD:refs/for/dev
提交代码后添加审核人员以及提交后的状态
在获取代码前, 保证本地代码与远程的版本一致
在工作中, 在版本不一致时, 导致了无法入库的问题. 现在仔细想一下, 版本不一致就提交, 会造成提交的混乱, 版本号的混乱, 当然不允许如此操作.
在版本号不一致时, 提交了, 解决步骤:- 要取消提交
- 将本地版本回退至你提交的几个版本的前一版本(如你提交了好几次, 要回退至于远程仓库一致的版本)
- 然后再拉一下代码, 保证最新版本与远程一致
- 再次提交
1
2
3
4
5$ git reset commit_id
$ git status //发现刚提交的内容全部又在工作区
$ git pull origin dev //再次拉下代码
$ git add
$ git commit -m "some message"
git 一些用法
从 master
分支创建feature-A
分支和 feature-B
分支, 并合并
在分支操作时, 没弄明白工作区, 缓存区, 仓库的概念, 就在分支切换时修改代码, 然后直接切分支, 就发现分支之间代码都一样, 整了好半天也不知道什么原因, 这就促使我从头再学习一遍 git, 看了廖雪峰老师的 git教程 , 非常浅显易懂
下面就把常用操作记录一下
创建 feature-A 分支, 并处于 feature-A 分支下
1
$ git checkout -b feature-A
使用
git branch
查看分支一览表1
2
3$ git branch
* feature-A //*表示当前所处分支
master在 feature-A 分支下修改READEME.md 文件, 并添加 commit 快照, 即存到仓库中
1
2
3
4
5
6$ git add READEME. md
$ git commit -m "add feature-A"
//与上一次提交合并在一起, 会生成新的 commitId, git log 中只显示最新的 commitId, 且只有一条提交 log;
//也可以使用 git commit --amend 会出现使用 vi 打开的文件, 在里面进行 message 的编辑, 但是我一直没有成功过(先记录一下)
$ git commit --amend -m "message"再切回
master
分支, 查看README.md没有发生变化
(如果不进行3操作, 直接切换到 master 分支, feature-A的内容也会到 master 分支, 原因是工作区内容没有分支区分, 工作区只有一个, 所有分支公用的一个)1
$ git checkout master
合并分支
1
2$ git merge --no-ff feature-A
$ git add conflictFile //解决完冲突后, 要 git add 一下冲突文件, 才可以再次进行 git pull/checkout 等等操作查看提交日志(git commit -m “日志内容”)
1
$ git log -1 //查看日志个数
以图表的形式查看分支
1
$ git log -graph
回溯至 feature-A 某一版本, 创建分支feature-B
1
$ git reset --hard 9104c361a2e6531fed0ca606a52ade5cbfc0d354
创建分支 feature-B
1
$ git checkout -b feature-B
在 feature-B 分支下修改READEME.md 文件并保历史记录, 添加至本地仓库
1
2$ git add README. md
$ git commit -m "branch feature-B"将 featur-B 分支内容回退到 feature-A 分支 并合并分支
1
2
3
4$ git reflog
$ git reset --hard 9104c36
$ git merge --no-ff feature-B解决冲突后执行,
git add
,git commit
删除分支
1
2$ git branch -d feature-A 该分支已合并
$ git branch -D feature-A 该分支未合并删除 git 仓库中的文件
1
2
3$ git rm --cached [filename] || git rm -r --cached [directory]
$ git commit -m 'remove useless files'
$ git push -u origin丢弃工作区修改
工作区修改内容, 想放弃修改, 回退至修改前. 有两个状态, 回退至已添加到缓存区或仓库的版本1
$ git checkout -- file
回滚已提交的版本
1
2$ git reset --hard commit_id //回滚至 commit_id 版本
$ git reset --hard HEAD~n //回滚至上 n 版本, n 是数字清除缓存区内容, 重新放回工作区
1
$ git reset HEAD file
删除文件
从版本库删除文件1
2$ git rm file //删除工作区文件, 并添加至缓存区
$ git commit -m "delete some file"找回删除文件
1
2
3$ git reset HEAD file //清除缓存信息
$ git checkout -- file //找回删除文件(未提交至版本库)
$ git reset --hard HEAD^ //已经提交至仓库的, 只能通过 reset 回退(已提交至版本库)或 本地手动删除
1
2$ rm file //删除工作区文件(1)
$ git commit -a -m "commit log" //添加至缓存区, 并提交至版本库(2)删错了, 版本区有该文件, 将工作区内容回滚至与版本区内容一致
1
2$ git checkout -- file //只执行了(1)
$ git reset --hard HEAD^ //执行了(2)即已经提交至仓库的,只能通过 reset 回退(已提交至版本库)