Git - 最强入门看这篇就够了

【1】前言

Git 是一个开源的分布式版本控制系统, 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式。

是一个使用广泛的版本控制系统,比如 Github、Gitlab、码云…等都是用 Git 实现仓库管理。

【2】结构

在 Git 中会分为工作区、暂存区和版本库三个层级,分别对应着不同的概念。

  • 工作区:开发写代码的目录,但不包含目录下的 .git 目录。
  • 版本库:工作区目录下隐藏目录 .git。
  • 暂存区: 位于 .git 目录下的 index 目录中。

如下图所示:
在这里插入图片描述

【3】工作流程

现在看一个 master 分支下,git 命令是如何影响三个层级。下图中把版本库和暂存区放到一起,其中 “index” 的区域是暂存区;objects 标识的区域为 Git 的对象库,包含了创建的各种对象及内容。
在这里插入图片描述
下面的举例都是基于 “HEAD” 是指向 master 分支的一个"游标"。

  • 使用 git add 时候,会把有改动的文件添加到暂存区。目录树被更新,同时工作区改动的文件会被写入对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  • 使用 git commit 时候,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  • 使用 git rm --cached 时侯,会直接从暂存区删除文件,工作区则不做出改变。

  • 使用 git checkout . 或者 checkout – 时候,会把暂存区的内容覆盖工作区的。这个操作要慎用,尽管 IDE 自身也提供了历史记录功能。

  • 使用 git checkout HEAD . 或者 checkout HEAD 时候,用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。会清除工作区中未提交(add)的改动,也会清除暂存区中未提交(commit)的改动。

可以用下面的图有个形象的认知:

  1. 一开始 工作区、缓存区、版本库三个是保存一致。
    在这里插入图片描述

  2. 当创建、修复文件时候,工作区就发生改变。其他则没有变。如下图:
    在这里插入图片描述

  3. 使用 git add 后,变动的文件被加入缓存区,这时候工作区和缓存区保持一致。
    在这里插入图片描述

  4. 使用 git commit 后,暂存区的变动被提交到版本库,所以三个区间又保持一致。
    在这里插入图片描述

【4】revert 和 reset

开发中并不是一帆风顺,往往很多时候需要进行代码的回滚操作。在 git 中 revert 和 reset 两个命令可以实现代码回滚,但他们是有区别的。

【4-1】revert - 重做

回滚已提交版本,并创建一个新的提交。适用于多个版本中,历史的版本需要重新修正且保留该版本后的提交。所以叫 重做 会更加符合其特点。

文字有些拗口,看下面的图你就明白了。假如有 3 个提交,在第 2 个提交有bug,需要修正此bug,且需要保留第 3 个提交。

重做前:

在这里插入图片描述

重做后:
在这里插入图片描述
保留了前面的提交,然后重建了新的提交。适用于修补bug,当有问题分支后面已经有多个提交时候且需要保留这些提交。

使用方法:

  1. git revert [ --no-commit / -n 不自动提交] 目标版本号(需要重做的版本)。可能有冲突,需要解决。 版本号可使用 git log 查看。
  2. 修改代码后需要 git add 后,git commit 提交到版本库中。
【4-2】reset - 重置

reset 虽然可以用来回滚,但本质上并不是回滚,而是移动 HEAD 的指向。也就是移动到指向提交之后的提交将不会被保留,还是看下面的图:

重置前:
在这里插入图片描述
重置后:
在这里插入图片描述

以 reset --hard HEAD^ 为例子,reset 之所以起到了撤销 commit 的效果,是因为它把 HEAD 和它所指向的 branch 一起移动到了当前 commit 的父 commit 上,从而起到了「撤销」的效果 。所以上面的图中 commit 1之后的提交都被丢弃了。

不同于 revert ,reset 有三种工作模式,mixed(默认)、soft、hrad。

  1. git reset --mixed(默认、可不带) --head 目标版本号。
    重置位置的同时, 也会删除暂存区、版本库中重置位置后的修改,只保留工作区。
    原节点和 reset 节点之间的【差异变更集】会放入Working Tree工作目录中。 所以看起来有很多未提交的改动。

    使用完 reset --mixed后,可以直接执行 git add 将这些改变的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区中的內容提交至 版本库 Repository中 。

  2. git reset --soft --head 目标版本号。
    重置 HEAD 位置的同时,删除版本库中的改动,保留工作区和暂存区的改动。

  3. git reset --hrad --head 目标版本号。
    重置 HEAD 位置的同时,删除工作区、暂存区、版本库的所有后续改动。 慎用!

【5】总结

本文讲述 git 的工作流程、结构以及revert 和 reset。若能全部领悟,git 也能了解个七七八八。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooddance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值