一、Git安装
Linux-centos:
安装命令:
shell
sudo yum -y install git
检查版本:
安装完成后,查看git版本,有版本信息,说明安转成功。
shell
git --version

Linux-ubuntu:
安装命令:
shell
sudo apt-get install git -y
检查版本:
git --version
Windows:
打开cmd,输入一下安装命令:
shell
winget install --id Git.Git -e --source winget
验证:git --version

二、Git基本操作
1.创建本地仓库
命令:
shell
git init
当前目录下,会创建出一个.git隐藏文件。里面包含了 Git 用来跟踪和管理文件修改历史的所有核心数据和细节,不能修改里面的任何内容。

2.配置git
为什么要配置?
标识每一次代码提交(commit)的作者身份,表明是谁提交的代码。
如何配置?
全局配置:
在整个Linux机器上都使用该配置信息作为作者身份。
shell
git config --global user.name "Your name"
git config --global user.email "email@example.com"
局部配置:
只对当前仓库生效。
shell
git config --global user.name "Your name"
git config --global user.email "email@example.com"
确认是否已配置好?
shell
git config -l

有作者身份标识,说明就已配置好。
删除配置:
shell
git config [--global] --unset user.name
git config [--global] --unset user.email
加上--global,就是删除机器上所有的git身份标识。
3.工作区、暂存区、版本库
工作区:
写代码界面的左侧目录就是工作区。


.git不属于工作区,属于Git的版本库。
暂存区:
英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
工作区是本地写代码的地方,写完代码后git add [要提交的文件],将工作区内容的修改(新增、删除、修改)添加至版本库(.git)的暂存区,修改的工作区内容会写入版本库的一个新的git对象中,有许多的新的git对象创建,形成对象库(objects),暂存区:储存的就是git对象的指针,然后 git commit -m "描述本次修改的信息",将暂存区内容提交至当前所在分支(git branch查看)下,这一步才会被正式写到版本库中,成为一条可以随时追踪和还原的历史记录,最后git push origin + 当前的分支,将修改的代码推送至远程仓库。
4.添加文件到版本库
添加文件到版本库必须经历git add和git commit后,才会被正式写入到版本库中。
为什么要有git add 和git commit 操作,只有git add 不也可以吗?
理论上可以,但是这样效率很低。
使用git add 和git commit 操作,可以多次修改不同的文件,分批使用 git add 把它们放到暂存区,最后确认无误后,再用 git commit 一次性把它们作为一个完整的版本提交上去。
1)添加到暂存区
- 添加一个文件或多个文件到暂存区:
git add [file1] [file2] ... - 添加指定目录到暂存区:
git add [dir] - 添加当前目录的所有改动到暂存区:
git add .
2)提交到版本库
git commint -m "描述本次修改的信息"
描述信息尤为重要,描述本次做了哪些修改,可以更好的对历史版本管理。

3)查看历史提交记录
git log:显示从近到远的提交日志。

git log --pretty=oneline:显示更简洁的提交日志。

可看到提交日志变简洁了,每条日志包含commit id、提交描述信息。
注:commit id是用SHA1计算的一个非常大的数字,并用16进制表示了出来。
查看.git文件
GIt就是根据.git隐藏文件做版本管理,里面包含了 Git 用来跟踪和管理文件修改历史的所有核心数据和细节
其中 HEAD 是 Git 中一个指针,它表示当前所在的位置,可以查看HEAD是什么?可以知道它指向当前分支master,而当前分支maseter中的内容是什么呢?查询得知是最近一次提交的commit id。


commit id就是对象库中的一个git对象的索引。
通过commit id查看git对象中内容:
命令:
git cat-file -p commit id
- 查看最新commit id所指向git对象中的内容:

里面有:上一次提交的commit id,和tree 对象,还有作者是谁、是谁提交的,tree 对象是 Git 中保存目录结构的对象,它记录"这个目录里面有哪些文件和子目录"。通过进入tree对象就能一步步的找到当前版本中所有的信息。 - 查看tree对象中的内容:


管理了本目录下的文件和目录。

由于最新一次提交,正是改变了README.md文件中的内容。所以我们通过.git版本库追溯到上一个版本的README.md。

可以发现,最新一次的提交,正是删除了README.md文件中的一些信息。追溯到上一个版本后,还原了之前删除的信息。
5.状态查询:
命令 :git status
作用 :查看当前仓库的状态。告诉我们当前在哪个分支、哪些(工作区)文件被修改了、哪些文件已经暂存、哪些文件还没有提交。

Git status中的常见状态:
| 状态 | 含义 |
|---|---|
| modified | 文件被修改 |
| untracked | 新文件,Git未跟踪 |
| staged | 已进入暂存区 |
| nothing to commit | 没有需要提交的内容 |
| ahead | 本地领先远程 |
| behind | 本地落后远程 |
6.显示差异:
git diff 是 Git 的"代码变化查看器",用于在提交前确认自己改了什么。
1)显示目前工作区和暂存区之间的差异:
命令 :git diff [文件名]
作用 :查看具体代码变化。

@@ -307,6 +307,14 @@ namespace chat_server {,这是 diff 定位信息,格式:@@ -旧文件位置,旧代码数量 +新文件位置,新代码数量 @@
解释:
-307,6
旧版本:
从第307行开始
显示6行
+307,14
新版本:
从第307行开始
显示14行
2)显示暂存区和commit之间的差异
命令:git diff --cached
3)显示当前工作区和最新commit之间的差异
命令:git diff HEAD
4)比较两个版本差异
命令:git diff commit1 commit2
5)比较两个分支
命令:git diff 分支1 分支2
7.版本回退(也可回退到当前版本):
应用场景 :常用于撤销 commit、版本回退、重新整理提交;
命令 :git reset [--soft | --mixed | --hard] [HEAD]

HEAD说明:
- 可以写
commit id,表示指定退回的版本。 - HEAD表示当前版本
- HEAD^表示上一个版本
- HEAD^^表示上上一个版本,以此类推
- HEAD~0表示当前版本
- HEAD~1表示上一个版本
- HEAD~2表示上上一个版本,以此类推
注: --hard慎用,回退后,之前的所有修改代码将会丢失。--mixed是默认选项- 如果执行了
git reset --hard commit_id,后悔了怎么办?
使用git reflog命令查看本地的每一次命令。

可以使用局部的commit id,也可以回退。
版本回退的本质:

修改分支(master)指向的commit id,即完成了版本回退。
8.撤销修改
我们在开发时,发现自己写的代码很烂,或写出了很多新的BUG,想恢复到上一个版本,重新开发,这时候就需要用到撤销修改了。
撤销修改对应了三种情况:
- 只在工作区写了代码,没有提交至暂存区
- 在工作区写了代码,提交到了暂存区,但是没有提交到版本库
- 在工作区写了代码,提交到了暂存区,也提交到了版本库
解决方式 :

9.删除版本库中的文件
对于已经提交到版本库中的文件,使用rm filename,只能删除当前工作区中的文件,版本库中的文件并没有删除。
需要将删除的文件经过git add 删除的文件名,再git commit -m "delete filename"后,版本库的文件才被删除。
或则使用git rm 删除的文件名,这条命令帮我们做了两件事,一是在工作区中删除文件,二是在暂存区中删除文件。然后再执行git commit -m "delete filename",版本库的文件才被删除。
最后git push远程同步删除文件。