Git作为当前世界上最好的分布式版本管理工具,从事深度学习少不了写代码,写代码自然有版本控制的问题。特别是在生产环境下,和组里的同事一起协作进行深度学习项目开发时,版本控制和多人协作必然少不了。深度学习算法工程师,咱们的title是工程师,是工程师就必须要有基本的开发能力。所以,Git作为一项必要的开发工具,我们应掌握哪些技术要点呢?
![460d6f1f8eed57924f2146239ed39482.png](https://i-blog.csdnimg.cn/blog_migrate/6765f57e8421f1aa9a1670862cc35fc5.jpeg)
在深入到具体的Git技术之前,我们先来简单了解一下Git。前面也说了Git是世界上最好的分布式版本控制系统(没有之一),那么什么是版本控制系统?相信大家都有过写毕业论文的经历:有时候想删除一段文字,但又觉得可能还会用到,于是就把包含这段文字的版本又另存为一个word,时间一长,各种另存为的新word越来越多,等到你想找回包含某段文字的版本的时候,你的毕业设计文件夹已经变成下面这样。没办法,只能一个个点开看。
![7c83c211d3c07e0da8c903e735b89f9d.png](https://i-blog.csdnimg.cn/blog_migrate/cb60c385c529ba5681726faa7b1058a7.jpeg)
假如要是有这么一个软件,能够帮助我们记录每次修改,并且还能让同学帮我协作修改论文格式,这个软件用起来效果就像下面这样:
版本
文件名
用户
说明
日期
1
毕业设计.docx
小鲁
添加了表索引
5/15 22:38
2
毕业设计.docx
小王
修改了论文格式
5/17 09:22
3
毕业设计.docx
小鲁
修改了文献综述
5/19 23:02
咱们写代码就跟写毕设一样的道理,也需要进行版本控制和多人协作。现在Git就能帮助我们完成这些事情。下面我们就从版本管理、远程仓库、分支管理和标签管理等4个方面来看看我们应掌握哪些技术。
版本管理
Git安装很简单,这里就略过。现在我们有个用keras测试谷歌colab Tesla T4 GPU训练mnist速度的.py文件。我们先把.py文件所在的文件夹变成git可管理仓库:
git init
现在我们把.py文件提交到Git。提交过程有两步:第一步是先通过git add命令把文件提交到暂存区,然后再通过git commit命令把文件提交到版本库:
git add example.pygit commit -m "first commit"
操作效果如下:
![c98c7f74ee70b2ef6c821bbaa2399908.png](https://i-blog.csdnimg.cn/blog_migrate/60780cc5408d800115cba87fbb5bdc88.jpeg)
现在我们对.py文件进行多次修改,并且每一次都提交到了版本库。现在我们用git log命令来查看历史纪录:
![d7a973ba1cf5f3c8ba1a498916152954.png](https://i-blog.csdnimg.cn/blog_migrate/c93b1a213ab1e8d33dfd6fa99e17ff3c.jpeg)
现在我们要回到某个版本,比如说回到上一个版本,查看上图中每一个版本的版本号,通过git reset命令我们做到:
git reset --hard 4bfa7
![360ed3051012f0d0b09510bf05b7a409.png](https://i-blog.csdnimg.cn/blog_migrate/5b7e15bd25bf92837e7e561565011cb7.jpeg)
本质上来说,Git管理的是修改而非文件。除了简单的版本回退之外,我们还可以利用Git进行修改撤销、删除文件等版本管理功能。
远程仓库
如果仅仅是进行版本管理,那Git与其他版本管理工具也并没有多少特别之处。Git与SVN等版本管理工具一大优势就是Git除了本地版本库之外,还可以连接远程库从而实现分布式管理。Git远程库就是大家都知晓的GitHub,GitHub可以为Git本地仓库提供代码托管服务,只要注册GitHub账号,就可以免费获得Git远程仓库。
![61ddcaa90403df9cc6f30e8bdc1094b4.png](https://i-blog.csdnimg.cn/blog_migrate/7c98f3975bfd0dc4dea2d84db6ed598f.jpeg)
本地Git和GitHub连接是需要设置SSH的,这里简单略过。设置好后,在GitHub上创建同名字的仓库:
![8c50b961f92868dbb137ae4f0ed33b0c.png](https://i-blog.csdnimg.cn/blog_migrate/ee2cb3f3d823eee6afa031da2c8efa22.jpeg)
就可以将本地的Git仓库推送到GitHub上:
git remote add origin https://github.com/luwill/kera_mnist.gitgit push -u origin master
除了向远程库推送本地版本库之外,我们还可以从远程库克隆代码仓库到本地:
git clone https://github.com/luwill/Python-100-Days.git
![f449ab25ff834ef36ce6ddb0858aa2e8.png](https://i-blog.csdnimg.cn/blog_migrate/2f2af1e56f95aaabe4a8fa780619fe20.jpeg)
除了GitHub之外,我们也可以使用Gitlab或者Gogs作为团队开发版本管理工具。
![7e4b1e5f7b62106c69edc9513d2ca9cf.png](https://i-blog.csdnimg.cn/blog_migrate/f74708a86247a4095a62543135cc167f.jpeg)
分支管理
Git另一项强大的功能就是可以创建分支并进行分支管理。Git可以把我们每次提交串成一条线,而初始化的分支也就是master分支,也叫主分支。但一般来说,团队开发时我们不在主分支上干活,而是创建一个dev的分支来进行开发任务。
创建一个dev分支并切换到该分支,然后用git branch查看当前分支:
git checkout -b devgit branch
![f50d25c6acc0daf684d137ff5bc74f01.png](https://i-blog.csdnimg.cn/blog_migrate/4a07bf11716dc53c1ec339ff8c8939fa.jpeg)
我们在dev分支上对.py文件进行修改后提交:
![0e25941f0f933a9300b85c7ee83e64f4.png](https://i-blog.csdnimg.cn/blog_migrate/99c16a4a10da13231561500a6eae70c0.jpeg)
然后我们切换回master主分支:
git checkout master
但此时我们可以发现刚刚修改的内容并没有看到。这是因为我们刚刚时在dev分支上做的修改,master分支并没有涉及到提交点。现在我们需要把dev分支合并到master分支里:
git merge dev
![3f501bf1a30eaf59f78f278d218420b1.png](https://i-blog.csdnimg.cn/blog_migrate/247a9d24f72580630726485bbf6a451e.jpeg)
合并之后我们也可以选择删除dev分支。
这便是Git的分支管理功能。当然我们只是演示了最简单的部分,在进行分支合并的时候也有可能出现合并冲突,这时候需要手动解决冲突才能继续合并。还有一些比如说在Bug分支进行Bug修改,在Feature分支上开发新功能和多人协作等这里不做过多展开。
标签管理
我们利用git进行提交的时候都会有commit号:
![2da8fb66273dafaa9dab1082f19b1644.png](https://i-blog.csdnimg.cn/blog_migrate/48e0597285bbdc2bf2b2efc6b085cd8c.jpeg)
通过commit号我们可以找到历史版本。但commit号都是一串数字字母组合,不易表述和记忆。Git对此也有代替方法,那就是标签管理。我们可以对每个版本打上简洁的标签:
git tag v1.0
![3b590991e0305ecd37c8bf1683749b3f.png](https://i-blog.csdnimg.cn/blog_migrate/688376e2ca7c932da283e87f3f0e9e8f.jpeg)
这个标签是默认打在最近一次commit上的。我们也可以根据commit号进行指定来打标签。
通过标签来查看版本的历史信息:
![5039474c1c50242c3e29a5ef5cee298a.png](https://i-blog.csdnimg.cn/blog_migrate/f1bc5e1a1830e38a208e2f40644c7396.jpeg)
除了以上操作之外,我们也可以删除标签或者将标签推送到GitHub上。
以上便是深度学习开发者应掌握的一些基本的Git开发技术。完整的Git教程,推荐大家参考廖雪峰老师的官方网站:
https://www.liaoxuefeng.com/wiki/896043488029600
Git命令脑图:
![5c9a50ba5afe5cfbb69516e56b0508d9.png](https://i-blog.csdnimg.cn/blog_migrate/16d90f39cb13d5c70cd1064335021f65.jpeg)
还有一份Git命令小抄表:
![4efa9c8f924c719e6571ff019323f770.png](https://i-blog.csdnimg.cn/blog_migrate/a68750da7ed1f92df00cb458ca97361d.jpeg)
参考资料:
https://www.liaoxuefeng.com/wiki/896043488029600