目录
- 一、Git是什么?
- 1.1特点
- 1.2功能
- 1.3基本概念
- 二、Git安装
- 2.1Ubuntu下安装
- 2.2Centos下安装Git
- 三、Git基本操作
- 3.1创建git本地仓库
- 3.2配置Git
- 3.3 工作区&暂存区&版本库
- 3.4 实操案例
- 3.4.1添加文件
- 3.5 修改文件
- 3.6版本回退
- 3.7查看历史操作日志
- 3.7撤销修改
- 3.7.1工作区还没有add
- 3.7.2已经add,但没有commit
- 3.7.3已经add,并且也commit了
- 3.8删除文件
- 🍀小结🍀
🎉博客主页:小智_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
sudo apt install -y git
等待安装完毕即可。
- 查看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 -y git
等待安装完毕即可。
- 查看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@example.com"
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可
其中--global
是⼀个可选项。如果使用了该选项,表示这台机器上所有的Git仓库都会使用这个配置。如果你希望在不同仓库中使用不同的 name
或 e-mail
,可以不要--global
选项,但要注意的是,执行命令时必须要在仓库里。
查看配置命令:
ubuntu@xiaozhi:~/Desktop/gitcode$ git config -l
user.name=小智
user.email=2935117143@qq.com
alias.st=status
core.repositoryformatversion=0
core.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 小智 <2935117143@qq.com> 1722834791 +0800
committer 小智 <2935117143@qq.com> 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$ git diff 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$ git diff 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$ git rm 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
1 file changed, 1 deletion(-)
delete mode 100644 file2
这样文件就从版本库中删除了。
🍀小结🍀
今天我们学习了"Git安装、基本操作
相信大家看完有一定的收获。种一棵树的最好时间是十年前,其次是现在!
把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~
,本文中也有不足之处,欢迎各位随时私信点评指正!