目录
1.背景
在工作或学习中,可能会遇到这样的情况:在编写文档时,为了防止文档丢失,更改失误,失误后能回到原来的版本,不得不复制出一个副本,比如:"报告-v1""报告-v2""报告-确定版"。
每个版本有各自的内容,但最终只有一份报告需要被我们使用但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越 多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?
举一个更实际的例子,张三写C语言实验报告给老师看,老师指出了很多问题,张三修改完给老师看,老师又指了问题,几遍后,张三越改越差,老师让张三把第一次的实验报告给她看,而他没备份第一份代码,且张三也没把每次修改的内容作为文档,他找不到最开始的文档了。李四看到后直到要备份了,于是Ctrl+C一份同样的报告(v1),然后再拿这份报告去修改(v2、v3),最后老师要v1那份,他能给出。
2.版本控制器
Git的核心功能就是-版本控制 ,而李四做的所有备份也叫:版本控制,因此,版本控制的本质:应对不同的变化!老师对应:产品或项目经理,李四称为程序员,实验报告是写的代码。
除此之外,我们也可以不备份文件,但是要新建一个修改记录(增删改都写到里面去(记事本)),这个也称为版本控制。而修改第一次的版本为v1.1,若修改很大,就称为v2.0版本。想要之前的版本,需要逆向操作。
为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
⽬前最主流的版本控制器就是 Git。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项中的源代码⽂件!
3.Git的规则
张三有一个code文件,装了一个git服务,每次都提交代码到本地git仓库,李四也一样。此外有一个服务器,里面还有一个git服务目录,称之为:远端仓库。张三把自己本地git仓库提交到远端仓库,李四也这样。
git有一个特征:张三的git仓库和远端仓库不一致,则张三无法提交!
git规则:
如果我们的本地仓库和远端仓库内容如果不一致,推送方无法推送。
张三提交代码到远端仓库为code1,李四想要提交code2,而code2和code1不一致,因此无法推送到远端仓库上去,如果code2要提交,将来要先把远端仓库同步到本地仓库(同步过程不会互相冲突,也不会覆盖),此时张三提交的code1就这样到了李四那里。
此时李四就有了code1和code2,此时就把code2的代码添加到本地仓库再推送到远端仓库,此时,远端仓库发现李四的代码是在原来代码基础上新增的,就允许推送了。
而此时张三也想要把code3提交到远端仓库,也要如此操作!
因此:多人开发的时候,我们通过限制提交的方式,保证服务端尽量是最新的。如果不是最新的,允许client提交,其他client就必须同步的方式进行多人协同开发!每个人要提交,必须先和远端保持一致,增量式的提交!其次,两个人必须都要同步仓库,才能保证工作进行。
什么叫做仓库?
就是特定目录 !git本身除了版本控制,也提供网络功能。
本地仓库和远端仓库,没有本质区别,本地git服务和远端git服务,没有本质区别。
git是一种去中心化的版本控制策略,每个人都有解释权,各自在本地提交代码,之前每个人不在一起吃饭,而只做自己吃的,但现在不一样了,现在一起吃了。
4.git的操作
安装git:默认情况下是已经安装了git的,若没有安装,可以问AI大模型。
先更新软件包列表:
bash
sudo apt update
再执行以下命令安装:
bash
sudo apt install git -y
若用:
bash
git --version
能够看到版本就代表已经安装了:

5.远端仓库gitee
用浏览器搜索gitee.com进入登录界面登录。
我们需要在远端新建仓库:

什么叫新建仓库?
我们要通过这种网页的方式来让它Git在远端新建一个目录。

我们需要先写好自己的仓库名称和仓库介绍,这个仓库是为了测试用的,因此写为:test_for_csdn,介绍写为:for test即可,路径会自动生成:

此时我们再设置这个仓库是否开源,如果开源的话别人就可以通过搜索框搜索到你:

然后可以看到你的提交信息、代码等,如果不开源,只有仓库人员看得到你的代码等。未来我们在新建仓库时,它是允许我们在设置里把这个项目拉进来很多人,默认仓库成员就你一个

选择初始化仓库:

选择语言:

选择.gitignore模板:

选择开源许可证:

它通常是有一些约束的,比如你的代码是否允许被别人免费的拿去做二次开发,如果做了二次开发但是没有经过你的允许等情况。你可以不选择!
设置模板:

我们选择Readme即可,也可以选择不加:

Readme相当于你未来你这个项目对应的说明文档。
选择分支类型:

一般不选择这个,它会默认创建master分支。
此时点击创建即可:


此时就相当于在我们的服务器上为我们新建了一个目录,目录的路径是:

而这下面有三个文档:

其中.gitignore之后再讲,README.en.md是英文的提示文档,README.md是中文的提示文档,未来我们写项目下面要写的:

点击.gitignore文件:

里面有很多的内容:

这个时候我们就新建了一个空的仓库,如果想要使用它,回退到刚刚界面,点击克隆/下载:

复制一下箭头所指:

复制之后在Xshell中,进入一个目录,如:家目录:

然后:
bash
git clone https://gitee.com/tan-dan-0000/test_for_csdn.git
git clone 你复制的东西,然后回车有:

什么叫做clone,就是把远端仓库同步到本地,相当于把远端的那个目录,递归似的全拷贝过来,此时我们ls就有:

我们进入test_for_csdn有:

当前就把远端仓库和本地仓库同步起来了!当前只有我一个人在用了,可以通过cat README.md查看一下内容:

也就是说它把远端的东西全拷贝过来了!
那为啥看不到.gitignore呢?
实际上,我们可以:
bash
ls -la
查看到:

那么这个.git又是从哪里来的?
我们把当前所在目录:

叫做:当前工作区 。而.git叫做:本地仓库!
当前工作区相当于之后我们把代码放在这个目录下。

也就是说我们未来要想我们的代码被git管理起来,必须保证你的代码先拷贝到本地目录下,然后未来把你的代码托管给你的本地仓库才可以。
如:我想创建一个test.c文件,然后里面的代码给git管理起来有:

当前的test.c并没有被git管理起来,想要被管理起来:
bash
git add .
意思就是说:把当前目录下新增的东西添加到目录,而现在是新增了一个test.c,也就是把test.c添加到本地仓库里。
但只添加还远远不够,还需要把它管理起来:
bash
git commit -m "这次修改的修改记录"
我们这次是首次添加C代码,因此:

其中这个"首次添加C代码"是提交日志或提交记录,不要随便写(但是此时我们是并没有添加成功的)!等同于在历史版本新增了一个修改记录。
但是很显然我们没有提交成功,这是因为:Git 不知道你是谁,无法给这次提交打上作者标签。
Git 的每一次提交都必须记录提交者的身份(用户名和邮箱),而你还没有配置这些信息,所以 Git 阻止了提交。
因此我们需要以下指令来解决:
bash
git config --global user.name "tan"
git config --global user.email "tan@example.com"
把tan替换成你的gitee的名字,把tan@example.com替换成你登录gitee时所用的邮箱名字即可,然后用:
bash
git config --list | grep user
来验证是否配置成功:

此时就是配置成功的。
然后重新执行,将文件添加到暂存区:
bash
git add test.c
再执行提交:
bash
git commit -m "首次添加C代码"
即可提交成功:

我们还可以通过:
bash
git log
查看提交历史:


其中1file changed代表:一个文件被改变了,7 insertions(+)代表插入了7行代码。
也就是说git commit -m是把修改提交到本地仓库里。
也就是说我们把代码提交到本地仓库往往需要做两件事情:
一、
bash
git add .
我们往往要写个.,为啥,因为它代表要把我们当前目录下新增的东西添加到本地仓库里
二、
bash
git commit -m "XXX"
这两步都做完才代表完成提交,也就等同于往历史记录里新增了一条修改记录。
至此,我们已经完成了把代码进行本地化提交!
我们还需要把所对应的提交信息提交到远端,也就相当于把远端仓库的内容和本地仓库的内容进行同步(同步到gitee)。
三、
bash
git push

需要我们输入我们登录的gitee账号的账号和密码(密码不回显):

此时就会自动的把本地和远端进行关联了,此时在gitee刷新一下就有:

点开test.c就是我们写的代码:

首次添加C代码是所对应的日志信息!
总结:0.注册登录gitee;1.创建一个仓库;2.git clone url(链接);3.添加代码
三板斧:git add . git commit -m "XXX" git push
6.git的细节
李四创建了这么多版本,我们自己会把这么多版本放在哪里?
那肯定是在电脑上新建一个目录,然后只要老师打回来的就把当前版本放到目录里,然后在当前目录下继续做操作。而这个目录叫做李四的本地仓库。
所以我们git clone下来的是整个目录,我们把当前目录叫做用户使用git时的当前工作区,未来要把代码提交到远端仓库里,一般都是把你的所有代码先拷贝到当前工作区里,所以我们才要git add .,这个.的意思就是把当前工作区里面的所有新增的/变化的文档提交到本地仓库里。
什么叫做git仓库呢?
仓库就是一个目录,这个仓库就是.git,而.git里包含它维护的相关细节:

我们提交的信息被git本身保存到了这里,而.git里面的这些东西都是为了维护我们的仓库的!
index:本地仓库的暂存区。
严格意义上讲,我们的git add .并不是把你提交的代码合并到仓库里,而是把你当前目录下的.c文件把他添加到了暂存区,这样如果你添加失败了或后悔了,你可以把暂存区的东西直接丢弃,不影响本地仓库,暂存区存在的意义就是给你后悔用的!
而当你确定要提交到本地仓库,这个操作就是git commit,此时就真正把你提交的代码提交到本地仓库里,未来如果把当前目录下的test.c删掉也可以通过本地仓库恢复。
git push就是同步到远端。
为什么git commit -m "XXX"这个提交日志为啥不能随便写?
我们git log打开日志:


