> 技术文档 > 【git——上】

【git——上】


声明

本篇文章仅适用于git的上手(最好自己操作一遍,容易踩的坑和易忽略的点也是让主包误打误撞试的差不多了…)与回顾,不包含软件的下载等其他内容。
话不多说,开干!

基础命令(概览)

  • 仓库初始化
    git init 在当前目录创建新的Git仓库
    git clone 克隆远程仓库到本地
  • 文件操作
    git add 添加所有修改文件到暂存区
    git commit -m “message”提交暂存区文件到本地仓库并附加描述 (m是message的缩写,上面的message是描述的内容)
    git status 查看工作区和暂存区状态
  • 版本管理及描述的内容
    git log查看提交历史(日志)
    git diff查看未暂存的修改内容
    git checkout 切换到特定提交版本
  • 分支管理
    git branch查看分支
    git branch [name]创建新分支
    git checkout 切换到指定分支
    git merge 合并指定分支到当前分支
    git branch -d 删除本地分支
  • 远程协作
    git remote 查看远程仓库
    git remote add 添加远程仓库别名
    git push 推送本地分支到远程仓库
    git pull 拉取远程分支并合并到当前分支
    git clone 从远程仓库克隆

    git fetch下载远程仓库最新变动但不合并
  • 撤销操作
    git reset (要取消暂存的文件名) 将暂存区的文件取消暂存
    git reset --hard (要回退到的文件版本号)切换到指定提交版本
    git restore 撤销工作区文件的修改
    git rm --cached 从暂存区移除文件(保留工作区文件)

git仓库的获取

如未填写个人信息比如昵称、邮箱,或绑定电话号码(gitee需要),整就完事儿了~

方法1.从本地初始化一个git仓库

执行步骤如下:
(1)在任意目录下创建一个空目录(例如repo1)作为我们的本地Git仓库
(2)进入这个目录中,点击右键打开Git bash窗口
(3)执行命令

git init

如果在当前目录中看到.git文件夹(此文件夹为隐藏文件夹,如果看不到先更改一下设置试试,方法2中也有演示),则说明Git仓库创建成功。

方法2.从远程仓库获取

复制gitee创建的一个仓库地址(没有就创建一个)。
执行步骤如下:
(1)在任意目录下(例如git_demo)创建一个空目录(例如git02)作为我们的本地Git仓库
(2)在此目录中,点击右键打开Git bash窗口
(3)执行命令

git clone 仓库地址

如果在当前目录中看到与所选gitee的仓库名字相同的文件夹(此文件夹为隐藏文件夹)则说明Git仓库获取成功。
如果没看到,也许不是创建失败,尝试:查看->隐藏文件夹,勾选上。
【git——上】

工作区(Working Directory)、暂存区(Staging Area)和版本库(Repository)是 Git 版本控制系统的三个核心组成部分,它们分别对应不同的文件状态和操作流程。下面就让我们深入了解一番~

工作区(Working Directory)

(包含.git文件夹的目录就是工作区,也是工作目录,主要用于存放开放的代码)

【git——上】
若此目录下创建了新文件,该新文件也属于工作区。
【git——上】

工作区文件状态
  1. 未跟踪(Untracked)
    新创建的文件尚未被版本控制系统管理(仅存在于工作区),不会出现在提交记录中。

  2. 已修改(Modified)
    文件被修改但未暂存,变更尚未准备提交。

  3. 已暂存(Staged)
    文件修改被标记为准备提交的状态,可通过git add实现。

  4. 未修改(Unmodified)
    文件与最后一次提交的版本一致,无任何变更。

工作区是用户直接编辑文件的目录,包含项目所有的文件和子目录。它是本地文件系统中可见的部分所有修改在此进行。工作区的文件状态分为:未跟踪(Untracked)、已修改(Modified)或未修改(Unchanged)。

暂存区 (Staging Area / Index)

也就是.git文件夹里的index文件,是临时保存修改文件的地方
若无修改文件,目录中则没有此文件。

版本库(Repository)

.git文件夹就是版本库,版本库中存储了配置、日志、文件版本等信息

本地仓库的基本操作

【git——上】

一.提交工作区文件到暂存区(git add)

工作区新建的文件也算是修改文件。

