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



0 前言

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

1 Git 系统

1.1 什么是Git?

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

1.2 基本概念和原理

这里写图片描述

(图片源自博客 http://www.javashuo.com/article/p-hnpojooi-ck.html

工做区(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系统的基本操做。
web


这里写图片描述

2 GitHub以及经常使用术语

2.1 什么是GitHub?

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

这里写图片描述

2.2 经常使用术语

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

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

Issues,即“问题”,咱们的代码开源以后,别人可能会以为哪里有问题,这里就能够提出一个Issue,问题解决以后,能够把这些Issue关闭。分布式

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

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

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

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官方文档