正常流程
首先,在 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了。