Git学习笔记

140 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Git这东西长时间不用果然忘了很多,还是好好记录一下,对抗遗忘,本篇博客会尽量记录常用的指令

写在前面

SVN和Git在公司里都是很常用的工具,SVN是服务器控制版本,本地只能查看,之前在公司是记录日报和各种会议记录用的,一般这种记录本地不需要保存全部版本,所以放在公司的服务器上更合适。而Git是用来协同开发的分布式结构,每个人都会和服务器一样保存每个版本的数据,本地也可以进行回退版本的操作,A改了代码B直接pull一下就立刻能看到他改了什么代码,一般是用来共同开发项目用的,本文将详述Git,SVN可以说和Git的操作没什么两样。Git是目前世界上最先进的分布式版本控制系统。

安装

略,一路next就对了

Git配置

git config -l 查看配置

git config --global --list 查看本地配置信息,包括邮箱和名称

git config --global user.name "xxx" 配置用户名

git config --global user.email "xx@xx.com" 配置邮箱

Git原理

可以看到Git本地有三个工作区域,分别是:

工作目录(Working directory):就是放代码的地方

暂存区(Stage/Index):用于临时存放你的改动,事实上就是一个文件保存即将提交到文件列表信息

资源库(Repository):安全存放数据的位置,这里有你提交到所有版本的数据,其中HEAD指向最新放入仓库的版本

加上还有一个远程的Github或者Gitlab服务器的仓库(Remote Directory). image.png Git 管理的目录下各区域的关系如下: image.png

工作流程

Git 的工作流程一般是这样的

  1. 在工作目录中添加、修改文件。
  2. 将需要进行版本管理的文件放入暂存区域。
  3. 将暂存区域的文件提交到 Git 仓库。

Git 管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)。

创建工作目录

工作目录(WorkSpace)一般就是 Git 帮助管理的文件夹。

可以是项目的目录,也可以是一个空目录,建议不要有中文。

日常使用记住下图 6 个命令即可

设置公钥

设置本机绑定 SSH 公钥,可以实现免密码登录。

  1. 使用 ssh-keygen -t ed25519 -C "邮箱地址" 命令生成公钥。

image.png

  1. 使用cat ~/.ssh/id_rsa.pub查看秘钥 image.png
  2. 保存到gitub或者代码托管平台的的公钥设置就行了(我这里是阿里云的平台)

image.png

Git文件操作

文件的四种状态

版本控制就是对文件的版本控制

要对文件进行修改、提交等操作,首先要知道文件当前在什么状态。

不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

Git 管理的文件有四种状态:

Untracked:未跟踪

此文件没有加入到 Git 库,不参与版本控制。

通过 git add 变为 Staged 状态。

Unmodify:未修改

文件加入了 Git 库,未修改。

版本库中的文件快照内容与文件夹中完全一致。

这种类型的文件有两种去处:

  • 如果它被修改,而变为Modified。
  • 如果使用 git rm 移出版本库,则变为 Untracked 状态。

Modified:已修改

仅仅是修改,并没有进行其他的操作。

这个文件也有两个去处:

  • 通过 git add 可进入 Staged 状态。
  • 使用 git checkout 放弃修改,返回到 Unmodify 状态。

git checkout 是从库中取出文件,覆盖当前修改。

Staged:暂存

执行 git commit 将修改同步到库中。

这时库中的文件和本地文件又变为一致,文件为 Unmodify 状态。

执行 git reset HEAD filename 取消暂存,文件为 Modified 状态。

查看文件状态

查看指定文件状态

git status [filename]

查看所有文件状态

git status

忽略文件

有时候我们不想把某些文件纳入版本控制中,比如数据库文件、临时文件、设计文件等。

在主目录下建立  .gitignore 文件,此文件有如下规则

  • 忽略文件中的空行或以  #  开始的行将会被忽略。
  • 可以使用 Linux 通配符。例如: *****  代表任意多个字符, ?  代表一个字符, [ ]  代表可选字符范围, { }  代表可选的字符串。
  • 如果名称的最前面有一个  ! ,表示例外规则,将不被忽略。
  • 如果名称的最前面是一个  / ,表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  • 如果名称的最后面是一个  / ,表示要忽略的是此目录下的所有文件。

*.txt # 忽略所有 .txt 结尾的文件,这样的话上传就不会被选中。

!lib.txt # lib.txt 除外

/temp # 仅忽略项目根目录下的 temp 文件,不包括其它 temp 目录。

build/ # 忽略 build/ 目录下的所有文件。

doc/*.txt # 忽略 doc/notes.txt 但不包括 doc/server/arch.txt。