正常流程
- 首先,在 gitlab 上 fork 一个项目,放在自己名下,得到 自己项目
- 将 自己项目
$ git clone ssh://git@gitlab.xxxxx
- 进入项目所在文件夹,输入下列指令:
$ git remote add gitlab ssh://git@gitlabxxxxxxx.git
注意此处的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
- 做出更改之后,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
- push了commit但是后悔了:
$ git reset--hard <版本号>
// 注意使用 --hard 参数会抛弃当前工作区的修改
// 使用 --soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交
比如merge request发现有三个commit,但是一般只应该有一个,就可以$ git reset
回退版本后,一定要记得amend
$ git commit -a --amend --no-edit
然后push时要记得加--force不然会说你本地版本太低:
$ git push origin add-config-mailbox --force
现在就可以merge request了。