目录


🎉博客主页:小智_x0___0x_
🎉欢迎关注:👍点赞🙌收藏✍️留言
🎉系列专栏:Git企业级开发教程
🎉代码仓库:小智的代码仓库
一、Git是什么?
Git是一个免费和开源的分布式版本控制系统,它可以快速高效地处理从小型到大型项目的所有文件。Git由Linux内核的开发者Linus Torvalds在2005年为了管理Linux内核源代码而创建。Git的主要特点和功能包括:
1.1特点
- 分布式:与SVN等集中式版本控制系统相比,Git是分布式的。每个开发者都拥有完整的本地仓库,可以在本地进行提交、分支、合并等操作,无需依赖网络连接或中央服务器。这种特性提高了开发效率,降低了服务器压力,并增强了安全性和灵活性。
- 高效性:Git能够高效地处理各种规模的项目,无论是小型项目还是大型项目,都能迅速完成版本控制任务。
- 安全性:由于每个开发者都拥有完整的本地仓库,因此即使中心仓库出现问题,开发者也可以通过本地仓库恢复数据,保证了数据的安全性。
1.2功能
- 版本控制:Git能够追踪项目从开始到结束的整个过程,记录每次代码修改的内容和时间,并能够回滚到任意历史版本,方便团队协作和代码维护。
- 协作开发:Git支持多人协作开发,开发者可以在不同的分支上独立进行代码修改,最后通过合并操作将修改集成到一起。这种方式避免了代码冲突和重复开发的问题。
- 分支管理:Git的分支功能非常强大,允许开发者在不影响主干代码的情况下进行代码的修改和开发。每一个分支都是当前代码仓库中的一个拷贝,可以独立进行修改和版本管理。
- 代码审查:Git可以与代码审查工具集成,方便开发者在提交代码前进行代码审查,确保代码质量。
- 集成与自动化:Git可以与持续集成/持续部署(CI/CD)工具集成,实现自动化的构建、测试和部署流程,提高开发效率。
1.3基本概念
- 仓库(Repository):Git存储代码和相关历史记录的地方。Git支持本地仓库和远程仓库,本地仓库存储在开发者的计算机上,而远程仓库通常存储在云端,如GitHub、Gitee等。
- 提交(Commit):将代码的当前状态保存到仓库中的过程。每次提交都会生成一个唯一的SHA-1哈希值,称为提交ID。
- 分支(Branch):从主分支(或其他分支)上分出来的一条独立的代码线。使用分支可以使得多人协作更加高效,同时也可以保证代码稳定性。
- 合并(Merge):将两个或多个分支上产生的不同的修改合并为一个代码历史。合并可能会导致冲突,需要手动解决。
二、Git安装
2.1Ubuntu下安装
- 检查Ubuntu下有没有安装git
$:git --version
-bash: git: command not found //表示没有安装git
- 安装Git
sudoaptinstall-ygit
等待安装完毕即可。
- 查看Git版本
git--version
$:git version 2.34.1
2.2Centos下安装Git
- 检查Centos下有没有安装git
$:git --version
-bash: git: command not found //表示没有安装git
- 安装Git
sudo yum install-ygit
等待安装完毕即可。
- 查看Git版本
git--version
$:git version 1.8.3.1
三、Git基本操作
3.1创建git本地仓库
- 先创建一个目录
mkdir gitcode进入gitcode目录 - 使用
git init创建一个本地仓库
创建好git仓库之后本地会有一个.git的隐藏目录
.git目录是用Git用来跟踪管理仓库的,不能手动去修改里面的文件。
3.2配置Git
安装好Git之后首先要做的是设置自己的用户名称和邮箱
git config [--global] user.name "Your Name"git config [--global] user.email "[email protected]"# 把 Your Name 改成你的昵称# 把 [email protected] 改成邮箱的格式,只要格式正确即可
其中
--global
是⼀个可选项。如果使用了该选项,表示这台机器上所有的Git仓库都会使用这个配置。如果你希望在不同仓库中使用不同的
name
或
e-mail
,可以不要
--global
选项,但要注意的是,执行命令时必须要在仓库里。
查看配置命令:
ubuntu@xiaozhi:~/Desktop/gitcode$ git config -luser.name=小智
[email protected]
alias.st=status
core.repositoryformatversion=0core.filemode=true
core.bare=false
core.logallrefupdates=true
删除对应的配置命令为:
git config [--global]--unset user.name
git config [--global]--unset user.email
3.3 工作区&暂存区&版本库
- ⼯作区:是在电脑上你要写代码或⽂件的目录。
- 暂存区:英文叫stage或index。⼀般存放在
.git目录下的index文件(.git/index)中,我们 把暂存区有时也叫作索引(index)。 - 版本库:又名仓库,英文名
repository。工作区有⼀个隐藏目录.git,它不算工作区,而是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
- 左侧为工作区,右侧为版本库,版本库中最重的是stage(暂存区)。
- 创建git的版本库时,git会默认给我们创建一个唯一的master分支,以及一个指向master分支的指针
HEAD - 当在工作区修改文件时执行
git add命令,则会更新暂存区的文件树索引 - 当执行
git commit命令时,master分支会相应进行更新(此时暂存区的文件树索引内容才被真正写入版本库中)
**通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用
git add
和
git commit
命令才能将文件添加到仓库中进行管理!!!**
3.4 实操案例
3.4.1添加文件
- 添加一个文件或多个文件到暂存区:
git add [file1] [file2] - 添加指定目录,包括子目录到暂存区:
git add [dir] - 添加当前目录下所有文件改动到暂存区:
git add .
在使用
git commit
命令将暂存区中的内容添加到本地仓库中:
- 提交暂存区中所有内容到本地仓库中:
git commit -m "message" - 提交暂存区中的指定文件到本地仓库中:
git commit [file1] [file2] -m "message"
git commit
后面的
-m
选项,要加上本次提交的message(描述本次提交),这部分不能省略。用来记录我们提交细节。
git log
可以查看历史提交信息,并且可以查看我们每次
commit
的日志信息。
也可以格式化打印输出:
git log --pretty=oneline

