# Gitlab使用实践及总结
## 正常流程
- 首先,在 gitlab 上 fork 一个项目,放在自己名下,得到 **自己项目** 的SSH
- 将 **自己项目** 下到本地:
```
$ git clone ssh://git@gitlab.xxxxx
```
- 进入项目所在文件夹,输入下列指令:
```
$ git remote add gitlab ssh://git@gitlabxxxxxxx.git
```
注意此处的ssh是 **原始项目** 的ssh,
这里创建的名为gitlab的remote库的意义: 对其使用fetch和rebase,这样在push自己的commit之前,本地的代码库能保持最新并且和远端没有冲突。
- 可以使用`git remote -v`来查看创建的remote库,结果如下:
```
gitlab ssh://git@gitlab.xxxxx.git (fetch)
gitlab ssh://git@gitlab.xxxxx.git (push)
origin ssh://git@gitlab.xxxxxxxx.git (fetch)
origin ssh://git@gitlab.xxxxxxx.git (push)
```
- `git fetch gitlab`,更新gitlab的信息
如果不这么做,`git checkout gitlab/master -b new_branch`时会报错:
```
fatal: 'gitlab/master' 不是一个提交,不能基于它创建分支 'new_branch'
```
- 更新之后,创建分支:
```
分支 'new_branch' 设置为跟踪来自 'gitlab' 的远程分支 'master'。
切换到一个新分支 'new_branch'
```
可以看到自动切换到了新创建的分支,可以通过`git branch -a`来查看所有分支
- 在往项目中添加了新文件之后,要先add一下:`git add 1.md`,要是只是改动了文件则不需要
- 做出更改之后,commit自己的更改,一般要使用`-m`添加说明:
```
$ git commit -m "what did i do"
```
- 在push之前,要先确认自己本地的库是最新的且没有冲突:
```
$ git fetch gitlab
$ git rebase gitlab/master
```
- 确认之后,就可以提交commit了:
```
$ git push origin new_branch
```
通过上面的命令可以看到,在`git fetch`和`git rebase`时,是基于名为gitlab的remote库,而push时,则是push到origin中。因为项目有很多人开发,所以更新代码时要以 **原始项目** 为准,上传时则是先上传到 **自己项目** 中去,待code review后再merge到 **原始项目** 中。
- push了commit之后,即可在gitlab上发起merge request,等review通过之后即可。
## 特殊情况
- `git rebase` 之后,`git status` 发现有冲突:
先将冲突搞定(到编译器中、或者用记事本里修改),然后将有冲突的文件重新 `git add` 一下,最后`git rebase --continue`即可,然后就可以push了。
- code review后需要改动:
改完之后 `$ git commit --amend -a` ,若是不需要改commit的message就 `$ git commit --amend -a --no-edit` ,然后 `git push -f`(强制修改,作用和下文的--force一样)即可。
- push了commit但是后悔了:
```
$ git reset --hard <版本号>
// 注意使用 --hard 参数会抛弃当前工作区的修改
// 使用 --soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交
```
比如merge request发现有三个commit,但是一般只应该有一个,就可以`$ git reset --soft HEAD~2`,即保存修改的情况下,将最新的两个commit删掉,剩下一个commit。
回退版本后,**一定要记得amend** 改动才会合并到之前的那个commit里,不然又会新建一个 commit 哦。。:
```
$ git commit -a --amend --no-edit
```
然后push时要记得加`--force`不然会说你本地版本太低:
```
$ git push origin add-config-mailbox --force
```
现在就可以merge request了。