个人主页:小则又沐风
个人专栏:
• [数据结构]
• [竞赛专栏]
• [C语言]
• [C++]
• [Linux]
• [OJ项目]
• [MySQL]•[GIT]
前言
什么是GIT
现在我们假想一个场景:
实验课的老师布置了一个作业——写一份实验报告。
我们很快写完了第一版,并把实验报告交给老师查看。
老师看完后说:“这里还有一些地方需要修改。”
于是我们直接在原来的实验报告上进行修改,得到了第二版。
我们拿着第二版去找老师,结果老师还是不满意。
没办法,我们继续修改,又得到了第三版。
这时候老师突然说:“其实你第二版里面有些内容写得挺好的,你把第二版和现在这一版结合一下。”
问题来了:
我们现在手里只有第三版,第二版早就被覆盖掉了。
没办法,我们只能凭借“超强的记忆力”,努力回忆第二版写了什么,然后重新修改出第四版。
好不容易写完,老师看了一圈又来了一句:
“看来看去,我感觉还是第一版最好,你把第一版交给我吧。”
此时的我们:崩溃。
为什么会崩溃?
因为从第一版到第四版,我们一直在直接修改同一份文件,却没有保存每一次修改之前的版本。
于是下一次写实验报告的时候,我们学聪明了。
每次修改之前,都先把当前的实验报告备份一份,同时记录:
- 这是第几个版本;
- 这个版本修改了什么;
- 修改时间是什么时候。
这样一来:
实验报告_v1.docx 最初版本 实验报告_v2.docx 修改实验步骤 实验报告_v3.docx 修改实验结果 实验报告_v4.docx 合并第二版部分内容老师再说:
“把第二版给我看看。”
我们直接把实验报告_v2.docx拿出来就行了。
老师说:
“还是第一版好。”
也没问题,直接找到实验报告_v1.docx。
那么,我们刚刚做的这一系列操作是什么?
这其实就是最简单、最原始的版本管理。
而 Git 要解决的问题,本质上和这个例子非常相似。
只不过我们不再需要手动创建:
项目_v1 项目_v2 项目_v3 项目_最终版 项目_最终版2 项目_真的最终版 项目_打死不改版Git 会帮助我们更加系统地记录每一次修改,并在需要的时候找到或恢复到之前的版本。
GIT基本操作
1.创建Git本地仓库
对我们的文件进行版本控制的时候,首先需要的就是创建出一个本地仓库.
git initls -a . .. .git当我们创建出一个本地仓库之后,这个目录下就会出现一个隐藏的文件----.git
这个文件就是进行对我们的文件进行管理的.
2.配置Git
当安装Git后⾸先要做的事情是设置你的⽤⼾名称和e-mail地址,这是⾮常重要的。
git config [--global] user.name "Your Name" git config [--global] user.email "email@example.com" # 把 Your Name 改成你的昵称 # 把 email@example.com 改成邮箱的格式,只要格式正确即可。#查看自己的配置 git config -l如果我们上面添加了--global的选项的话,我们下次创建本地仓库的时候我们就不需要再次进行配置了.
3.认识⼯作区、暂存区、版本库
现在我们只是知道这个Git是可以控制我们的文件的,但是具体我们需要怎么使用这个Git呢?
touch ReadMe我们在这个目录下创建出一个文件,那么Git是不是就可以对这个文件进行控制了呢???
并不是的.
因为管理起来的文件都是在.git中的.
那么是不是我们把自己的文件move到.git中就可以了.
这是严重不允许的操作,这样操作可能导致.git中的配置文件等重要文件出现错误.
在使用Git进行把版本控制之前,我们需要认识⼯作区、暂存区、版本库.
工作区
工作区就是我们进行编写代码的地方.
例如我们刚才创建的ReadMe文件.我们就可以在工作区进行编写文件的内容.
暂存区
什么是暂存区?
把我们写的文件及逆行提交之后,我们的文件会出现在暂存区,暂存区就是暂时存储的地方.
通俗的理解就是暂存区就是我们的写好的作业我们现在交给了课代表等待提交给老师.
版本库
这个就是我们真正需要提交到的地方了
那么怎么将我们的文件添加到暂存区呢?
我们需要的就是这个命令
git add [文件名称]cat ReadMe hello git首先在这个文件中写一点内容.
git add ReadMe怎么将文件提交到版本库中呢?
git commit -m "message"这个message就是用来描述你的这一次的提交的.
git commit -m "create ReadME" [master (root-commit) dbafa28] create ReadME 1 file changed, 1 insertion(+) create mode 100644 ReadMe怎么新增代码
刚才我们的操作就是新增了代码.
操作的步骤就是在工作区把我们的新增的代码进行填写.
然后进行git add
最后进行给git commit
怎么删除代码
删除代码就是在工作区删除代码然后进行add和commit
git log --oneline dbafa28 (HEAD -> master) create ReadME git show dbafa28 commit dbafa280f893a1543c31a18aae41098f520909d8 (HEAD -> master) Author: jzxmorning <3060150485@qq.com> Date: Mon Aug 31 21:23:37 2026 +0800 create ReadME diff --git a/ReadMe b/ReadMe new file mode 100644 index 0000000..399e5b3 --- /dev/null +++ b/ReadMe @@ -0,0 +1 @@ + hello git现在我们通过log信息知道我们的代码的确是上传到版本库中的.
现在我们进行删除代码
vim ReadMe git add ReadMe git commit -m "delete" [master f9d6986] delete 1 file changed, 1 insertion(+), 1 deletion(-) git log --oneline f9d6986 (HEAD -> master) delete dbafa28 create ReadME ubuntu@VM-0-7-ubuntu:~/gitcode$ git show f9d6986 commit f9d698676481cfb0f7965323ee30eccdc63f558a (HEAD -> master) Author: jzxmorning <3060150485@qq.com> Date: Mon Aug 31 21:32:22 2026 +0800 delete diff --git a/ReadMe b/ReadMe index 399e5b3..8b13789 100644 --- a/ReadMe +++ b/ReadMe @@ -1 +1 @@ - hello git + git show f9d6986:ReadMe我们可以看到我们删除之后版本库中的文件内容的确是修改成为了空.
怎么删除文件
删除文件操作就是
touch file1 git add file1 git commit -m "file1"我们将要删除的文件就是这个文件.
rm -f file1 git add file1 git commit -m "delete"这样我们就把我们的文件删除了
但是也可以直接进行删除
git rm -f [文件名称] git commit -m "message"版本回退
我们在最开始讲解的时候就告诉大家这个Git是一个版本管理器.
那么我们怎么才能做到版本回退呢?
git reset [--soft | --mixed | --hard] [HEAD]这个命令就可以回到我们想要的版本了.
- --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内 容,⼯作区⽂件保持不变。
- --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命 令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
现在我们来模拟一下
git log --oneline 803c5ad (HEAD -> master) add version3 20e6464 add version2 6cea718 add version1 e9fe0cc delete 9756068 file1 f9d6986 delete dbafa28 create ReadME我们在ReadMe文件中修改了文件内容,并且提交了三次版本.
现在我们想要回到第二个版本怎么操作呢?
首先我们需要知道的是我们是想要得到什么样的回退.
假设我们需要工作区的版本也回退.
git reset --hard 20e6464 HEAD is now at 20e6464 add version2 cat ReadMe version 1 version 2那么我们反悔了,我们可以回到版本三的状态吗?
可以的可以的
但是是有条件的我们必须知道版本三的commit ID
git reset --hard 803c5ad HEAD is now at 803c5ad add version3 cat ReadMe version 1 version 2 version 3HEAD 说明:
可直接写成commitid,表⽰指定退回的版本
HEAD表⽰当前版本
HEAD^上⼀个版本
HEAD^^上上⼀个版本
以此类推...
撤销修改
使用场景:
我们在写代码的时候,写了很久,但是发现自己的代码写的是很低级的代码,想要撤销自己刚才写的代码.
情况一:工作区的代码,没有add
当然的,我们可以凭借自己的超强记忆,来找到自己修改的代码,直接删除就行了.
但是这样做难免有点麻烦并且容易出现Bug
那么有什么更加简单的办法吗?
有的有的
git checkout -- [file]让⼯作区的⽂件回到最近⼀次add 或commit 时的状态
cat ReadMe version 1 version 2 version 3 I am coding...git checkout -- ReadMe cat ReadMe version 1 version 2 version 3情况二:已经add但是没有commit
现在我们先来创建一个这样的场景.
cat ReadMe version 1 version 2 version 3 i am coding..... (add) git add .首先我们可以知道的我们的工作区和暂存区都是有我们的代码的.只有版本库没有我们的代码.
所以我们的选择有两个:
- 利用版本回退将暂存区的代码回退到和版本库一致的版本.然后之后就是情况一了
- 直接版本回退选择hard
git reset HEAD ReadMe Unstaged changes after reset: M ReadMe git log --oneline 803c5ad (HEAD -> master) add version3 20e6464 add version2 6cea718 add version1 e9fe0cc delete 9756068 file1 f9d6986 delete dbafa28 create ReadME git checkout -- ReadMe cat ReadMe version 1 version 2 version 3情况三:对于已经commit
对于这种情况我们选择的操作就是版本回退了
cat ReadMe version 1 version 2 version 3 i am coding... (commit) git add . git commit -m "coding"git log --oneline 9bc87da (HEAD -> master) coding 803c5ad add version3 20e6464 add version2 6cea718 add version1 e9fe0cc delete 9756068 file1 f9d6986 delete dbafa28 create ReadME git reset --hard 803c5ad HEAD is now at 803c5ad add version3 cat ReadMe version 1 version 2 version 3