写给新手的git教程——本地操作入门

657 阅读7分钟

前言:从零开始轻松管理你的代码

你是否经历过这样的困扰?

  • 修改了十几次代码后,突然发现昨天的版本才是正确的,却找不到备份;
  • 写了一半的功能想暂时保存,又怕覆盖之前的成果。
  • 和别人一起开发一个大型项目时频繁遭遇文件冲突和版本混乱

这些问题,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

  • 适用场景:本地新建项目,从未上传到过远程仓库。

  • 操作步骤

    1. 在电脑上新建一个文件夹(如 my-diary),右键选择“Git Bash Here”打开命令行,或者直接在vscode中打开终端。

    2. 输入命令:

      git init
      
    3. 看到提示 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
    

    image.png

    这表示 diary-2024.md 是新增文件,尚未被Git跟踪。

2. 添加文件到暂存区:git add

  • 作用:将工作区的修改“打包”到暂存区,准备提交。

  • 常用命令

    git add diary-2024.md      # 添加单个文件
    git add .                  # 添加当前目录所有修改
    

image.png

3. 永久保存:git commit

  • 作用:将暂存区的修改存入版本库,生成一个“存档点”。

  • 操作

    git commit -m "写下第一篇日记:学习Git的感悟"
    

image.png

  • 关键提示

    • 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的感悟
    

image.png

时光机——版本回退与撤销

试想这样一个场景:当你写着写着,产品经理突然告诉你说要第一版时,你一边在心里臭骂着这个朝三暮四的女人,一边在各种文件夹里翻箱倒柜,试图找到上一版存留的痕迹。

当你使用 git ,这个问题就迎刃而解了。 git 的一个强大的机制就是版本回退,只要你将代码提交到了版本库, git 就能帮你轻松回退到之前写的任意版本的代码

撤销的三种场景

根据修改所处的区域,撤销操作分为三类:

场景对应命令效果
1. 修改了文件,但未执行git add(工作区)git checkout -- <file>丢弃工作区修改,回到最近一次git commitgit add的状态
2. 执行了git add,但未提交(暂存区)git reset HEAD <file>将文件移出暂存区,保留工作区修改
3. 已经提交到版本库(版本库)git reset --hard <commit-id>回退到指定版本,丢弃后续所有修改

不少人看到这里的命令可能会对这两个命令的感到疑惑:

  • git checkout 不是切换分支的命令吗,为什么这里用来撤销了?
  • 后面两条都是git reset 两个的参数不同,git reset 这些参数应该怎么填?

对于小白来说,看到这里有这些疑问才是正常的,说明你是一个学计算机的料。对于这些问题,如果本文不作出解释,那么就是标题党了。

git checkout 的作用

git checkout 确实有三个作用:

  1. 切换分支:在不同分支之间跳转(如 main → feature)。
  2. 恢复文件:撤销工作区的修改,回到某个历史版本。
  3. 切换分支

分支的知识我们会在后面讲到,这里先简单的了解一下即可。

# 切换到已存在的分支
git checkout <branch-name>
# 示例:切换到 feature 分支
git checkout feature
  1. 恢复文件

这就是我们这里主要需要用到的功能了。

# 丢弃某个文件的未暂存修改(未执行 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 命令用于回退版本,可以指定退回某一次提交的版本。

  1. -soft 模式:仅移动 HEAD 指针
  • 作用:撤销提交,但保留工作区和暂存区的修改。

  • 适用场景:修改提交信息或合并多个提交。

  • 示例

    git reset --soft HEAD~1  # 回退到上一个提交,保留所有修改到暂存区
    
  1. -mixed 模式(默认):移动 HEAD + 重置暂存区
  • 作用:撤销提交和暂存操作,但保留工作区的修改,这也是不加参数时使用的模式。

  • 适用场景:撤销 git add 或重新整理提交内容。

  • 示例

    git reset HEAD~1          # 回退到上一个提交,修改保留在工作区
    git reset HEAD file.txt   # 将 file.txt 移出暂存区(撤销 git add)
    
  1. -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