向Git前进(二) | GitLab项目开发流程
Photo by David Marcu
on Unsplash
前言
在虚拟机里安装完了GitLab,报告上去,管理员在公司内部服务器也配置好了,接下来整理Git开发流程。
安装Git for Windows
- 下载
- 选择安装目录
- select Components
3.1 勾中Windows Explorer Intergration/Simple Content Menu(Gui+Bash)
3.2 勾中关联.git*,.sh等 - 选择Run Git from the Windows Command Prompt
- 选择Checkout as-is, commit as-is
- 安装
配置SSH
- 进入Git Bash
- 检查是否含有.ssh/id_rsa文件
2.1 有则复制id_rsa.pub内公钥文本
windows下cat ~/.ssh/id_rsa.pub
后复制命令行,或clip < ~/.ssh/id_rsa.pub
linux下xsel < ~/.ssh/id_rsa.pub
mac下pbcopy < ~/.ssh/id_rsa.pub
2.2 没有则创建,一路回车,执行2.1ssh-keygen -t rsa -C "EMAIL@E.C"
- 将复制的ssh的public key放入项目
3.1 github.com-右上角头像-Settings-侧边栏SSH and GPG keys-New SSH Key
3.2 gitlab-右上角头像-Settings-顶部SSH Keys-Add Key - 设置全局变量
git config --global user.name "name"
git config --global user.email "mail@box.com"
创建项目或拉取项目
- 初始化路径
git init
- 将GitLab SSH路径添加为origin
git remote add origin git@*.*.*.*:GROUP/PROJECT.git
将Github路径添加为origingit remote add origin git@github.com/USERNAME/REPOSITORY.git
2.1 假如路径添加有误可删除后重加git remote remove origin
2.2 或修改路径git remote set-url origin NEW_PATH
2.3 检查已经设定的路径git remote -v
- 添加文件提交并上传或拉取目录
3.1 【创建】git add .
git commit -m "Initial commit"
git push origin master
第一次上传需要添加-u
或--set-upstream
参数
3.2 【拉取】git pull
跟踪空目录
由于git只跟踪文件而不跟踪目录,所以假如要将一个空目录加入追踪,该目录下必须有至少一个文件。
假如空目录是为了保持项目的整洁性而存在的,比如Runtime
或Temp
。
该类目录下可放入一个.gitignore
,里面写入
假如空目录是为了留出给即将创建的文件,则可放入一个空的.gitkeep
,这是为了与gitignore区分。
在目录下搜索空的并且没有gitignore占位文件的目录并创建一个空的.gitignore
:find . \( -type d -empty \) -and \( -not -regex ./\.git.* \) -exec touch {}/.gitignore \;
或只搜索空的并且没有gitignore占位文件目录:find . \( -type d -empty \) -and \( -not -regex ./\.git.* \);
项目开发流程
- 配置git并拉取master,每次push前都pull一下防止失败
git pull
- 查看分支
git branch
2.1 没有分支则创建并切换分支git checkout -b NEW_BRANCH
2.2 有分支则切换分支git checkout BRANCH
- 在分支中开发,提交
git status
查看可添加的文件git add .
添加文件git diff --cached --name-only
查看已添加的文件git commit -m "MSG"
提交并输入信息git push origin --set-upstream BRANCH
上传 - [网页]发起Merge Request
- [网页]项目master通过MR请求
5.1 或删除分支git branch --delete BRANCH
注:在GitLab默认权限管理中,只有Owner和Master才能对项目的master分支进行push,其他身份(比如developer)对master进行push操作会被驳回。
修改bug流程
- 从master创建并切换分支
git checkout -b issue-NAME master
- 在issue分支中修复bug
- 将issue分支合并到master
git checkout master
git merge issue-NAME
- 提交master
git push
分支开发过程中,主线有紧急修改需要合并
- 合并前先提交
git add .
git commit -m "MSG"
- 切换到master,拉取最新
git checkout master
git pull
- 查看需要合并的commit id
git log --oneline
- 记下commit id,切换到分支,摘樱桃
git checkout BRANCH
git cherry-pick COMMIT_ID
回滚
- 樱桃摘错了怎么办?
1.1 查看版本日志git log --oneline
1.2 使用revert回退版本,并编辑回退消息git revert COMMIT_ID
1.3 回退完成查看日志 - 一个否认历史的做法,不建议在多人合作开发中使用
git reset --hard COMMIT_ID
退回版本
===继续开发===git push -f
force提交
分支管理
- 查看所有分支
git branch -a
在Git Bash中,跟踪的远程分支显示为红色,当前分支显示为绿色,其他分支显示为白色。 - 删除跟踪的远程分支
git push origin :REMOTE_BRANCH
2.1 可能会遇到跟踪的远程分支删除不了的情况,
使用git fetch -p
来清除,参照此处
注:按照git手册上-p -prune
的说明
该命令可以去除所有本地在跟踪的且远程不存在的远程分支。 - 删除本地分支
git branch -d LOCAL_BRANCH
3.1 假如出现error: The branch 'store' is not fully merged.
If you are sure you want to delete it, run 'git branch -D store'.
则按照提示,运行git branch -D LOCAL_BRANCH
展示一下删干净的分支列表
打包更新文件
git archive -o update.zip NEW_ID $(git diff --name-only OLD_ID NEW_ID)
git archive -o update.zip HEAD $(git diff --name-only OLD_ID HEAD)
下一步
向Git前进(三) | 稀疏检出sparse checkout
Reference
关于 GIT 生成更新包的问题 - v2ex
Git 如何从某个Commit后导出所有修改过的文件? - ruby-china
How to undo ‘git add’ before commit? - so
what is the difference between origin/master vs origin master? - so
Git for Windows安装和基本设置 - vitah
Gitflow工作流 - oldratlee
拷贝复制命令行 - oldratlee
git 回退到某版本后,再在此版本上更新,无法 push - ruby-china
用git 保存空目录 - zhaodezhong
How can I add an empty directory to a Git repository? - so