最近开始使用GitHub来管理本身的代码,可是一直对Git系统的工做原理一直比较懵逼,除了无脑记了一些指令和GUI操做方法外,对内部的工做原理,彻底一窍不通。终于抽个时间来吧Git系统的工做原理给梳理一遍了,学到了不少东西。我不是很喜欢直接转载别人的帖子,更不喜欢直接抄袭,我比较喜欢吸取消化以后,再以本身的形式展示出来,这样可以督促本身去学习和掌握,所以,这里总结了一下几位大神的帖子,权当作本身的学习笔记吧。git
git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到很是大的项目版本管理。git是个工具,在Linux里面也就相似gcc这样的工具同样,是一个shell命令。git是 Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。github
.git
文件夹,该文件夹中存放了git系统对于该项目的全部相关文件。 .git
目录下的index
文件,暂存区会记录git add
指令添加的相关信息(文件名、大小等),而不保存文件实体,经过id指向每一个文件实体,能够用git status
指令查看暂存区的状态。暂存区标记了当前的工做区中,哪些内容是被git
管理的。这也标志着,咱们的代码开始步入管理。
git commit
指令以后,最新的代码会更新到本地代码仓,本地代码仓对此次提交的修改进行记录,记录“一个新的版本”。而没有被提交的代码,则意味着在暂存区中“待命”,可能最终并无被真正的记录。
git push
指令以后,它把位于不一样地点的代码进行记录和同步。
Git基本操做流程
下面以一张时序图从新描述一下上述过程,基本上涵盖了咱们经常使用的git系统的基本操做。
web
GitHub是一个面向开源及私有软件项目的托管平台,由于只支持git做为惟一的版本库格式进行托管,故名GitHub。其实说白了,就是一个在线的git系统,或者说,目前世界上作的最好的、影响力最大的、开源的、git在线托管系统。
算法
记得第一次用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了一个项目以后,该项目若是有更新,会收到相关通知。能够给本身喜欢的项目进行“追踪”。
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官方文档