Git介绍
-
Git是一个分布式版本控制系统,很多高级功能,团队协作中更是不可缺少它。实际上我们在这里使用Git的目的就是作为代码备份,操作是比较简单的,具体教程可以看廖雪峰的免费Git教程:
-
初始化完毕之后,一般都是三部曲:
# 从工作区添加到stage暂存区
git add .
# 从暂存区提交到当前分支
git commit -m "备注"
# 推送到远程仓库
git push
- 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/(注册教程)
4. 关联远程仓库
5. 配置用户名和邮箱(配置一次就行)
告诉git你是谁,只需要配置一次即可
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
6. SSH配置(配置一次就行)
你推送代码到仓库的凭证
- 生成密钥,复制到粘贴板备用
# 先看看是否已有密钥
cat ~/.ssh/id_rsa.pub
ssh-keygen -t rsa -C "you@example.com"
# 确认一下,然后复制到粘贴板
cat ~/.ssh/id_rsa.pub
- github配置SSH公钥
7. 配置忽略的文件❗❗❗❗❗
Github免费用户单个仓库只有500MB的空间,所以只能用来保存一些关键的数据或者代码,我们在推送的时候,需要在
.gitignore
文件指出需要忽略哪些文件或者目录。
- 如果你是将原有的项目上传到Git上面,需要新建data/input,data/ouput目录,分别作为输入输出目录,便于统一管理。
8. Add、Commit
- 界面方式
- 命令行方式
git add .
git commit -m "test1"
9. 推送
- 命令行方式
git push --set-upstream origin master
-
第一次命令行推送完毕后,后续也可以界面操作
-
此时代码已经推送到远程仓库~
- 如果此时你误删了数据,可以
git checkout .
恢复,或者界面操作
常见问题
使用账号密码推送远程仓库时报错
这是因为Github不支持账号+密码的验证方式了,请使用SSH作为登录凭证。
误操作把大文件add、commit、push了怎么办
下面的操作需要分为几种情况
只是add了
- 当你add的时候有一个大块头文件时,add命令执行完毕也要花很长时间,这时候你就要意识到不对劲了。
- add后,使用
git status
查看一下状态,看看哪些文件被添加了。
拿上面的例子来说:首先,我们需要编辑.gitignore文件,加上忽略iso文件的规则
然后执行命令
git rm -r --cached 你要忽略的文件
# 清理垃圾
git gc --prune=now
git add .
git commit -m "xxx"
# 推送到远程仓库
git push origin main
- 如果你没有运行
git gc --prune=now
你会发现,虽然文件没有被推送到远程仓库,但是还在本地仓库里面
add且commit了,但是没有push上去
- 实验场景
- 回到add之前的版本
- 新增.gitignore配置,重新add、commit
- 清理
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工具清理文件,官网,此处不展开
wget https://maven.aliyun.com/repository/public/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
三部曲都有点烦,可以再简化吗?
可以使用脚本来简化一下,将下面的push.sh文件放到项目的根目录下即可
git add .
if [ "$1" ]; then
msg=$1
else
msg="update code at `date`"
fi
git commit -m "$msg"
git push origin master
# 使用
sh push.sh "XX修改"
# 不包含commit信息,那么脚本会自动添加commit信息
sh push.sh
附录
https://juejin.cn/post/7024922528514572302
https://www.cnblogs.com/cposture/p/git.html