Git学习笔记(一)

55 阅读11分钟

概述

Git是一个分布式版本控制系统,在多人协同开发中有很重要的用途。在实际的开发工作中,不论是我们自己独立开发,还是和其他的同事一起开发,开发过程中的流程管理都非常重要,你总不想体验改代码改了无数版,最后发现还是第一版好用结果找不到当初的内容时的那种绝望吧?Git就是这样一个管家,来帮助开发者管理代码的版本,避免上述这个问题,当然,这只是Git的最重要的功能之一。本文是笔者早期学习Git时记录的一些笔记,也参考了网络上很多老师的文档、视频等,如有误欢迎大家勘误,不吝感激。

Git的安装与初始化

在这里不过多介绍这一部分,不同平台的安装教程不尽相同。比如在Linux平台,大多数系统都可以通过包管理工具直接安装,如Ubuntu下可以使用sudo apt-get install git命令来安装git,其他发行版比如RedHat可以使用sudo yum install git命令安装Git,或者下载源码,在本地进行编译安装。而在其他平台,如Windows,可以直接在Git官网下载安装程序,按照提示一步步安装即可。笔者使用Ubuntu开发较多,本文也是基于Ubuntu梳理的教程,不同平台Git的使用方法基本一致。

1. 配置Git

安装好Git之后,在任意终端输入

git config --global user.name "Your Name"   //设置用户的名称
git config --global user.email "email@example.com"  //设置用户的邮箱

--global参数表示在这台机器上,所有Git仓库都会使用这个配置(名称和邮箱),这是你提交代码时的身份证。

2.初始化仓库

新建一个工作目录git_ws,在目录下打开终端,输入git init,初始化本地仓库,将普通的目录变为通过Git管理的工作目录。可以看到,目录下多了一个.git文件(需要设置显示隐藏目录才能看到)

image.png

Git的使用教程

1、简介

在学习使用Git之前,需要先了解Git相关的一些概念。

  • 远程仓库:即托管在网络上的仓库,比如GitHub、Gitee等,所有的文件都在云端存储,每个人可以从云端拉取(pull)一份文件到本地仓库,然后在本地进行修改,修改完成后可以推送(push)到远程仓库。
  • 本地仓库:即在本地进行代码的管理,你的文件只会保存在本地的电脑上。

对于本地仓库,还有以下相关概念:

  • 工作区:即本地的工作文件夹。一般的项目开发会新建一个文件夹,项目代码、文件等等都会存放在项目文件夹下,将这个文件夹初始化为Git管理的本地仓库之后,这些看得见、摸得着的文件就是处于工作区,在编辑器中打开项目、修改代码、添加新文件、删除旧文件,都是在工作区内进行操作。
  • 暂存区:暂存区可以看作是一个“中转站”。当你对工作区中的文件做出修改后,如果你觉得这些改动已经完成并且准备好要提交,就可以把这些文件添加(add)到暂存区。在下一次提交时,就会将暂存区的所有修改一次性提交。
  • 版本库:版本库指的就是记录项目所有版本快照和历史变更的地方。你可以把它理解为一个记事本,里面记载着每一次提交(commit)的完整记录,这些记录包括了文件的内容,还包含了提交信息、作者信息、提交时间、父子关系等元数据。

各种概念之间的关系如下图所示:

image.png

2、基本流程

(1)添加与提交

初始化工作文件夹之后,我们先添加一个文件,来模拟使用Git来进行版本管理、协同开发的流程。

新建test.txt文件,在文件中写入“[Fir] add new file...”。

第一步,通过git add命令将文件添加到暂存区,git add命令使用方法如下:

git add <file>  //添加某个文件到暂存区
git add <file1> <file2> <file3> ...    //添加多个文件
git add .    //添加所有改动的文件
git add -A/--all   //添加所有改动的文件,包括删除的文件

在这里我们直接使用git add test.txt将文件添加到暂存区。

第二步,通过git commit命令将文件提交到本地仓库。git commit命令使用方法如下:

git commit -m "commit_description"    //提交暂存区所有的修改到本地仓库,-m参数表示添加描述

//如果本次修改内容较多,需要很详细的描述,可以直接提交
git commit
//会打开一个编辑器(默认是vim),在这里可以详细说明,最后保存退出即可

git commit -a -m "commit_description"    //同时add和commit

在这里,使用git commit -m "first commit"提交本次修改。

到此,已经是一个基本的工作流程,修改文件->提交修改。

第三步,我们继续修改test.txt文件,在文件中写入[Sec] modify test.txt..。此时,我们对文件进行了一次修改且尚未提交本次修改,可以通过git status命令查看当前仓库的状态,git status命令使用方法如下:

git status    //返回当前仓库的状态

执行git status命令后,终端会输出: image.png

可以看到,Git提示我们这几点:

  • 当前的分支是master分支:On branch master
  • 有修改未添加到暂存区:Changes not staged for commit:
  • 修改的文件:modified:test.txt

对应我们在test文件添加了内容,但是没有重新addcommit。这时,我们再add一下test文件,在使用status查看一下会输出什么:

image.png

可以看到,此时Git提示我们Changes to be commited:modified:test.txt,即test文件发生了变动,但是还没有提交到本地仓库。我们再次修改test文件:添加[Thi] modify test.txt...,再使用status命令查看一下:

image.png

可以看到,Git提示我们test文件有改动,并且没有添加到暂存区,也没有提交。现在,可以将test添加并提交到本地仓库了:git commit -a -m "second commit"。

我们已经提交了两次修改,可以通过git log命令来查看提交的历史,详细的用法如下:

