git教程
1. 问题背景?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。 看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。 多人合作写一篇文档的时候需要把你的改动和她的部分合并,真困难。
2. 解决方案?
解决方法:于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便? 这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 用户 说明 日期
1 张三 删除了软件服务条款5 7/12 10:38
2 张三 增加了License人数限制 7/12 18:09
3 李四 财务部门调整了合同金额 7/13 9:51
4 张三 延长了免费升级周期 7/14 15:17
这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
3. 经典流程
- 创建版本库
- 扫描修改
- 缓存修改
- 提交修改 对应的git-gui讲解:
重复2.3.4就会形成一条版本线。单击每个版本节点,可以很容易的知道修改了第几行,添加了哪些文件。
4. 背后原理
- 为什么要执行add然后提交?
工作区 暂存区 带指针的树形仓库
- 存储机制—为什么Git比其他版本控制系统设计得优秀?因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
5. 版本切换
- 查看修改 绿色为新加的,红色为旧的
- 版本选择
- 在想要的版本上,鼠标右击,选中reset,hard reset 既可以在版本库中穿梭
6. 本地分支管理
- 分支管理的意义—协同工作
- checkout 创建和切换分支
- merge用于合并分支
- 冲突解决
7. 远程管理
先用git clone来下载远程项目的全部文件
如果觉得本地文件不是很新,远程项目可能已经更新,使用fetch命令获得更新,然后merge与本地文件混合。
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并。
- pull命令相当于fetch+merge,prune删除远程已经删除的分支。
- 用push 进行上传
与远程github项目进行关联
- git remote add origin git@github.com:username/repo.git
- 然后可以git push origin master (origin表示远程)
8. 远程多人合作流程
因此,多人协作的工作模式通常是这样:
1. 首先,可以试图用git push origin branch-name推送自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;pull(fetch+merge)
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
5. 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name。 这就是多人协作的工作模式,一旦熟悉了,就非常简单
9. 管理github项目
- 生成ssh key
- 在自己的git账号上添加ssh key
- git clone 把整个项目拷贝下来
- git push 上传到远程
github上的fork相当于复制仓库
Pull request 将自己改动合并到原始库,做贡献, (需要原始库维护者的同意)
- 参考网站 https://guides.github.com/activities/hello-world/
10. 总结
操作git-gui来进行回顾!!
- 本地管理 创建(init) 检测改动(status) 缓存(add) 提交(commit) 查看改动(diff) 版本切换(reset -hard)
- 分支管理 新建 融合(merge)删除 分支切换(checkout)
- 远程管理 克隆(clone) fetch(引入) push(推送或上传) pull(fetch+merge) (净化)prune
好处
- 不再需要备份多个文件
- 添加到版本库
- 多人合作变的方便,同步
- 分支管理与合并
- 监督每个人的代码提交量 修改量
- 查看修改功能
- 查看修改功能
- 不再需要备份多个文件