从零开始学习 Git

一、Git 是什么?

在计算机中,会经常听到 Github 这个词语,所谓的 Github 就是基于 git 版本控制工具的 “代码托管与协作平台”。那么什么是 git

git 是一种版本控制系统,它通过使用 git 命令来对一个项目进行操作,核心逻辑是通过 "哈希标识文件内容”“版本快照组合哈希”,实现了高效的版本存储和切换,同时避免了大量重复内容的冗余存储。

二、理解 Git 版本控制的核心逻辑

git 版本控制中,以每个文件为最小单位,每个文件都有一个独属于自己的 哈希值,哈希值用来唯一标识这个文件。所谓的版本控制本质上是不同哈希值的组合。

  • 通俗的理解为,假设一个项目是由 5 个文件组成,这五个文件有五个哈希值 h1、h2、h3、h4、h5。当我们添加一个功能的时候,会生成一个新的文件,这个文件有对应的哈希值 h6。版本 A 为 h1 + h2 + h3 + h4 + h5,版本 B 为 h1 + h2 + h3 + h4 + h6

  • 为什么不会造成大量重复的冗余?

    • 虽然直观感受上两个版本似乎是有重复的内容,但只需要通过保存每个版本的哈希值组合,而不需要保存每个版本中所包含的所有内容,就可以精准的回溯版本。例如一个拥有回溯版本的软件公司中拥有超过几百万个文件,但是在发行的时候,将在这几百万个文件中挑选当前版本需要的文件,这些文件组合之后为当前版本软件。同样的,不同的版本也是依靠拉取不同的文件进行组合的。只需要记录这些文件哈希值的组合,就可以知道每个版本中包含了哪些文件。

    • 所有的文件在服务器上只需要存储一份,不论是新增还是对原先已有的文件进行修改(修改过后会生成新的文件,并生成对应的哈希值,不会对原先文件进行覆盖)。因此并不会造成大量的冗余。而不论是想发布哪个版本,只需要找到对应版本的哈希值组合,在服务器文件中进行拉取组合并打包,就可以使用不同的版本。

三、Git 中的术语

  • 仓库 :可以通俗的理解为,存放文件的地方。

  • 工作区 :在将远程仓库克隆到本地之后,电脑中能直接看到的目录就是工作区,即日常进行代码编写、文件修改等操作的地方。可以自由地在工作区对文件进行增删改查等操作,git 不会进行记录,相当于草稿纸。

  • 暂存区 :也被称为索引区(Index),是位于工作区和版本库之间的一个临时区域。主要作用是标记你想要纳入下一次提交的修改内容。

  • 版本库 :是 Git 存储所有版本数据的地方,包含了对象库、引用(如分支、标签)等重要内容。版本库记录了项目的完整版本历史,每次执行 git commit 命令时,Git 会将暂存区中的修改提交到版本库,生成一个新的提交对象,并记录下当前项目的状态。通过版本库,你可以随时回溯到项目的任意历史版本,查看、恢复之前的代码状态,实现版本控制和协作开发 。

四、工作流程

在这里插入图片描述

  1. 首先需要通过远程克隆一个仓库到本地,在本地副本中进行修改,这样才不会同步影响到远程仓库。

    git init		# 初始化仓库
    git clone <远程仓库的地址>		# 拷贝一份远程仓库
    git clone -b <分支名称> <远程仓库的地址>		# 拷贝一个远程仓库的分支
    
  2. 在工作目录中进行代码编辑、添加新文件或删除不需要的文件。

  3. 暂存文件,将修改过的文件添加到暂存区,以便进行下一步的提交操作。

    git add filename		
    git add .		# 添加所有修改的文件
    
  4. 提交更改,将暂存区的更改提交到本地仓库,并添加提交信息。-m 后为手动添加的 文字内容

    git commit -m "文字内容"
    
  5. 拉取最新更改 :在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突,该步骤主要是用于拉取远程仓库中的最新版本,拉取之后会与本地仓库进行合并。

    git pull <远程仓库名> <远程分支名>
    
  6. 推送更改 :将本地的提交推送到远程仓库。

    git push <远程仓库名> <本地分支名>:<远程分支名>
    

