使用Git保护你的代码
Git介绍
Git是一个分布式版本控制系统,很多高级功能,团队协作中更是不可缺少它。实际上我们在这里使用Git的目的就是作为代码备份,操作是比较简单的,具体教程可以看廖雪峰的免费Git教程:
初始化完毕之后,一般都是三部曲:
1 | # 从工作区添加到stage暂存区 |
- Git分为工作区和版本库两个区域,版本库里面又划分了一个暂存区的区域。
每个Git的项目文件夹下,除了隐藏的
.git
文件夹,这个文件夹之外的其他区域都属于工作区。一般的工作流程:工作区的文件需要添加到Git的暂存区(git add),随后再提交到Git的版本库(git commit)。首次新建的文件都是untracked状态(未跟踪),此时需要git add到暂存区,Git便会在暂存区中生成一个该文件的索引,文件此时处于uncommited状态,需要git commit生成版本库。添加到了版本库之后,再对文件进行修改,那么文件的状态会变为unstaged状态。
“所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。”
R语言中的数据RData也是二进制文件,所以也无法使用版本控制系统进行追踪。所以Rstudio生成的.gitignore文件默认也是忽略.RData文件的。
基本配置
下面演示一下如何在Rstudio中使用Git
1. 新建R项目
在R Studio里面新建一个项目,新建项目时记得勾选Create a git repository。
2. 配置版本控制
如果第1步勾选了“Create a git repository”,则可以跳过这一步。已有项目引入Git,也可以按照这个方法操作。
版本控制系统设置为Git并初始化仓库。(配置这个需要重启Session,请保存好自己的数据)
3. 新建仓库
如果没有账号则注册账号:
Gitee(国内的仓库,中文界面,速度较快):https://gitee.com/
GitHub(国外的仓库,英文界面),https://github.com/([注册教程](https://www.jianshu.com/p/21a1558549cc))
4. 关联远程仓库
5. 配置用户名和邮箱(配置一次就行)
告诉git你是谁,只需要配置一次即可
1 | git config --global user.email "you@example.com" |
6. SSH配置(配置一次就行)
你推送代码到仓库的凭证
- 生成密钥,复制到粘贴板备用
1 | # 先看看是否已有密钥 |
- github配置SSH公钥
7. 配置忽略的文件❗❗❗❗❗
Github免费用户单个仓库只有500MB的空间,所以只能用来保存一些关键的数据或者代码,我们在推送的时候,需要在
.gitignore
文件指出需要忽略哪些文件或者目录。
- 如果你是将原有的项目上传到Git上面,需要新建data/input,data/ouput目录,分别作为输入输出目录,便于统一管理。
8. Add、Commit
- 界面方式
- 命令行方式
1 | git add . |
9. 推送
- 命令行方式
1 | git push --set-upstream origin master |
第一次命令行推送完毕后,后续也可以界面操作
此时代码已经推送到远程仓库~
- 如果此时你误删了数据,可以
git checkout .
恢复,或者界面操作
常见问题
使用账号密码推送远程仓库时报错
这是因为Github不支持账号+密码的验证方式了,请使用SSH作为登录凭证。
误操作把大文件add、commit、push了怎么办
下面的操作需要分为几种情况
只是add了
- 当你add的时候有一个大块头文件时,add命令执行完毕也要花很长时间,这时候你就要意识到不对劲了。
- add后,使用
git status
查看一下状态,看看哪些文件被添加了。
1 | 拿上面的例子来说:首先,我们需要编辑.gitignore文件,加上忽略iso文件的规则 |
- 如果你没有运行
git gc --prune=now
你会发现,虽然文件没有被推送到远程仓库,但是还在本地仓库里面
add且commit了,但是没有push上去
- 实验场景
- 回到add之前的版本
- 新增.gitignore配置,重新add、commit
- 清理
1 | git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@" |
add且commit了,且push到远程仓库了
- 可以使用BFG工具清理文件,官网,此处不展开
1 | wget https://maven.aliyun.com/repository/public/com/madgag/bfg/1.14.0/bfg-1.14.0.jar |
三部曲都有点烦,可以再简化吗?
可以使用脚本来简化一下,将下面的push.sh文件放到项目的根目录下即可
1 | git add . |
1 | # 使用 |