Git初步教程

文章目录

概述

git是大名鼎鼎的版本控制工具,会将文件的每次更新都完整地记录下来,从而让用户退回到任何一个版本。而在项目推进的过程中,文件在Git中存在三种状态

  • 已提交(committed):已经被安全地保存在本地数据库中。
  • 已修改(modified):已修改但还没保存。
  • 已暂存(staged):被修改的文件已经放在了下次提交时要保存的清单中。

这三种状态,对应三个目录/文件,分别是

  • 本地数据目录:即项目中那个名为git的默认隐藏的文件夹,这里保存着元数据和对象数据库。
  • 工作目录:从项目中取出某个版本的所有文件和目录
  • 暂存区域:一般是git文件夹中的某个文件,也叫索引文件。

本地数据目录

为了理解这三种状态和这三个目录,下面做一个简单的演示。

首先,新建一个文件夹,并通过init命令,初始化仓库。从而生成.git目录,这个git目录就是本地数据目录。

bash 复制代码
mkdir demo
cd demo
git init

dir /A:H
...
2025/12/02  09:46    <DIR>          .git

Untracked

然后,在demo下面新建一个hello.txt文件,内容随便写,比如写个hello。此时,hello.txt位于工作目录,状态则是Untracked,且最后一行提示用git add来track。之所以会出现这种情况,是因为hello.txt尚未被Git追踪过,理论上尚未进入Git的管辖范围。

bash 复制代码
git status
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

暂存区域

按照提示,将hello.txt加入到git,此时再去查看其状态,则出现了Changes to be committed,即将被提交,标明此时的状态是已暂存。括号中的提示是,使用某某指令以取消暂存(unstage),也同样说明了当前的状态是已暂存。

bash 复制代码
git add hello.txt
git status

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.txt

提交

【commit】指令即可将暂存的文件提交到本地数据库

bash 复制代码
git commit -m "first commit"
[master (root-commit) c54d388] first commit
1 file changed, 1 insertion(+)
create mode 100644 hello.txt

git status
On branch master
nothing to commit, working tree clean

其中,【-m】后面是一些备注信息,随便写。其反馈信息中,给出了hello.txt的权限模式为100644,这种记法与Linix中的文件权限位类似,100表示普通文件,644表示权限是6(rw-)、4(r--)、4(r--)。

而此时的状态则是没有文件需要commit,即所有文件都处于已提交的状态。

已修改

此时,我们将hello.txt的内容修改为Hello World,然后再去查看状态,则hello.txt不出意料地变成了modified。

bash 复制代码
git status
...
  (use "git restore <file>..." to discard changes in working directory)
        modified:   hello.txt
...

接下来再去add并commit,其状态就又变成提交了。

bash 复制代码
git add hello.txt
git commit -m "second commit"

对比文件变化

【git diff】可以对比文本差异,【HEAD~N】表示前N版的内容。当前版本与上一个版本的差异如下所示,可见diff默认是按行来对比差异的。即减掉了hello这一行,新增了hello world这一行。

bash 复制代码
git diff HEAD~1
diff --git a/hello.txt b/hello.txt
index b6fc4c6..3b18e51 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-hello
\ No newline at end of file
+hello world

滚回到上一个版本

【reset】指令可以重置版本,下面的指令,可以将工作目录滚回到上一个版本,这时打开hello.txt,里面的内容仅剩下hello了。

复制代码
git reset --hard HEAD~1

接下来故技重施,在hello.txt下面新增一行world,然后再去commit,其中【-a】表示先add,再commit,可以省略add这一步。然后通过【log】指令,查看当前所有的版本,发现"second commit"已经不见了。但是如果用【reflog】,就会重新看到。reflog默认保存90天,如果这90天之内,不再提起second commit,那么它将永远消失。

bash 复制代码
git commit -a -m "3rd"
git log --oneline
856cbac (HEAD -> master) 3rd
c54d388 first commit
git reflog
856cbac (HEAD -> master) HEAD@{0}: commit: 3rd
c54d388 HEAD@{1}: reset: moving to HEAD~1
2fe670b HEAD@{2}: commit: second commit
c54d388 HEAD@{3}: commit (initial): first commit
相关推荐
逛逛GitHub19 小时前
面壁智能开源了支持音色设计、克隆、30语言+9 种方言的语音大模型
github
摆烂且佛系20 小时前
十分钟了解Git Cherry-Pick
git
小领航20 小时前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
李同学Lino20 小时前
别再让Agent瞎写屎山代码了!带你用Superpowers重塑Vibe Coding体验(附保姆级教程)
github
HashTang20 小时前
用自然语言驱动的开源 3D 建筑设计编辑器-Aedifex
前端·github·ai编程
星渊澈21 小时前
从github上git clone 比较慢,如何解决。。
git·github
陪我去看海1 天前
JueJin-MCP:让AI帮你一键发布掘金文章
github
魔都吴所谓1 天前
【Ubuntu】离线环境下Git LFS(deb包)安装与验证完整教程
linux·git·ubuntu
REDcker1 天前
Git worktree:多工作区并行开发与实践
git·worktree
lifewange1 天前
Git版本管理
大数据·git·elasticsearch