这里的
ceea989e0ba7254e1bf2cafc8c1619257511da14
是每一次
commit
的版本号,是通过特殊的哈希算法(SHA-1)算出来的数字。用于唯一标识一个提交。
查看
.git
中的文件结构
index是我们的暂存区,add之后的内容都添加到这里。HEAD是我们的默认指向master分支的指针。
ubuntu@xiaozhi:~/Desktop/gitcode$ cat .git/HEAD
ref: refs/heads/master
默认的master分支就是:
ubuntu@xiaozhi:~/Desktop/gitcode$ cat .git/refs/heads/master
ceea989e0ba7254e1bf2cafc8c1619257511da14
master指向的就是我们最新提交到本地仓库的
commit ID
objects是 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,这个新对象就位于.git/objects目录下。
ubuntu@xiaozhi:~/Desktop/gitcode$ ls .git/objects/
16 c7 ce info pack
ubuntu@xiaozhi:~/Desktop/gitcode$ ls .git/objects/ce/
ea989e0ba7254e1bf2cafc8c1619257511da14
查找object时要将
commit ID
分为两部分查看,前2位时文件夹名称,后38位是文件名称。
找到这个文件一般我们不能直接去
cat
这个文件,因为这个文件是通过哈希算法加密过的文件。我们可以使用Git给我们提供的指令
git cat-file -p + (commid ID)
来查看:
ubuntu@xiaozhi:~/Desktop/gitcode$ git cat-file -p ceea989e0ba7254e1bf2cafc8c1619257511da14
tree c730883a3e1d9acd478bcc8e4ce4a2d144e78256
author 小智 <[email protected]>1722834791 +0800
committer 小智 <[email protected]>1722834791 +0800
add file1
查看上面输出中tree后面的
commit ID
:
ubuntu@xiaozhi:~/Desktop/gitcode$ git cat-file -p c730883a3e1d9acd478bcc8e4ce4a2d144e78256
100644 blob 16372721c888812697c2f880365b83e1db033a3f file1
再来看看对应file1里面的
commit ID
:
ubuntu@xiaozhi:~/Desktop/gitcode$ git cat-file -p 16372721c888812697c2f880365b83e1db033a3f
I am file1!#这是我们对file1做的修改!!被git记录了下来!!
3.5 修改文件
Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
ubuntu@xiaozhi:~/Desktop/gitcode$ echo"aaaaaaaaaaaa">>file1
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
git status
查看当前仓库状态:
上面告诉我们
file1
文件已经被修改但是没有添加和提交。
git diff [file]
查看暂存区和工作区中的文件差异,现实的格式是Unix通用的diff格式,也可以通过
git diff HEAD -- [file]
来查看版本库和工作区的文件差异。
ubuntu@xiaozhi:~/Desktop/gitcode$ gitdiff file1
diff--git a/file1 b/file1
index 1637272..e0eef4b 100644
--- a/file1
+++ b/file1
@@ -1 +1,2 @@
I am file1!
+aaaaaaaaaaaa
ubuntu@xiaozhi:~/Desktop/gitcode$ gitdiff HEAD -- file1
diff--git a/file1 b/file1
index 1637272..e0eef4b 100644
--- a/file1
+++ b/file1
@@ -1 +1,2 @@
I am file1!
+aaaaaaaaaaaa
3.6版本回退
执行
git reset
命令用于回退版本,可以指定退回某一次提交的版本。回退的本质是将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
git reset
命令语法格式为:
git reset [--soft | --mixed | --hard] [HEAD]
--mixed为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。--soft参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。--hard参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。
HEAD 说明:
- 可直接写成 commit id,表示指定退回的版本。
HEAD表示当前版本。HEAD^上一个版本。HEAD^^上上一个版本。- 以此类推…
可以使用 ~数字表示:
HEAD~0表示当前版本。HEAD~1上一个版本。HEAD~2上上一个版本。- 以此类推…
当然,这里是一个表格,帮助你更好地理解
git reset
中
--soft
、
--mixed
和
--hard
这三种模式的区别:
参数版本库(HEAD指针)暂存区(Index)工作区(Working Directory)
--soft
回退到指定提交保持不变保持不变
--mixed
(默认选项)回退到指定提交回退到指定提交保持不变
--hard
(慎用)回退到指定提交回退到指定提交回退到指定提交
示例
假设有以下提交历史:
commit a1b2c3d (HEAD -> master)
commit e4f5g6h
commit i7j8k9l
如果你想回退到
e4f5g6h
:
git reset --hard e4f5g6h
使用
git reset --hard
命令后,提交历史将变为:
commit e4f5g6h (HEAD -> master)
commit i7j8k9l
不同参数对工作区和暂存区的影响:
- **
git reset --mixed e4f5g6h**:- 版本库:回退到e4f5g6h- 暂存区:更新为e4f5g6h的内容- 工作区:保持不变 - **
git reset --soft e4f5g6h**:- 版本库:回退到e4f5g6h- 暂存区:保持不变- 工作区:保持不变 - **
git reset --hard e4f5g6h**:- 版本库:回退到e4f5g6h- 暂存区:更新为e4f5g6h的内容- 工作区:更新为e4f5g6h的内容
**恢复可以通过部分的
commit ID
来恢复!**
3.7查看历史操作日志
使用
git reflog
可以查看历史操作日志
ubuntu@xiaozhi:~/Desktop/gitcode$ git reflog
787ed68 (HEAD -> master) HEAD@{0}: commit: md file1
ceea989 HEAD@{1}: commit (initial): add file1
git reflog
记录了对本地仓库的所有操作日志,包括那些已经丢失或不可见的操作。通过
git reflog
,可以找到并恢复意外丢失的提交。
可以通过
git reset --hard HEAD@{1}
或者
git reset --hard ceea989
来恢复到部分commit ID为ceea989的提交。
在 Git 中,版本回退速度非常快,因为 Git 在内部使用了一个指向当前分支(如 master)的 HEAD 指针。
refs/heads/master
文件中保存了当前 master 分支的最新 commit ID。当我们进行版本回退时,Git 只是将
refs/heads/master
中存储的 commit ID 更新为特定的版本。可以简单理解成如下示意图:

通过更新
refs/heads/master
文件中的 commit ID,Git 可以快速地实现版本回退,而不需要实际更改文件的内容。这种方式使得 Git 的版本回退操作非常高效。
3.7撤销修改
3.7.1工作区还没有add
可以使用
git checkout -- [file]
命令让工作区的文件回到最近一次
add
或
commit
时的状态。要注意
git checkout -- [file]
命令中的
--
很重要,切记不要省略。
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
ubuntu@xiaozhi:~/Desktop/gitcode$ git reset --hard 787ed68
HEAD 现在位于 787ed68 md file1
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
ubuntu@xiaozhi:~/Desktop/gitcode$ echo"cccccc">> file1
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
cccccc
ubuntu@xiaozhi:~/Desktop/gitcode$ git checkout -- file1
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
在这个命令中:
git checkout是用于检出分支或恢复文件的命令。--用于明确告诉 Git 后面的内容是文件名而不是分支名。这可以防止错误地检出到某个分支。file1是你想恢复的文件名。
注意事项
- 慎重使用:
git checkout -- [file]命令会丢失你在文件中的所有未保存的修改,因此使用前请确保你真的不需要这些修改。 - 区分分支和文件:
--符号非常重要,因为它能让 Git 清楚地知道你指的是文件而不是分支名。
git reset用于回退版本,根据参数不同可以回退到不同的状态(soft、mixed、hard)。git checkout -- [file]用于撤销工作区中文件的修改,使其恢复到最近一次git add或git commit时的状态。
3.7.2已经add,但没有commit
如果已经使用
git add
将文件添加到暂存区,但还没有进行
commit
,你可以通过以下方法撤销这些更改:
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
ubuntu@xiaozhi:~/Desktop/gitcode$ echo"cccccccc">>file1
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
cccccccc
ubuntu@xiaozhi:~/Desktop/gitcode$ git reset HEAD file1 #将暂存区恢复至HEAD指向的master版本
重置后取消暂存的变更:
M file1
ubuntu@xiaozhi:~/Desktop/gitcode$ git status #查看分区状态
位于分支 master
无文件要提交,干净的工作区
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
cccccccc
ubuntu@xiaozhi:~/Desktop/gitcode$ git checkout -- file1 #再来恢复工作区
ubuntu@xiaozhi:~/Desktop/gitcode$ git status
位于分支 master
无文件要提交,干净的工作区
ubuntu@xiaozhi:~/Desktop/gitcode$ cat file1
I am file1!
aaaaaaaaaaaa
3.7.3已经add,并且也commit了
- 如果还没有将本地版本库推送到远程,可以安全地使用
git reset --hard HEAD^来回退到上一个提交。这样本地的最新提交会被丢弃,工作目录会恢复到上一个提交的状态。
3.8删除文件
ubuntu@xiaozhi:~/Desktop/gitcode$ ls
file1 file2
ubuntu@xiaozhi:~/Desktop/gitcode$ rm file2
ubuntu@xiaozhi:~/Desktop/gitcode$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: file2
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ubuntu@xiaozhi:~/Desktop/gitcode$
在这种情况下,工作区和版本库不一致,需要删除文件。有两种可能性:
- 确实需要从版本库中删除该文件。
- 不小心误删了文件。
对于第二种我们可以直接通过
git checkout -- file2
来进行恢复。
ubuntu@xiaozhi:~/Desktop/gitcode$ git checkout -- file2
ubuntu@xiaozhi:~/Desktop/gitcode$ ls
file1 file2
对于第一种则需要使用
git rm
将暂存区和工作区中删除,并且还需要
commit
。
ubuntu@xiaozhi:~/Desktop/gitcode$ gitrm file2
rm'file2'
ubuntu@xiaozhi:~/Desktop/gitcode$ git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
删除: file2
ubuntu@xiaozhi:~/Desktop/gitcode$ git commit -m"delete file2"[master 5c846bd] delete file2
1file changed, 1 deletion(-)
delete mode 100644 file2
这样文件就从版本库中删除了。
🍀小结🍀
今天我们学习了
"Git安装、基本操作
相信大家看完有一定的收获。**
种一棵树的最好时间是十年前,其次是现在!
** 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,
三连一波💕💕~~~
,本文中也有不足之处,欢迎各位随时私信点评指正!
版权归原作者 .小智 所有, 如有侵权,请联系我们删除。