前言:从零开始轻松管理你的代码
你是否经历过这样的困扰?
- 修改了十几次代码后,突然发现昨天的版本才是正确的,却找不到备份;
- 写了一半的功能想暂时保存,又怕覆盖之前的成果。
- 和别人一起开发一个大型项目时频繁遭遇文件冲突和版本混乱
这些问题,Git都能帮你解决!
正如标题所言,这个教程将站在一个完全新手的角度,尽可能以短的时间,教会你使用git 。本期是这个系列的第一篇,后续内容请关注这个专栏。
Git 基础配置
在开始前,先配置你的 Git 身份信息(全局有效):
git config --global user.name "Your Name"
git config --global user.email "your-email@example.com"
这一步是用来确保提交记录显示正确的作者信息。
创建你的Git仓库
在学习git的各种命令和概念之前,我们得先有一个仓库来为我们后续的学习做准备,只有在这个仓库中,我们使用各种 git 命令才会生效。
创建仓库有两种常用方式:
- 将现有文件夹转变成
git仓库 - 从远程仓库中克隆一个
git项目
接下来,我们来分别介绍一下这两种的方式。
1. 从零开始:git init
-
适用场景:本地新建项目,从未上传到过远程仓库。
-
操作步骤:
-
在电脑上新建一个文件夹(如
my-diary),右键选择“Git Bash Here”打开命令行,或者直接在vscode中打开终端。 -
输入命令:
git init -
看到提示
Initialized empty Git repository in ...表示仓库创建成功!
-
2. 克隆现有项目:git clone
-
适用场景:下载GitHub等平台上的已有项目(比如你刚刚接手的多人协作项目)。
-
操作示例:
git clone <https://github.com/user/demo-project.git>
有了一个可供实验的环境之后,我们来学习一下 git 中最基础最核心的概念。
Git的三大区域:工作区、暂存区、版本库
工作区、暂存区、版本库是git中最核心的概念,他们是git存放不同状态文件的地方,你的git仓库中的所有文件一定处于这三种状态之中,通过管理这三个区域内文件的变化来达到git的各种功能。
| 区域 | 比喻 | 对应操作 | 常用命令 |
|---|---|---|---|
| 工作区 | 你的草稿纸 | 直接编辑文件的地方 | 手动修改文件 |
| 暂存区 | 快递打包区 | 选择哪些修改需要保存 | git add |
| 版本库 | 加密保险箱 | 永久保存的历史版本 | git commit |
💡 核心逻辑:1. 在工作区写代码 → 2. 用
git add将修改打包到暂存区 → 3. 用git commit将暂存区内容存入版本库。
本地操作:从修改到保存
我们以一个日记本项目为例,学习最基础的Git命令。假设你的日记文件名为 diary-2024.md。
1. 查看状态:git status
-
作用:了解当前哪些文件被修改、是否已暂存。
-
操作:
git status -
示例输出:
On branch main Untracked files: (use "git add <file>..." to include in what will be committed) diary-2024.md这表示
diary-2024.md是新增文件,尚未被Git跟踪。
2. 添加文件到暂存区:git add
-
作用:将工作区的修改“打包”到暂存区,准备提交。
-
常用命令:
git add diary-2024.md # 添加单个文件 git add . # 添加当前目录所有修改
3. 永久保存:git commit
-
作用:将暂存区的修改存入版本库,生成一个“存档点”。
-
操作:
git commit -m "写下第一篇日记:学习Git的感悟"
-
关键提示:
m后的字符串是提交说明,必须清晰描述本次修改(如“修复登录bug”而非“更新代码”)。- 提交后,Git会生成唯一的版本号(如
d3b8f2c),可通过git log查看。
git log后的结果:
4. 查看历史:git log
-
作用:浏览所有提交记录,包括作者、时间、版本号和提交信息。
-
操作:
git log -
示例输出:
commit d3b8f2c...(版本号) Author: 你的名字 <your-email@example.com> Date: Mon May 20 10:00:00 2024 +0800 写下第一篇日记:学习Git的感悟
时光机——版本回退与撤销
试想这样一个场景:当你写着写着,产品经理突然告诉你说要第一版时,你一边在心里臭骂着这个朝三暮四的女人,一边在各种文件夹里翻箱倒柜,试图找到上一版存留的痕迹。
当你使用 git ,这个问题就迎刃而解了。 git 的一个强大的机制就是版本回退,只要你将代码提交到了版本库, git 就能帮你轻松回退到之前写的任意版本的代码
撤销的三种场景
根据修改所处的区域,撤销操作分为三类:
| 场景 | 对应命令 | 效果 |
|---|---|---|
1. 修改了文件,但未执行git add(工作区) | git checkout -- <file> | 丢弃工作区修改,回到最近一次git commit或git add的状态 |
2. 执行了git add,但未提交(暂存区) | git reset HEAD <file> | 将文件移出暂存区,保留工作区修改 |
| 3. 已经提交到版本库(版本库) | git reset --hard <commit-id> | 回退到指定版本,丢弃后续所有修改 |
不少人看到这里的命令可能会对这两个命令的感到疑惑:
- git checkout 不是切换分支的命令吗,为什么这里用来撤销了?
- 后面两条都是git reset 两个的参数不同,git reset 这些参数应该怎么填?
对于小白来说,看到这里有这些疑问才是正常的,说明你是一个学计算机的料。对于这些问题,如果本文不作出解释,那么就是标题党了。
git checkout 的作用
git checkout 确实有三个作用:
- 切换分支:在不同分支之间跳转(如
main→feature)。 - 恢复文件:撤销工作区的修改,回到某个历史版本。
- 切换分支
分支的知识我们会在后面讲到,这里先简单的了解一下即可。
# 切换到已存在的分支
git checkout <branch-name>
# 示例:切换到 feature 分支
git checkout feature
- 恢复文件
这就是我们这里主要需要用到的功能了。
# 丢弃某个文件的未暂存修改(未执行 git add)
git checkout -- <file>
# 示例:撤销 README.md 的修改
git checkout -- README.md
| 命令 | 作用 | 实例 |
|---|---|---|
git checkout -- <file> | 撤销文件未暂存的修改 | git checkout -- README.md |
git checkout -b <new-branch> | 切换到新的分支 | git checkout -b dev |
git reset 的三种模式
git reset 命令用于回退版本,可以指定退回某一次提交的版本。
-soft模式:仅移动 HEAD 指针
-
作用:撤销提交,但保留工作区和暂存区的修改。
-
适用场景:修改提交信息或合并多个提交。
-
示例:
git reset --soft HEAD~1 # 回退到上一个提交,保留所有修改到暂存区
-mixed模式(默认):移动 HEAD + 重置暂存区
-
作用:撤销提交和暂存操作,但保留工作区的修改,这也是不加参数时使用的模式。
-
适用场景:撤销
git add或重新整理提交内容。 -
示例:
git reset HEAD~1 # 回退到上一个提交,修改保留在工作区 git reset HEAD file.txt # 将 file.txt 移出暂存区(撤销 git add)
-hard模式:彻底重置
-
作用:移动 HEAD + 重置暂存区和工作区,丢弃所有修改。
-
适用场景:彻底放弃当前所有未提交的代码。
-
示例:
git reset --hard HEAD~3 # 回退到前3个提交,丢弃后续所有修改 git reset --hard a1b2c3d # 回退到指定 commit-id
总结一下 :
| 命令 | 作用 | 实例 |
|---|---|---|
git reset --soft <commit-id> | 撤销提交,但保留工作区和暂存区的修改 | git reset --soft HEAD~1 |
git reset --mixin <commit-id> | 撤销 git add 或重新提交内容 | git reset HEAD~1 |
git reset --hard <commit-id> | 彻底放弃当前所有未提交的代码。 | git reset --hard HEAD~3 |