git log    //查看提交历史
git log --oneline    //单行显示提交历史
git log -n num    //按时间倒序显示前num交记录
git log <file>    //查看file_name这个文件的提交记录
git log -p    //显示每次提交的具体改动内uint8_t _buff[MAX_HDNET_DATA_LEN];
    RingBuff<uint8_t, MAX_HDNET_DATA_LEN> _recv_ringbuff;
    uint16_t _data_len;
    uint16_t _crc_val;
    SHDNetMsg _recv_msg;
    uint16_t _seq_number;容
git log --oneline --graph --all    //图形化显示
。。。(除了以上比较常用参数外,还有很多可选参数,需要时可以自行上网查询)

我们使用git log命令查看一下我们的提交记录:

image.png

按照时间倒序排序,最近的提交记录显示在最上方。可以看到几条关键信息:

  • 提交id:commit 83cbaXXXXXXXXX
  • 提交的用户名和用户邮箱以及时间
  • 提交时的描述

有了addcommit命令,就能完成一次完整的提交流程。

status命令可以显示工作区的内容是否被修改、哪些文件被修改,但是却无法显示具体修改了那些地方,如果某两次提交之间间隔了很久,比如(五一假期结束,我已经忘记接下来要写哪些内容了),就需要使用到diff命令来查看具体的修改内容。详细用法如下:

git diff    //查看工作区与暂存区的改动,即与上一次add之后的文件进行对比
git diff --staged    //查看暂存区与提交的改动,即将最新add的文件和最新commit的文件进行对比
git diff HEAD    //查看工作区与提交的改动,即将工作区与最新commit的文件进行对比
git diff <commit>    //比较工作区与某一次commit之间的差异,需要commit的id,可以通过log命令查找
git diff <commit1> <commit2>    //比较两次commit之间的差异
git diff <branch1> <branch2>    //比较两个分支之间的差异,分支的具体概念后面会提到
git diff --staged <commit>    //比较暂存区与某一次提交
git diff HEAD^ HEAD    //对比最新一次commit与上一次commit
git diff file/-- file   //显示指定文件的改动
git diff -- src/    //显示指定目录的改动

继续修改test.txt文件,添加下面的句子:[Thi]modify test.txt...。使用git diff命令,看看会输出什么:

image.png

可以看到,终端输出了test.txt文件的修改,对比上一次add的内容,增加了一行+[Thi]mdify test.txt...。我们add一下,在通过diff命令查看输出:

image.png

可以看到,使用git diff命令没有输出,因为我们已经add了文件,工作区和暂存区的内容是一样的,但是我们没有commit文件,所以暂存区和最近的提交之间有不同。


(2)版本回退

但是你知道的,生活中总是几多风雨。某一次add或者commit错误的内容时,如何撤回错误的内容呢?这时,可以使用git reset命令回退到之前的版本,git reset命令用法如下:

git reset <file>    //如果添加了错误的文件到暂存区,撤回该文件,工作区保持不变
git reset --soft HEAD~1    //回退到上一次commit,改动保留在暂存区,也可以写成HEAD^1
git reset --hard HEAD~1    //回退到上一次commit,改动不保留,工作区文件会恢复到上一次提交时的状态,需要谨慎,避免丢失没有保存的记录

同时,可以注意到,每次提交都会生成id,这个id在进行版本回退时非常关键,可以通过reset命令回退到指定版本,比如:

git reset --hard commit_id    //回退到指定版本的提交,工作区文件也会恢复到对应版本。
git reset --hard HEAD^100    //回退100次提交,如果你愿意的话

由此也可以看出每次commit的说明有多重要——commit id在很多地方都会用到,如果没有清晰的commit description,很难在众多commit记录中,找到需要的那一次commit

同理,只要有了commit id,就能任意切换版本,所以如果当前处在“过去”的某一个commit记录,也可以通过commit id前进到“未来”的某一个commit记录。记住,提交的的记录可以通过git log或者git reflog找回来。

(3)管理修改

git管理的是修改,修改包含很多内容,修改一行内容、增加几个字母、删除一段文字、新增一个文件、移除旧文件……等等,这些都是修改。以test.txt为例,来做一个实验:

在文件中增加一句话:[Fou]modify test.txt...,然后add,再增加一句话:[Fif]modify test.txt...,然后commit,查看一下状态:

截图 2025-06-05 10-08-01.png

(注意看这里的git restore,后面要考!!!)

我们都已经commit了为什么还会有这个提示呢?看下文件的差异:

image.png

发现我们后面一句话没有被提交上去!为什么?这正说明git管理的是修改,而不是文件。我们修改了两次,但是第二次并没有add,所以commit的时候只把第一次add的修改提交上去了,而不是把整个文件提交。

接下来自然而然就是管理修改了,如果写错了内容怎么撤销修改呢?

  1. 仅仅在本地工作区写了错误的内容,没有addcommit
git restore <file>    //丢弃文件自上一次add/commit之后的所有改动,也就是说恢复到上一次add/commit的状态。
git checkout -- <file> //同上
  1. 已经把错误的内容add,可以通过git reset撤销暂存区的修改,然后就可以restore或者checkout错误的内容了。

删除文件也是一次修改,所以操作方式差不多。git cehckout的本质就是将版本库里的版本替换工作去的版本,也就是恢复到上一次commit的版本。

掌握这些基础的命令之后,在本地使用Git进行版本管理已经足够。下一篇会更新远程仓库的具体操作教程。敬请期待!


(笔者水平有限,很多内容是自己在学习过程中的痕迹,如有错误还望海涵,也欢迎各位同仁勘误,感激不尽🤝)