五、Git 分支管理

git 分支实际上是指向更改快照的指针。

  • 创建新分支并切换到该分支

    git checkout -b 分支名
    
  • 切换分支

    git checkout (branchname)
    
  • 查看分支

    git branch		#查看所有分支
    git branch -r	#查看远程分支
    git branch -a	#查看所有本地和远程分支
    

六、高效理解Git的核心

首先,Git 的优势在于 增量记录 而非 覆盖修改增量记录 即不会影响源文件,也不会生成新副本。我们可以这么理解,假设有一个文件 A,对其修改了内容,将这些修改的内容抽象为 B,最终的内容为 A+B,而并非是复制了一个 A',在 A’上进行修改。相当于 Git 记录的内容是修改的内容 B。

七、远端仓库与本地仓库?

  • 远端仓库 :可以理解为真正的核心内容,我们尽量不要在远端仓库进行真正意义上的修改,因为并无法保证修改之后不会影响原先的功能,因此我们需要创建一个副本,在副本上修改。
  • 本地仓库 :本地仓库就是通过 git 命令,将远端仓库克隆一份副本到本地,在本地上进行修改,不会影响远端仓库中的核心内容。
  • 分支 :分支是 Git 的核心优势,所谓创建分支,可以理解为一个具有实际内容的指向,它指向的是创建分支时的主干,而它包含的内容是你实际修改的内容(例如某一行由什么变成了什么),分支会记录这些实际修改的内容,假如将这些实际修改的内容抽象为 A,分支的内容就是 A,而再次在这个分支上修改,分支就会记录实际修改的内容为 B,同样的,它也并不会覆盖 A,而是相当于糖葫芦一样,每个山楂都是一次实际修改的内容,同时里面包含了时间戳。
  • 远端分支 :为了不影响远端的核心代码,通过分支的形式来进行修改。
  • 本地分支 :为了同远端分支镜像,在本地分支进行修改,提交,提交到远端分支。

八、用糖葫芦来形容 Git

假设每一个正式项目为一个糖葫芦(即远端仓库),每个山楂都是一个具体的文件,竹签就是 干支,为了不影响其它山楂,在修改某个山楂的时候,我们要在需要修改的山楂上插入远端竹签(即远端分支)。当我们需要进行修改的时候,我们需要克隆这个糖葫芦,在这个新的糖葫芦(即本地仓库)上进行修改,而我们并不需要修改每一个山楂,为了保证修改的时候不会影响到其它山楂,我们在需要修改的那个山楂上插入一根本地竹签(即本地分支),在这根竹签上会插入新的小山楂(即实际修改的内容,例如某行哪里发生了什么变化),因此我们可以在这跟竹签上经常性的修改,每次修改都是插入一个小山楂。当我们修改完成之后,将这个本地竹签 push 到远端分支上,相当于将这些小山楂复制了一份插入到远端竹签上。远端会有人员进行审核,当审核通过之后,会将这些小山楂与大山楂合并为一个新的大山楂,此时就合并到了主干上。而我们在拉取最新主干的内容的时候,同样也并非是覆盖本地山楂,而是插入其它修改后的新大山楂。这样就可以实现多个人修改不同的山楂互相之间不会影响,同样如果多个人修改同一个山楂,那就在山楂上插入多个新竹签。

  • git status :哪些山楂(文件)被你摸过(修改了但没准备好提交);哪些山楂已经被你拿在手里(放在暂存区,准备串到竹签上);哪些山楂已经稳稳串在竹签上了(已提交到本地分支)。
  • git add :把修改好的小山楂放到托盘(暂存区)里。
  • git commit :把托盘里的山楂正式串到竹签(本地分支)上。
posted @ 2025-12-31 13:57  Amireux77  阅读(4)  评论(0)    收藏  举报