Git学习记录

238 阅读5分钟

由于忙碌于参与项目开发,很长时间没有更新文章,然而在此次项目开发中,一直在使用git add 、git commit 、git push等命令,但是对于其中的原理并不是特别深入的理解。因此,本文主要记录对于git的学习和个人理解,欢迎讨论和指正~

Git 版本控制

在项目开发中,对于项目的每一次版本迭代,都需要有一个良好的版本控制和管理工具,因此一般项目开发中都会使用Git来进行版本的控制和管理。

远程库和本地库

实际上,真正在项目开发中,我们不会仅仅将项目存在本地的Git版本库中,而是会创建远程库,将远程库和本地库进行关联,进行团队的项目开发。远程库和本地库是如何进行关联的呢?这里仅做简要的介绍。

Git clone

使用Git clone XXXX(具体项目地址),可以将项目从远程仓库clone到本地库进行开发

Git push

项目开发完成,如何提交到远程库呢?使用git push 可以将项目从本地库提交到远程库中

然而本地库对于项目是如何进行操作和管理,才能保证数据的正确提交呢?

Git三大分区

在本地库中,有三个区域相互“合作”完成项目的本地版本控制,这三个区域就是工作区、暂存区和版本库然而,他们之间是如何相互合作的呢?

  • 工作区:开发者本地可以直接编辑的区域(我们克隆在本地的项目目录,就可以认为是我们的工作区);
  • 暂存区:工作区通过Git add以后,文件暂时存储的区域;
  • 版本库:暂存区通过Git commit以后,存储文件提交的区域;

提交

对于三个分区的合作,先从正向的提交进行讨论。我们将项目克隆在本地的目的就是进行项目开发并且完整提交,那么我们具体是如何操作的呢?

假如当前项目迭代的目标是,新建一个文件,文件存放的内容是项目的简要介绍。

  • 第一步:我们在工作区内创建新的文件ReadMe.txt,并且添加文件内容“Learning Git...”;(完成文件创建,进入提交)

  • 第二步:将工作区中的修改通过git add 提交到暂存区;
  • 第三步:将暂存区中的文件通过git commit XXX 提交到版本库(对应于自己当前所在的分支,默认是master);
  • 第四步:将本地版本库中的文件通过git push XXX 提交到远程库;(此时远程库和本地库保持同步)

撤销

然而,实际开发过程中,并不是所有的提交都是畅通无阻的,经常会出现提交不正确,需要撤销的情况,那么三大分区中的撤销是怎样的呢?

case1 : 工作区自身的撤销-- git checkout -- file(需要撤销的文件名)

假如当前项目开发需要创建一个文件,记录项目的主要版本。我们在工作区中修改文件 ReadMe.txt ,文件中内容是“床前明月光,疑是地上霜,举头望明月,低头思故乡”。发现文件内容是错误的,我们需要回退到上次的版本,可以通过git checkout -- ReadMe.txt 进行撤销;

case2 : 暂存区-->工作区 -- git reset HEAD file(需要撤销的文件名) 【实质是取消暂存区的更改,不更改工作区】

假如文件 ReadMe.txt “床前明月光,疑是地上霜,举头望明月,低头思故乡” 已经通过git add Version.txt 提交到暂存区我们才发现文件是错误的,这时可以通过 git reset HEAD ReadMe.txt 将文件从暂存区撤回到工作区,工作区中的文件状态就是我们提交之前的文件数据;

case3 : 版本库--> 工作区 -- git reset --hard commit-id(要回退到的commit id)【实质是直接让三个区回退到某一个版本】

假如文件 Version.txt “床前明月光,疑是地上霜,举头望明月,低头思故乡” 已经通过git commit XXX 从暂存区提交到版本库我们才发现文件是错误的,我们可以:

  • 通过git log查看提交的历史记录(假如已有多次提交)
  • 找到要回退到的commit id
  • 通过git reset --hard commit-id 进行回退

这种撤销一定要小心,因为这种操作会使得三个区内对于此次的更改都会消失;工作区中的文件也会回退到上次commit的版本;

对比

三个区都是数据的存储区域,我们脑海中就把三个区想像成三个图书馆,有时候我们更改了工作区,并没有更改暂存区和版本库,这个时候自己想要对比三个“图书馆”之间的差异,应该怎么做呢?

  • 对比工作区和暂存区 -- git diff
  • 对比暂存区和版本库 -- git diff --cached
  • 对比工作区和版本库 -- git diff head

总结

以上就是近期对于git学习的简要总结:

  • 提交:本地库(工作区 --git add--> 暂存区 --git commit--> 版本库) --git push--> 远程库
  • 撤销:
    • 工作区自我撤销:git checkout -- file
    • 暂存区自我撤销(暂存区--工作区): git reset HEAD file
    • 版本库、暂存区、工作区同时回退: git reset --hard commit id
  • 对比:
    • 工作区和暂存区 -- git diff
    • 暂存区和版本库 -- git diff --cached
    • 工作区和版本库 -- git diff head
持续学习持续更新中,欢迎指正~