.git文件所在目录空白处点击右键->Open Git Bash here,打开Git Bash 终端窗口后输入git add a.txt(即将添加至暂存区的文件的名称)后回车。
【git——上】
这样再打开.git文件时才会看到新增的index文件。
【git——上】

暂存区是介于工作区和版本库之间的缓冲区域,用于标记哪些变更将被提交到版本库。通过 git add 将工作区的修改添加到暂存区,暂存区的文件状态变为“已暂存”(Staged)。

二.提交暂存区文件到本地仓库(git commit)

添加到暂存区后仍是在Git Bash 终端窗口中输入:
git commit -m ‘……(描述内容,比如做了哪些改动)’ a.txt(即将添加到版本库的文件名称,所在文件夹仅这一个未提交的文件时可省略)
【git——上】

版本库存储项目的完整历史记录和元数据。提交(Commit)操作将暂存区的变更永久保存到版本库中,生成一个新的版本节点。版本库包含分支、标签和提交历史。

完成以上操作以后,在窗口中输入git status查看工作区和暂存区状态
【git——上】
这里显示没有可提交的东西,由于.git文件所在文件夹下仅有一个除自身之外的a文件,且a文件已完成了提交操作。此时再建一个文件夹b(和文件夹a在一个目录)并输入文件内容,重复查看状态的操作:
【git——上】
由目录中的工作区文件状态可知窗口显示检测到了b文件仅存在于工作区,并给出下一步需进行git add的提示。
根据提示进行下一步:
【git——上】
此时b.txt进入了暂存区,再次重复查看状态操作进行验证:
【git——上】
验证成功,当前状态是Staged(暂存状态),括号里面的语句还提供了取消暂存的方法。再将b.txt提交到版本库:
【git——上】
验证成功,继续重复查看状态操作:
【git——上】
此时又回到了无可提交文件的状态。不妨想一想这两个文件的内容提交后再修改会发生什么,从哪一步开始提交呢?
每个工作区的文件添加到暂存区只需要操作一次,也就是说后期进行内容的修改后不需要add,直接commit就可以了。进程如下:

修改a.txt并进行查看状态操作
【git——上】
这里modified表明a文件已经添加到暂存区且进行了修改,所以不用进行add操作。
【git——上】 1 deletion(-):删除之前的文件
2 insertions(+): 添加新版本的文件

除了已经提到的add,commit的本地仓库操作,主要的还有log,reset

三. 查看日志(git log)

【git——上】
输入git log,会展示所以提交记录,包括版本号(可用于回退)、提交人、提交日期。
如果日志太多又退不出来,按‘q’就可以了。

四. 回退(git reset)

加入暂存区后,若想撤销暂存(只能撤销还未进行commit操作的文件),可输入git reset 进行回退:
【git——上】

  • 从暂存区回退到工作区
1. 未commit过的新文件

在缓存区的文件都能直接进行回退操作,这里是在第一个git status执行完之后新创建一个d.txt,因此在第二次git status后提示新增的d.txt未进入暂存区;
输入git add d.txt进入暂存区后再次(第三次)通过status查看文件状态;
验证成功后进行reset回退,再次(第四次)查看文件状态。

【git——上】
回退成功后还可按老方法使d.txt重新回到存储器,再查看文件状态验证操作是否成功。
【git——上】

2. 已经commit但又更改内容的文件

(内容更改产生新版本号,对应的新版本需重新add)
基本操作前面
修改a.txt后:
【git——上】
status后指出a.txt做了修改且需add操作,然后add a.txt,最后查看文件状态。
此时新版本只进入了暂存区,以下操作同回退的方法1相同,不再讲述。

【git——上】【git——上】
回退后将修改的文件a.txt和撤销回退返回暂存区的d.txt一同commit进版本库。

【git——上】

  • 回退到某一版本

git reset --hard (要回退到的文件版本号): 回退到指定提交版本。
回退后还能根据message提示返回来(操作同上),这里就不展示图片了。

远程仓库操作

这里声明一下:
git01是采用git仓库的获取1的方法创建的;
git02是采用git仓库的获取2的方法创建的,git02所在的目录中可看到与所选gitee的仓库名字相同的文件夹,这里仓库名字为test-kong;
因此现在直接打开git02, 与git01(本地仓库)相比,打开后多了一个与所选gitee的仓库名字相同的文件夹(test-kong)。
【git——上】

1.查看远程仓库状态(git remote)

在此目录下打开Git Bash 终端窗口(目录空白处点击右键->Open Git Bash here,再提示yi遍),输入:git remote查看远程仓库状态,会出现origin;

origin是Git默认分配给远程仓库的别名(alias),通常指向项目最初克隆(git clone)时来源的远程仓库地址。它是一个简短的标识符,用于代替完整的远程仓库URL!

查看远程仓库地址(git remote -v)

输入git remote -v查看仓库地址
【git——上】
以上操作在git01中操作是没有对应结果的,一个本地仓库最多关联一个远程仓库,那么下面就来展示一下本地文件是如何关联到远程仓库的:

2.添加远程仓库(git remote add)

首先需要再建一个gitee仓库,创建完成之后会展示仓库地址:
【git——上】
地址下面圈出的可以直接复制到刚刚打开的Git Bash 终端窗口,将这个新建的远程仓库(test-00)关联到本地仓库(git01)。

git remote add origin https://gitee.com/xiaoningZjing/test-00.git

origin:远程仓库的别名

【git——上】
添加之后再查看远程仓库地址就不为空了,而是显示仓库地址。

3. 推送本地分支到远程仓库(git push)

现在打开本地仓库git01,里面有很多增加的文件(完成远程仓库传到本地仓库后在本地进行的修改),若想将这些文件推送到远程仓库(也就是为了同步进度):
在此目录打开git Bash终端窗口,输入git push origin main/master(分支名称,开头第一句最后会显示,按对应内容输入)进行推送。反应几秒要求输消息时,名字是用户账号名(像上面这张图中的gitee.com之后的一小段字母),密码正常输入。之后便会显示:
【git——上】
推送成功,再打开gitee查看该远程仓库的内容:
【git——上】
所以提交信息都能查看(可通过git log进行验证)。

4.克隆远程仓库到本地(git clone)

克隆操作会将远程仓库的完整内容(包括代码、提交历史、分支等)下载到本地,并自动设置远程跟踪分支。

git clone 仓库地址

git clone 主要克隆以下内容:
代码文件:仓库中的所有文件和目录。
提交历史:仓库的完整 Git 提交记录。
分支信息:默认克隆所有分支(但本地只检出默认分支,通常是 main 或 master)。
Git 配置:包括远程仓库地址(origin)和分支跟踪关系。
git02就是采用git仓库的获取方法2(clone)创建的,不过克隆的是一个空仓库。
现在新建一个文件git03并打开,在此目录打开git Bash终端窗口,输入:git clone 远程仓库地址(推送本地文件到的那个远程仓库):
【git——上】
git03中增加了远程仓库里的文件,但没有日志记录。因为git log要在工作区中操作,需要找.git文件,而此git Bash终端窗口是在git03目录下打开的,没有.git文件:
【git——上】
切换目录

  1. 关闭窗口,打开文件夹test-00(远程仓库clone过来的文件),进入test-00的目录
  2. 不关窗口直接输入:cd test-00/更改目录
    再输入git log查看日志:
    【git——上】
    现在修改该本地仓库的一个文件的内容:
    假设修改d.txt(增加了第二行的0)
    【git——上】
    进行常规提交操作:
    【git——上】
    但打开git01(开头时推送本地文件给远程仓库)的d.txt文件内容是未修改的:
    【git——上】

远程仓库的内容也没变:
【git——上】

因为此修改仅添加到了本地仓库,添加的远程仓库才会在工作区的其他文件中显示修改,所以需要进行push操作^

5.推送本地分支到远程仓库(git push)

输入git push origin main:
【git——上】
再去查看远程仓库和git01的d.txt:

【git——上】
【git——上】
可见远程仓库的内容修改了,但git01没修改。
要想git01接收到修改内容,还需进行pull操作~(好像套娃……)

6.拉取远程分支并合并到当前分支(git pull)

在git01上打开窗口(谁想获取新版本谁拉取)并输入git pull origin main:
【git——上】
查看git01的d.txt:
【git——上】
若打开窗口的目录错误,则会出现下面这一段(显示无需拉取的内容),且git01的d.txt的内容不会变化。

【git——上】

分支操作等内容就放下篇吧(小声嘀咕:可能要迟yi会发),总有种一口气说不完快要憋死的感觉哈哈。撒花撒花~~