Git的基本原理简述以及常用指令

版权声明:实不相瞒,我也想成为大佬 https://blog.csdn.net/CV_Jason/article/details/81813476


0 前言

  最近开始使用GitHub来管理自己的代码,但是一直对Git系统的工作原理一直比较懵逼,除了无脑记了一些指令和GUI操作方法外,对内部的工作原理,完全一窍不通。终于抽个时间来吧Git系统的工作原理给梳理一遍了,学到了很多东西。我不是很喜欢直接转载别人的帖子,更不喜欢直接抄袭,我比较喜欢吸收消化之后,再以自己的形式展现出来,这样能够督促自己去学习和掌握,因此,这里总结了一下几位大神的帖子,权当做自己的学习笔记吧。

1 Git 系统

1.1 什么是Git?

  git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。git是个工具,在Linux里面也就类似gcc这样的工具一样,是一个shell命令。git是 Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

1.2 基本概念和原理

这里写图片描述

(图片源自博客 https://juejin.im/post/599e14875188251240632702#comment

工作区(WorkSpace)

   工作区就是我们调试代码的地方,比如各种IDE和编辑器,是我们更新代码的“第一现场”。我们在自己的IDE上调试代码,然后把自己写好的代码提交(commit)到本地或远程Git系统上,这个调试代码的过程就是对工作区的操作。比如我们的Visual Studio就可以看做一个工作区,这里我新建了一个项目CppLearning,方便下面举例。

这里写图片描述

暂存区(Index/Stage)

  每个配置了git系统的项目或者工程当中,都会有一个.git 文件夹,该文件夹中存放了git系统对于该项目的所有相关文件。
这里写图片描述
(举个栗子,嗯)

  .git目录下的index文件,暂存区会记录git add 指令添加的相关信息(文件名、大小等),而不保存文件实体,通过id指向每个文件实体,可以用git status 指令查看暂存区的状态。暂存区标记了当前的工作区中,哪些内容是被git管理的。这也标志着,我们的代码开始步入管理。


这里写图片描述
(嗯,还是以这个CppLearning的Demo进行举例,我写了一个快速排序算法,然后提交更新,提示Source.cpp文件被修改)

代码仓(Repository)
  在执行了git commit指令之后,最新的代码会更新到本地代码仓,本地代码仓对这次提交的修改进行记录,记录“一个新的版本”。而没有被提交的代码,则意味着在暂存区中“待命”,可能最终并没有被真正的记录。

这里写图片描述

远程库(Remote)
  如果整个项目的开发者,只有你一个人的话,或许你的代码管理,并不需要什么远程库。但一旦你需要和其他开发者协作开发,尤其是当你需要代码交互的时候,远程库的存在就显得至关重要。总的来说,远程库是整个分布式系统的核心,在执行了 git push 指令之后,它把位于不同地点的代码进行记录和同步

这里写图片描述

Git基本操作流程

  下面以一张时序图重新描述一下上述过程,基本上涵盖了我们常用的git系统的基本操作。


这里写图片描述

2 GitHub以及常用术语

2.1 什么是GitHub?

  GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名GitHub。其实说白了,就是一个在线的git系统,或者说,目前世界上做的最好的、影响力最大的、开源的、git在线托管系统。

这里写图片描述

2.2 常用术语

  记得第一次用GitHub的时候,被一堆名词搞晕了,不知道是什么意思,但永久了之后,懂了这些“行话”,发现其实也没有这么难理解。下面结合自己的理解,记录一下GitHub的一些常见名词。

Repository即“代码仓”,我们所管理的代码就位于代码仓中,但这里的代码仓是远程的,而不是本地的。GitHub系统中,以代码仓为单位进行管理。注意,这里所有的代码都是公开的(GitHub还有代码社交网站之称),私有代码仓需要额外付费。

Issues,即“问题”,我们的代码开源之后,别人可能会觉得哪里有问题,这里就可以提出一个Issue,问题解决之后,可以把这些Issue关闭。

Star即“点赞”,此外,所有点过赞的代码仓,都会记录在你自己的Star中,以便查阅。“Star”数量过高,说明这是一个十分有影响力的项目(比如Qt、OpenCV这些大佬)

Fork,即“拉取(分支)”,如果我们对别人的项目感兴趣,想基于此进行开发,就可以Fork到自己的系统上来进行代码管理,此时,拉取到自己账号上的版本是独立于源版本的,不会相互影响。本质上,Fork到自己账户上的代码仓,即表明这个项目“不是我的”,又方便自己能够对别人的项目进行开发。

Pull Request,即“提交请求”,上面说过,拉取到自己系统的代码是独立的,但如果自己开发出了更好的功能,想改变原始代码仓的代码,就需要提交请求了,发起请求之后,对方会收到提示,以及详尽的代码更新细节。

Merge即“合并”,当有人对你的项目发起了“Pull Request”,如果你觉得还不错,想更新原始代码仓,那么就需要这个merge的功能了。

Watch即“关注”,当我们Watch了一个项目之后,该项目如果有更新,会收到相关通知。可以给自己喜欢的项目进行“追踪”。

3 常用指令

add

最常用指令之一,把工作区修改的内容提交到暂存区,交由git管理

指令 备注
git add . 添加当前目录所有文件到暂存区(注意add后面有个.)
git add [dir] 添加指定目录到暂存区,包括子目录
git add [file] 添加指定文件到暂存区

commit

最常用指令之一,把暂存区的内容提交到本地仓,并使得当前分支的HEAD指向当前提交的分支点

指令 备注
git commit -m [message] 提交暂存区到本地仓,message表示提交说明
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

branch

分支操作,包括分支的查询、切换、创建、删除等操作。

指令 备注
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
git branch [branch-name] 新建一个分支,但依然停留在当前分支
git checkout -b [branch-name] 新建一个分支,并切换到该分支
git branch --track [branch][remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
git checkout [branch-name] 切换到指定分支,并更新工作区
git branch -d [branch-name] 删除分支
git push origin --delete [branch-name] 删除远程分支

  提到了分支,就不得不补充一个概念——HEAD,它始终指向当前追星的提交点,如果分支发生变化,或者产生了新的提交,那么HEAD会随之而变,有点类似于链表的当前指针。

这里写图片描述

push

最常用指令之一,上传本地仓分支到远程仓分支,实现同步

指令 备注
git push [remote][branch] 上传本地指定分支到远程仓库
git push [remote] --force 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --all 推送所有分支到远程仓库

merge
最常用指令之一,merge命令把不同的分支合并起来


这里写图片描述

指令 备注
git fetch [remote] merge之前先拉一下远程仓库最新代码,减少代码冲突的可能性
git merge [branch] 合并指定分支到当前分支

参考链接

[1] . 一篇文章,教你学会Git
[2]. 使用原理视角看 Git
[3]. GitHub 术语解释
[4]. git概念、原理、使用
[5]. git官方文档

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/81813476