Git-学习笔记(粗略版)
前言
很多人都听过git,github这些名词,但是它们是什么,怎么使用?git和github是一个东西吗?本文将详细解答这些问题,彻底弄懂git。
1.Git是啥❓
有一天,我们的插画师小王接到一个绘画订单,但奈何能力有限,一天之内他不可能全部完成。但是他发现了一个神奇的画板的 Git ,他发现在Git画板上绘画,不会掉色,而且能够很好地保存起来自己每天的绘画进度,之后的每一天都可以在前一天的基础上进行创作,不用再重头开始~
经过三天的辛苦创作,小王在第四天将画稿交给金主爸爸,结果...
要是一般的画家,估计心态直接崩了(你不早说!) ,但是我们小王可是使用 Git 的画家,只见他反手掏出 Git,直接取出第一版画稿,交付给了老板。
这就是Git,它最早是由开源软件的开发者林纳斯・托瓦兹(Linux 之父)在 2005 年开发的,用于帮助管理 Linux 内核的开发工作。现如今是一个免费的、开源的分布式版本控制系统,可以高速处理从小型到大型的各种项目。
对于我们写程序的人来说,上面画家画的画,就好比我们写出来的一个个功能代码,使用Git可以很好的保存这些代码文件,当你对代码进行修改、添加或者删除操作后,Git 也能够记录这些变化 ( •̀ ω •́ )y ,并且就算后续出现了什么代码差错,我们也可以回退到正常的代码版本,继续开发。从而实现对于软件的版本控制!
2.git的安装
首先我们得先在Windows系统上进行安装,先进入官网:Git-分布式版本控制工具
点击页面右下角的download
依据自身电脑的架构,选择安装,比如我是x64架构的电脑,就选择第一个版本下载。
如果不清楚自己的电脑架构,可以使用 win+r 打开终端,输入以下命令:
msinfo32
就可以在跳出来的页面中,查看自己的电脑类型了。
接下来,一直安装即可,稍微注意以下几个选项
如果你想在其它系统(如苹果的Mac系统)上安装git,可以在官网的左下角选项中,选择你对应的系统版本进行安装
对于没有图形界面的Linux系统,你可以使用下面的命令进行安装:
// Ubuntu系统
sudo apt install git
// CentOS系统
sudo yum install git
3.git基本命令使用
3.1 初始化仓库和注册
正如第一章所述,git好比一个可以记录历史记录的神奇画板,那我们总得找个地方(仓库),来放这个画板吧。我们可以新建一个文件夹用来存放它,鼠标右键,选择 open git bash here 开启我们的Git终端(终端中可执行的命令与Linux基本一致)。接着输入 git init 命令初始化git仓库。
输入完之后,你会发现我们的文件夹中新增了一个.git文件,表示我们初始化成功了,这个文件夹现在就是我们的git仓库。
PS.如果你没发现, 那可能是因为.git文件本身是一个隐藏文件,正常情况下就是不可见的,你需要点击 "查看" 按钮,选择显示隐藏文件,就可以了。
当然如果你是第一次使用,还得配置一下你的用户名和邮箱 ,就好比现如今你使用任何网站,基本都需要你进行注册的操作。而在团队合作的项目中,我们每个人在提交自己的代码文件的时候,git都会清楚地记录下来是谁提交了哪些代码文件,做了哪些修改,记录的就是用户名和邮箱!
使用以下命名设置我们的git用户名和邮箱,当然之后如果你想修改,也是使用这两命令:
git config --global user.name 用户名
git config --global user.email 邮箱
使用 git config --list --global 可以清楚地查看我们git当中全局变量的设置,前两行就是我的用户名和邮箱。(git config --list 可以查看所有的git配置情况)
而第四行的 core.autocrlf=true 这个配置项用于处理不同操作系统下的换行符差异。
在 Windows 系统中,换行符通常是 CRLF(即回车加换行),而在 Linux 和 Mac 系统中换行符是 LF(换行)。设置 core.autocrlf=true 后,Git 会在从仓库检出文件时将换行符转换为 CRLF 格式,在提交文件时会将换行符转换为 LF 格式。这样可以避免因为换行符不同而导致的文件差异问题,方便在不同操作系统之间进行代码协作。我们可以用以下命令设置该选项的开关。
git config --global core.autocrlf false // 关闭
git config --global core.autocrlf true // 开启
而当你完成了上述初始化和注册之后,下面就可以正式开始我们的 git 使用了。
3.2 文件的提交保存
整个 git 仓库,可以被划分为三个区域:工作区,暂存区(索引区),版本区(仓库区)
- 工作区:就是我们平常写各种文件的地方,与 .git 文件在同一级目录中,我们可以将我们写好的各种文件,放在这个地方。里面的文件和文件夹都是可以直接编辑、删除、创建等操作的,它们存储在本地文件系统(如 Windows 的 NTFS 文件系统、macOS 的 APFS 文件系统等)中。
- 暂存区:相当于一个中转站,实际上就是是 .git 文件夹中的 index 文件。当你在工作区对文件进行了修改,并且你觉得这些修改是值得保存的,就可以把它们放到暂存区。这样做的好处是,你可以选择先把一组相关的修改放到暂存区,等到你觉得这些修改已经足够完整,再一起提交到版本区。它就像一个缓冲区,让你可以对要提交的内容进行整理和筛选。
- 版本区:也就是我们的git仓库了,它会永久记录你的每一次暂存区中提交的版本。
举个例子👇
1.在 工作区 中,新增了一个 a.txt 文件。
2. 使用 git status 命令,查看当前git中的文件状态,显示a.txt文件状态为未追踪(Untracked),这个状态说明文件a.txt是新建的,还未被git管理。
3.使用 git add 命令,将a.txt文件提交到 暂存区 (如果想一次提交全部工作区中的所用文件,可以使用 git add . 命令)
4. 这个时候,再次查看 a.txt 文件状态,显示为已暂存 (staged),表明我们的文件已经被加入到暂存区中了
5.使用 git commit -m '提交的消息' 将暂存区中的所有文件提交到版本区中。并附带提交的消息,共同记录。(这里参数-m之后所填写的内容,一般可以简短介绍,本次提交,你做了哪些内容修改)
6.使用 git log 命令查看我们的版本提交记录,可以清楚地看到是谁(Author)在什么时间(Date)做了什么修改(就是最后一行,显示的内容就是git commit的附加信息),并且每条记录都有唯一的哈希值(第一行的字符串)与之配对,这个哈希值实际上是根据我们提交的内容使用SHA1算法计算得到的。
实际上,在git当中文件一共有以下四种状态:
3.3 版本回退
让我们再次提交一个版本,这次新增了一个b.txt文件,使用git log可以查看到我们的两次版本提交
如果这个时候,我们想要进行版本回退,该怎么办?我们可以是 git reset 命令,格式如下:
git reset head~ // ~表示回退一个版本
git reset head~~ // 表示回退2个版本
git reset head~10 // 表示回退10个版本
// 也可以使用log中记录的版本哈希值进行回退
git reset 某个版本的哈希值
这里有几个 ~ 就表示回退几个版本 ,那head是什么?实际上,head是一个指向当前我们所处版本的指针,我们在终端的 git log 命令可以看到head,head~就表示我们当前所处版本的前一个版本。
使用reset命令后,你会发现,我们仿佛穿越时光,来到了过去,新增的b.txt甚至还没被加入到暂存区中。 使用git log,发现我们的第二次版本也消失了,真的回到了最初的节点!
而当我们使用 --soft 参数的时候,会发现版本也回退了,但此时,b.txt文件是在暂存区中的!这就是软回退
而当我们使用 --hard 参数的时候,会发现工作区的b.txt文件都消失了,一点记录都不剩!这就是硬回退(慎用)
那如果一不小心,回退错了,怎么办啊!
实际上 git reset 命令,不仅可以往回滚,还可以往前滚!
我们可以使用下面的命令,获取全部的历史提交记录:
git reflog
接着使用 reset 哈希值 的方式,将版本往前滚。
3.4 忽略文件
如果工作区中,有些文件我们不想被git管理该怎么办?比如我的项目的配置文件不想被git管理,那我们可以创建.gitignore文件,比如说,我想工作区中的所有.xml文件以及.gitignore文件本身,都不被git管理,那么我只要在.gitignore文件中写入对于的文件表达式就可以,如下:
echo *.xml >> .gitignore
echo .gitignore >> .gitignore
3.5 分支
现在有一个团队项目,我们把功能拆解,让小王负责写登录的代码,小李负责写注册的代码,小张则负责管理全部的代码。那这个时候,我们就可以使用git的分支功能,每个人都把自己的代码放在自己对应的分支上,最后写完之后,在把各个分支的代码合并在一起就可以了。
$ git branch login // 创建一个login分支$ git checkout -b register // 创建并切换到register分支
说干就干,我们使用 git branch 分支名 命令创建新的分支,使用 git checkout -b 分支名 命令创建注册分支,并切换到该分支上。此时新产生的分支当中的文件内容和原先当前位置节点的内容是完全一样的。当前我们处在register分支上,也就是在小李的分支上。如果想要查看当前所有的分支,可以使用 git branch -v 命令
而这个时候,当小李使用git commit提交它的注册功能代码,我们的仓库发生了变化,可以看到新产生的c2节点是只属于regiter分支上了,其它两个分支并不能访问c2的内容。
使用以下命令切换到登录分支上,并提交两次文件,可以发现,提交的c3和c4两个版本的代码,只属于login这条分支上,其它的分支无法查看到。
git checkout login // 切换到login分支上
git commit // 提交c3版本的登录代码
git commit // 提交c4版本的登陆代码
而当注册和登录功能代码都完成后,我们就可以把这两部分代码合并到一起了,
使用 git merge 分支名 命令,将分支合并(左图)
对于没用的分支,我们可以使用git branch -d 分支名 进行删除(右图)。
最后我只需要将整合之后的代码,放到我们的main主分支上就可以了。
但有时,会出现下面的情况,两个都是修改了同一个文件,那么合并之后,这个文件的内容会是什么?实际上,这就是发生了冲突,由晚提交的人,手动修改,决定文件中的内容该如何保存。
4.码云
Git 是一个分布式版本控制系统,用于代码版本管理;GitHub、Gitee(码云)和 GitLab 是基于 Git 的代码托管平台,提供代码协作等功能。
Git:本地代码版本管理工具,支持离线操作,用于记录代码修改历史和分支管理等。
GitHub:国际化的代码托管平台,提供代码协作和审查功能,拥有庞大的开源社区。
Gitee:国内代码托管平台,网络访问速度快,适合中国开发者,支持中文界面。
GitLab:提供完整的 DevOps 功能,支持持续集成和持续交付,可自托管部署。
这里以码云(Gitee)为例,首先注册好账号后登录,创建仓库:
接着使用ssh的方式与我们的仓库进行连接,现在本地生成密钥对
ssh-keygen -t rsa -C "你的邮箱" // 使用rsa算法生成密钥对
cat ~/.ssh/id_rsa.pub // 查看公钥
将公钥复制,在头像点击"设置",在安全设置中,找到ssh公钥,将我们的公钥复制粘贴进去,这样我们以后与仓库连接进行操作,就不用反复输入账号密码了。
接着来到仓库,按照下面的命令初始化即可。
一些常用的命令:
命令 | 描述 |
---|---|
git remote -v | 查看远程仓库信息 |
git remote add <远程仓库名> <URL> | 添加远程仓库 |
git remote < rename原名> <新名> | 重命名远程仓库 |
git remote rm <远程仓库名> | 删除远程仓库 |
git remote set-url <远程仓库名> <新 URL> | 更新远程仓库 URL |
git fetch <远程仓库名> | 从远程仓库获取代码 |
git pull <远程仓库名> <分支名> | 从远程仓库获取代码并合并 |
git push <远程仓库名> <分支名> | 将本地代码推送到远程仓库 |
git push <远程仓库名> --delete <分支名> | 删除远程分支 |
git remote prune <远程仓库名> | 清理本地已不存在于远程的分支记录 |