这个是提交ID,会被仓库记录下来的。
这个日志不能随便写,因为一旦提交到仓库里,这个日志会被记录下来,之后面试时面试官看到你的日志是随意写的就觉得你不专业了!
为什么要同步到远端?如何多人协作一下,master?
我们如果是多人协作,那么push时会报错,因为其他人可能新增过内容并提交到远端仓库,而我们本地没有同步远端仓库,需要先同步才行,执行以下代码:
bash
git pull
此时就能同步了,如果想要提交就直接:
bash
git push
因此,若要移动文件,就必须要先做同步(git pull),再(git push)。
也就是说同步到远端的目的就是来约束程序员进行同步!
.gitignore有什么用?(git+ignore忽略)
git主要进行源文件,头文件,文档等的托管,不要把VS中形成的.obj,.exe这些临时文件提交上去,这些文件提交没用!所以gitignore就是来忽略这些的,gitignore里面包含:

凡是在你当前工作区里任意一个目录里的任意一个文件,只要它的文件后缀在gitignore当中,在以这些后缀的文件不会提交到本地仓库 ,就会把这些文件过滤了,不会提交。
此外我们还可以vim .gitignore来修改里面的后缀名!
也就是说:gitignore就是对临时文件做过滤!防止特定临时文件污染我们的git仓库,它是一个忽略后缀的配置文件。
bash
git status

当我们不清楚工作区和仓库代码干不干净,如果有:

表示本地仓库和工作区内容一致。
若我们有未提交文件到git上(在暂存区):

此时我们可以用git status:

表示在暂存区有一个新文件未提交到本地仓库。
如果此时我们:
bash
git commit -m "测试status"
再执行git status有:

代表我们已经提交到本地仓库了,也就是说即使我们不提交到远端仓库(push),也没事。
git add .和git comit -m "XXX"到底再干什么?
我们对文件操作无非就①新建文件,删除文件,修改文件--针对文件本身;②对于一个具体的文件,增删改--对文件进行编辑 。这些工作就会体现在工作区里面。
这些所有的操作,你也是一步一步做的,做了一批操作,git add .和git commit -m所提交的不是把test.c文件拷贝到暂存区,提交的是你的历史修改操作!提交的是对应的修改!
提交的是对文件的修改记录!这样可以大大节省空间,因为很多东西都是重复的!
而李四之前也是把修改操作写到记事本里,我们把这个记事本叫做李四的本地仓库!
也就是李四在实验报告目录里新增了一个隐藏目录叫:.git,然后把记事本里的信息放到.git里。
git仓库在保存时,保存的是修改记录!因为修改记录本质是:当前工作区内的文件--变化!
我们把变化的东西记录在仓库里,最后把本地仓库与工作目录打包整体同步到远端就能在gitee上看到了,所以仓库本质就是保存文件的变化。
如果想要拷贝之前写的文件就用cp指令拷贝到当前目录即可。
7.git的注意事项
我们首次git push时它会提醒你写用户名和用户邮箱,而这些信息在填的时候,一定要与你的目标平台一致!如果不一致,可能会提交失败。
其次,我们还可能要输入密码才能push成功,如何配置免密操作,可以问AI大模型,以下是方法:
①生成SSH密钥对
bash
ssh-keygen -t ed25519 -C "3881649107@qq.com"
在""里面填你对应的邮箱,一直回车即可:

②复制公钥内容
执行以下命令,查看并复制输出的全部内容(以 ssh-ed25519 开头):
bash
cat ~/.ssh/id_ed25519.pub

③将公钥添加到Gitee



在标题栏给公钥起个名字,然后把在终端得到的公钥粘贴上去:


输入密码:


④修改本地仓库的远程地址
首先,查看你当前仓库使用的协议:
bash
git remote -v
-
如果输出的地址是以
https://开头的(例如https://gitee.com/tan-dan-0000/test_for_csdn.git),你需要将它改成 SSH 协议。 -
将远程地址修改为 SSH 格式。SSH 地址通常长这样:
git@gitee.com:用户名/仓库名.git。

你可以用下面的命令直接修改(请将 用户名 和 仓库名 替换成你自己的):
bash
git remote set-url origin git@gitee.com:tan-dan-0000/test_for_csdn.git
如何找到你的 SSH 地址?
在你的 Gitee 仓库页面,点击 "克隆/下载" 按钮,然后选择 "SSH" 标签,里面显示的地址就是正确的。
⑤测试链接
执行以下命令,测试 SSH 连接是否成功。
bash
ssh -T git@gitee.com
如果看到包含 成功 或 successfully 的提示,就说明配置成功了。

这个没有配置成功,我们需要执行以下指令:
一、编辑SSH客户端配置文件
bash
sudo vim /etc/ssh/ssh_config

二、找到第26行(用set nu)

在该行行首添加 # 将其注释掉:

三、:wq保存退出
四、重新测试SSH连接
bash
ssh -T git@gitee.com
如果现在提示 Hi 谭旦0000! You've successfully authenticated, ...,说明配置成功。

最后测试一下git push需不需要密码就行:

很显然不需要了!
此外你还可以在邮箱看到:
