Git介绍

  • Git是一个分布式版本控制系统,很多高级功能,团队协作中更是不可缺少它。实际上我们在这里使用Git的目的就是作为代码备份,操作是比较简单的,具体教程可以看廖雪峰的免费Git教程

  • 初始化完毕之后,一般都是三部曲:

1
2
3
4
5
6
7
8
# 从工作区添加到stage暂存区
git add .

# 从暂存区提交到当前分支
git commit -m "备注"

# 推送到远程仓库
git push
  • Git分为工作区和版本库两个区域,版本库里面又划分了一个暂存区的区域。

img

  • 每个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。

img

2. 配置版本控制

如果第1步勾选了“Create a git repository”,则可以跳过这一步。已有项目引入Git,也可以按照这个方法操作。

版本控制系统设置为Git并初始化仓库。(配置这个需要重启Session,请保存好自己的数据)

imgimg

3. 新建仓库

如果没有账号则注册账号:

Gitee(国内的仓库,中文界面,速度较快):https://gitee.com/

GitHub(国外的仓库,英文界面),https://github.com/([注册教程](https://www.jianshu.com/p/21a1558549cc))

img

img

4. 关联远程仓库

img

5. 配置用户名和邮箱(配置一次就行)

告诉git你是谁,只需要配置一次即可

1
2
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

img

6. SSH配置(配置一次就行)

你推送代码到仓库的凭证

  • 生成密钥,复制到粘贴板备用
1
2
3
4
5
6
7
# 先看看是否已有密钥
cat ~/.ssh/id_rsa.pub

ssh-keygen -t rsa -C "you@example.com"

# 确认一下,然后复制到粘贴板
cat ~/.ssh/id_rsa.pub

img

img

  • github配置SSH公钥

img

7. 配置忽略的文件❗❗❗❗❗

Github免费用户单个仓库只有500MB的空间,所以只能用来保存一些关键的数据或者代码,我们在推送的时候,需要在.gitignore文件指出需要忽略哪些文件或者目录。

  • 如果你是将原有的项目上传到Git上面,需要新建data/input,data/ouput目录,分别作为输入输出目录,便于统一管理。

img

8. Add、Commit

  • 界面方式

img

imgimg

  • 命令行方式
1
2
3
git add .

git commit -m "test1"

9. 推送

  • 命令行方式
1
git push --set-upstream origin master

img

  • 第一次命令行推送完毕后,后续也可以界面操作

    • img
  • 此时代码已经推送到远程仓库~

img

  • 如果此时你误删了数据,可以git checkout .恢复,或者界面操作

img

常见问题

使用账号密码推送远程仓库时报错

这是因为Github不支持账号+密码的验证方式了,请使用SSH作为登录凭证。

img

误操作把大文件add、commit、push了怎么办

img

下面的操作需要分为几种情况

只是add了

  • 当你add的时候有一个大块头文件时,add命令执行完毕也要花很长时间,这时候你就要意识到不对劲了。

img

  • add后,使用git status查看一下状态,看看哪些文件被添加了。

img

1
2
3
4
5
6
7
8
9
拿上面的例子来说:首先,我们需要编辑.gitignore文件,加上忽略iso文件的规则
然后执行命令
git rm -r --cached 你要忽略的文件
# 清理垃圾
git gc --prune=now
git add .
git commit -m "xxx"
# 推送到远程仓库
git push origin main

img

  • 如果你没有运行git gc --prune=now你会发现,虽然文件没有被推送到远程仓库,但是还在本地仓库里面

img

img

add且commit了,但是没有push上去

  • 实验场景

imgimg

  • 回到add之前的版本

img

  • 新增.gitignore配置,重新add、commit

img

  • 清理
1
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@"

img

add且commit了,且push到远程仓库了

  • 可以使用BFG工具清理文件,官网,此处不展开
1
wget https://maven.aliyun.com/repository/public/com/madgag/bfg/1.14.0/bfg-1.14.0.jar

img

三部曲都有点烦,可以再简化吗?

可以使用脚本来简化一下,将下面的push.sh文件放到项目的根目录下即可

1
2
3
4
5
6
7
8
9
10
11
git add .

if [ "$1" ]; then
msg=$1
else
msg="update code at `date`"
fi

git commit -m "$msg"

git push origin master
1
2
3
4
5
# 使用
sh push.sh "XX修改"

# 不包含commit信息,那么脚本会自动添加commit信息
sh push.sh

附录

https://juejin.cn/post/7024922528514572302

https://www.cnblogs.com/cposture/p/git.html