写这篇blog的初衷是,在带教新人使用sourcetree+gitlab管理脚本时,发现自己磕磕巴巴无力解释清楚Git是个什么鬼,因此决定系统学习并以文章的形式整理下助消化。
拜读了廖雪峰的《Git教程》,非常浅显易懂,也可以按目录检索章节内容,耗费一小时左右阅读时间就能把Git的使用安排得明明白白。所以这篇文章并不再搬运或者是再诠释其中的内容,而是按我个人的思考和阅读习惯,写一个浓缩简短版的使用指南。
Why Git
Git 至少解决了版本管理和多人协作两个问题。
- 版本管理:相当于后悔药了,在关键节点及时保存和提交版本,写好版本注释,就能任意返回之前的某一个版本。不过分析师写的SQL一般都不复杂,所以不太需要多个版本。
How it Works
工作区 -> 暂存区:通过git add <filename>
提交工作区的文件修改到版本库的暂存区。暂存区的目的就是跟踪修改。
- 如果要撤销工作区的修改,通过
git checkout -- <filename>
使其退回到已添加到暂存区的状态,如果文件未添加到暂存区,则撤销退回到和版本库一样的状态。
暂存区 -> 分支:通过git commit -m <message>
提交到暂存区的所有修改到master或其他的分支上。
如果未提交版本,要撤销暂存区的提交,通过
git reset Head <filename>
把暂存区的修改返回到工作区。如果已提交版本,通过
git reset --hard Head^
返回上一个版本,或通过git reset --hard <commit id>
返回之前的任一版本、或重回“未来”的版本。<commit id>
可通过git log
和git reflog
来查询提交历史和命令历史。emmmm传说这个命令不要轻易用...
Branch
创建分支:通过git checkout -b dev
创建并切换到dev分支上。以上语句实际可拆分成两句。
-
git branch <branchname>
创建一个分支 -
git checkout <branchname>
切换到一个分支上,有别于撤销工作区修改的语句`git checkout -- <filename>,注意区分
合并分支:通过git merge <branchname>
合并某分支到当前分支上
解决冲突:遇到版本冲突的无法自动合并的,需要手动解决冲突,重新提交修改。多人协作中,可按以下步骤尝试:
- 先使用
git push origin <branchname>
推送自己的修改 - 如推送失败,说明远程分支比本地分支更新,需要用
git pull
拉取并合并 - 如合并失败,需要手动解决冲突,再次使用
git push origin <branchname>
推送