Git : 基本操作
Git : 基本操作
- 一、Git 初识
- 二、Git 安装
- Linux-centos
- Linux-ubuntu
- 三、Git 基本操作
- 3.1 创建 Git 本地仓库 git init
- 3.2 配置Git git config
- 3.3 认识工作区、暂存区、版本库
- 3.4 git log 使用场景
- 3.5 查看 .git 文件
- 3.6 查看库的状态/改动
- 查看仓库状态 `git status`
- 查看具体修改内容 `git diff`
- 3.7 版本回退与撤销修改
- 1. `git reset` 命令语法
- 2. 示例:下面场景的最终目的都是 回退工作区文件到上一个版本
- 回退示例 / git reflog的使用
- 场景一:工作区修改(未 add)/ git checkout的使用
- 场景二: 已 add,未 commit
- 场景三:已 commit,未推送远程
- 3.8 删除文件
- 删除方法一
- 删除方法二
一、Git 初识
为了能够更方便我们管理这些不同版本的文件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个管理系统,同时也方便多⼈协同作业。
目前最主流的版本控制工具是 Git。Git 可以管理计算机上的各种类型的文件,例如:.doc、.xlsx、.dwg、.dgn、.rvt 等格式。对于我们开发人员来说,Git 最重要的作用是:高效地管理软件开发项目中的源代码文件。
注意事项
还需要再明确一点,所有的版本控制系统,Git 也不例外,其实只能跟踪文本文件的改动,比如 TXT 文件、网页文件、所有的程序代码等等。版本控制系统可以告诉你每次的改动,比如在第 5 行加了一个单词 “Linux”,在第 8 行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的具体变化,只能把二进制文件每次改动串起来。也就是说,只能知道图片从 100KB 变成了 120KB,但到底改了什么,版本控制系统不知道,也没法知道。
二、Git 安装
Git 是一个开放源代码的代码托管工具,最早在 Linux 平台下开发。起初只能应用于 Linux,后来逐渐被移植到 Windows 平台。现在,Git 可以在 Linux、Unix、Mac 和 Windows 这几大主流平台上正常运行。
Linux-centos
首先,你可以尝试在终端输入 git,看看系统是否已经安装了 Git
如果你的的平台是centos,安装git相当简单,以我的centos7.6为例:
安装 Git:
sudo yum -y install git
查看 Git 安装的版本:
git --version
Linux-ubuntu
如果你的的平台是ubuntu,安装git相当简单,以我的ubuntu20.04为例:
安装 Git:
sudo apt-get install git -y
查看 git 安装的版本:
git --version
三、Git 基本操作
3.1 创建 Git 本地仓库 git init
仓库 是进行版本控制的一个文件目录。如果我们想对文件进行版本控制,就必须先创建一个仓库。
创建 Git 本地仓库的命令为git init
注意,该命令需要在目标文件目录下执行,例如:
[xrw@iZ7xv0vjzfc2mzsasssfooZ ~]$ cd git_practice/
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git init
Initialized empty Git repository in /home/xrw/git_practice/.git/
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ ls -al
total 12
drwxrwxr-x 3 xrw xrw 4096 Aug 15 02:36 .
drwx------ 13 xrw xrw 4096 Aug 15 02:29 ..
drwxrwxr-x 7 xrw xrw 4096 Aug 15 02:36 .git
我们会发现,在当前目录下多了一个 .git
隐藏目录。 该目录是 Git 用来跟踪和管理仓库的,不要手动修改 其中的文件。 如果随意更改,可能会破坏 Git 仓库的结构,从而导致版本控制功能失效。
3.2 配置Git git config
当安装 Git 后,首先要做的事情是设置你的 用户名 和 电子邮箱地址。 这是非常重要的,因为每一次提交都会使用这些信息来记录作者身份。
配置命令为:
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱地址"
其中,--global
是一个可选参数。 如果使用了该参数,表示这台机器上 所有 的 Git 仓库都会使用该配置。 如果你希望在不同的仓库中使用不同的 name
或 email
,可以不要 --global
选项。 但需要注意,此时执行命令时必须在对应的仓库目录中进行。
查看配置命令为:
git config -l
删除对应的配置项(–global 为可选参数):
git config [--global] --unset user.name
git config [--global] --unset user.email
3.3 认识工作区、暂存区、版本库
-
工作区(Working Directory):
你在电脑上用来编写代码或编辑文件的目录。 -
暂存区(Stage / Index):
暂存区一般存放在.git
目录下的index
文件(即.git/index
)中。
暂存区有时也被称为 索引(Index)。 -
版本库(Repository):
又名 仓库(Repository)。
工作区中有一个隐藏目录.git
,它不属于工作区,而是 Git 的版本库。
在版本库中,所有文件都可以被 Git 管理,每一次修改或删除都会被记录,以便随时追踪历史,或者在未来将文件“还原”到之前的状态。
下面这个图展示了工作区、暂存区和版本库之间的关系:
-
工作区与版本库
- 图中左侧为工作区,右侧为版本库。
- Git 的版本库里存了很多东西,其中最重要的就是 暂存区(Staging Area)。
-
初始化 Git 版本库
- 在创建 Git 版本库时,Git 会自动创建一个唯一的
master
分支。 - Git 会创建一个指向
master
的指针,叫 HEAD。(分支和 HEAD 的概念后面会详细讲)
- 在创建 Git 版本库时,Git 会自动创建一个唯一的
-
工作区与暂存区
- 当对工作区修改(或新增)的文件执行
git add
命令时,暂存区目录树的文件索引会被更新。
- 当对工作区修改(或新增)的文件执行
-
提交操作
- 当执行提交操作
git commit
时,master
分支会相应更新。 - 可以简单理解为:只有暂存区的目录树才会真正写入版本库。
- 当执行提交操作
工作区新增文件 ≠ 仓库新增文件
- 通过新建或粘贴进目录的文件,并不能称之为向 仓库 中新增文件,只是在 工作区 中新增了文件。
- 必须使用
git add
和git commit
命令,才能将文件添加到 版本库 中进行管理。
3.4 git log 使用场景
-
多次
git add
,一次git commit
- 我们可以多次
add
不同的文件,然后只执行一次commit
来提交所有文件。 - 原因:所有需要提交的文件都被 add 到暂存区,然后一次性
commit
暂存区的所有修改。
- 我们可以多次
-
示例操作
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ touch file1 file2 file3
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git add file1
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git add file2 file3
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git commit -m "add 3 files"
[master (root-commit) bbd82a4] add 3 files3 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 file1create mode 100644 file2create mode 100644 file3
- 查看历史提交记录
- 截至目前,我们已经可以将代码直接提交到本地仓库。
- 可以使用
git log
命令查看历史提交记录。
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git log
commit bbd82a4aad15d44e0e0bc5cd0840755dbc009b19
Author: R.L <2512485314@qq.com>
Date: Fri Aug 15 03:09:02 2025 +0800add 3 files
-
说明:
-
git log
会从最近的提交显示到最早的提交。 -
可以看到每次
commit
时的日志消息、作者、日期等信息。
-
如果输出信息太多,可以加上 --pretty=oneline 参数让每条提交显示在一行:
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git log --pretty=oneline
bbd82a4aad15d44e0e0bc5cd0840755dbc009b19 add 3 files
-
commit id :
-
每次提交都有一个唯一的 commit id(版本号),类似
23807c5...56eed6
-
不是递增数字,而是通过
SHA1
算法生成 的十六进制数。 -
每个用户看到的
commit id
都不同。
-
3.5 查看 .git 文件
先来看看我们的 .git
的目录结构:
.git
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 95
│ │ └── 99fdeb034597d90d72d2f58396dee096885b79
│ ├── bb
│ │ └── d82a4aad15d44e0e0bc5cd0840755dbc009b19
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs├── heads│ └── master└── tags
-
index(暂存区)
index
就是 Git 的 暂存区(Staging Area)。- 执行
git add
后,文件的修改会被 添加到暂存区,等待下一次提交。
-
HEAD
HEAD
是 Git 中的一个 指针。- 默认情况下,
HEAD
指向 master 分支(或当前分支)。 - 它表示 当前工作区所基于的提交位置。
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ cat .git/HEAD
ref: refs/heads/master
- 默认分支 master
- Git 初始化仓库时,会自动创建一个默认分支
master
。 master
分支其实是一个指向最新提交的 指针。
- Git 初始化仓库时,会自动创建一个默认分支
查看 master 指向
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ cat .git/refs/heads/master
bbd82a4aad15d44e0e0bc5cd0840755dbc009b19
-
说明
-
打印出的
bbd82a4aad15d44e0e0bc5cd0840755dbc009b19
是当前 master 分支最新的 commit id。 -
每次提交时,
master
分支都会更新指向最新的commit
。
-
- Git 对象库(objects)
.git/objects
是 Git 的 对象库,存放了 Git 管理的所有内容。- 当执行
git add
时:- 暂存区(index)被更新。
- 工作区修改(或新增)的文件内容被写入对象库,生成新的对象文件。
- 查看对象库目录:
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ ls .git/objects/
95 bb e6 info pack
-
查找对象时,将 commit id 分成两部分:
- 前 2 位作为文件夹名 - 后 38 位作为文件名
-
查看对象内容
- 使用
git cat-file -p <commit-idsd1>
可以查看对象内容:
- 使用
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git cat-file -p bbd82a4aad15d44e0e0bc5cd0840755dbc009b19
tree 9599fdeb034597d90d72d2f58396dee096885b79
author R.L <2512485314@qq.com> 1755198542 +0800
committer R.L <2512485314@qq.com> 1755198542 +0800add 3 files
tree <tree-id>
表示提交的目录树,可以继续查看:
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git cat-file -p 9599fdeb034597d90d72d2f58396dee096885b79
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file3
- 最终可以查看文件内容:
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$
由于我没有写入任何东西所有这里什么都没有显示,正常的就是查看文件的内容
-
本地 Git 仓库中重要的文件/目录
index
:暂存区,git add 后更新。HEAD
:指向当前分支(默认 master)的指针。refs/heads/master
:保存 master 分支的最新 commit id。objects
:包含 Git 创建的各种对象及内容,相当于 Git 维护的所有修改记录。
3.6 查看库的状态/改动
- Git 跟踪的是修改,而不是文件
- 什么是修改?
- 新增一行
- 删除一行
- 修改某些字符
- 删除又新增
- 创建新文件
- Git 的优势在于精确跟踪这些修改。
- 什么是修改?
示例:修改 ReadMe
文件
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ cat ReadMe
hello git
hello git
hello world
此时,仓库中的 ReadMe
与工作区不同。
查看仓库状态 git status
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
输出说明:ReadMe 被修改过,但还没有添加到暂存区或提交。
查看具体修改内容 git diff
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index f54bdb1..6b15c4f 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@hello githello git
+hello world
git diff [file]:显示 工作区与暂存区 的差异。
git diff HEAD -- [file]:显示 工作区与版本库 的差异。
知道了对 ReadMe 做了什么修改后,再把它提交到本地仓库就放心多了。我们可以直接git add 和 git commit 操作 将ReaMe 提交到版本库中去。
3.7 版本回退与撤销修改
Git 能够管理文件的历史版本,如果某次提交出现了问题,可以通过 git reset
将版本回退到指定提交。
1. git reset
命令语法
git reset [--soft | --mixed | --hard] [HEAD]
-
–soft
仅版本库回退,暂存区和工作区保持不变。 -
–mixed(默认)
回退暂存区内容为指定版本,工作区文件保持不变。 -
–hard
版本库、暂存区和工作区全部回退到指定版本。
⚠️ 注意:会丢失工作区未提交的代码。 -
HEAD 说明
- commit id:指定退回的版本
- HEAD:当前版本
- HEAD^:上一个版本
- HEAD^^:上上一个版本
- HEAD~n:往上第 n 个版本(如 HEAD~3 表示往上 3 个版本)
2. 示例:下面场景的最终目的都是 回退工作区文件到上一个版本
回退示例 / git reflog的使用
依次提交了 3 个版本(version1、version2、version3),日志如下:
git log --pretty=oneline
d95c13f (HEAD -> master) add version3
14c12c3 add version2
cff9d1e add version1
回退到 version2:
git reset --hard 14c12c3
当我们又再次向回退到version3时,可以使用【git reflog】命令查看来查看 HEAD 和分支的历史移动记录。
但是在实际开发中,由于长时间的开发了,
导致 commit id 早就找不到了,可突然某一天,我又想回退到 version3,那该如何操作呢?貌似现在不可能了。
回退到version3:
git reflog
14c12c3 (HEAD -> master) HEAD@{0}: reset: moving to 14c12c3
d95c13f HEAD@{1}: commit: add version3
14c12c3 HEAD@{2}: commit: add version2
cff9d1e HEAD@{3}: commit: add version1
git reset --hard d95c13f
场景一:工作区修改(未 add)/ git checkout的使用
git checkout -- <file>
文件回到最近一次 add 或 commit 的状态。
⚠️ – 不能省略
场景二: 已 add,未 commit
撤销暂存区:
git reset HEAD <file>
然后丢弃工作区修改:
git checkout -- <file>
场景三:已 commit,未推送远程
回退到上一个版本:
git reset --hard HEAD^
⚠️ 如果已推送到远程,不要使用此方法。
模式 | HEAD 指针 | 暂存区 (Index) | 工作区 (Working Directory) | 常见用途 |
---|---|---|---|---|
--soft | 移动到指定提交 | 不变 | 不变 | 回退提交,但保留改动在 暂存区,方便重新提交 |
--mixed (默认) | 移动到指定提交 | 重置为指定提交状态 | 不变 | 回退提交,清空暂存区,但保留工作区改动 |
--hard | 移动到指定提交 | 重置为指定提交状态 | 重置为指定提交状态 | 回退提交并丢弃所有未保存的改动 |
3.8 删除文件
在 Git 中,删除文件也是一种修改操作。下面通过实战来说明如何删除文件。
删除方法一
先删除工作区文件,再git add,然后再git commit即可
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ ls
file1 file2 file3 file4 file5 ReadMe
如果直接在工作区删除文件:
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ rm file5
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git status
On branch master
Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)deleted: file5
no changes added to commit (use "git add" and/or "git commit -a")
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git add file5
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git commit -m "delete file5"
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git status
On branch master
nothing to commit, working tree clean
删除方法二
使用 git rm [filename] 同时从 工作区和版本库 删除,然后再git commit即可。
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git rm file5
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted: file5
[xrw@iZ7xv0vjzfc2mzsasssfooZ git_practice]$ git commit -m "deleted file5"