Git简明教程一、基本概念
文本是写给新手的Git入门教程。本文的目的是让新手能够快速了解并开始使用Git,因此只会介绍最基本、同时也是最核心的知识。其中包括使用Git的基本步骤和Git中最常用的命令,以及如何使用GitHub托管自己的代码。
1. 关于Git的读音
“git”读作/git/(给特),而不是/jit/(吉特)。
2. Git比SVN等版本控制工具好在哪里?
这是新手最常问的问题。我也曾在心里产生过这种疑惑,原因一方面是因为好奇心,因为在我看来,SVN已经足够优秀了,为什么又忽然冒出来一个Git呢?另一方面则是希望能通过将Git与自己熟悉的SVN进行比较,从而更快、更好地了解Git。
但是,在这里我要驳回这种疑问。不要认为Git一定比SVN好、处处比SVN好。Git有着更先进的设计理念是没错,但更先进与更好并不是等价的。工具,永远只有最合适而没有最好。
打个比方,普通的文本编辑器和功能丰富的IDE开发工具哪个好?对于我们专门做开发的人来说,可能大部分时候IDE更方便,因为有各种便捷的功能,代码提示,错误提示,自动发布,自动部署……等等。但即使IDE有这么多优点和好处,是否就能说明IDE一定比普通的文本编辑器更好呢?不能吧?
某些“极客”们喜欢把自己喜欢的东西捧上天,同时把“竞争对手”踩在脚下。个人认为这是非常不好的习惯,程序员的世界不应该有宗教。
所以,关于这个问题的答案,总结下来就是:
Git与SVN相比没有本质区别。是的,分布式并不是本质区别,就像命令行和GUI界面一样。但它有一些优点:
- 对多人协作的支持更好
- 很多操作的效率更高
- 不需要始终联网就能进行版本管理
- and more ...
3. 命令行还是GUI界面?
现在有很多Git工具供我们选择,其中一些是基于命令行的,另一些则是基于GUI界面的,到底该如何选择呢?
我建议新手在学习阶段应该用基于命令行的Git工具,这样更有助于了解git各个功能的细节和原理。
可以在下面的网站下载安装Git,该网站同时提供了Windows、Mac、Linux和Solaris版本的程序:
在Windows下,另一个常用的是msysgit:
msysgit打包了一个Cygwin,从而在Windows下模拟了Linux环境,因此可以在其中运行Git程序。
安装了msysgit后,会在资源管理器的右键菜单中注册相关项目。其中“Git Bash”用于启动Git并将工作目录设置到当前目录下;“Git Gui”用来打开GUI界面的Git;“Git Init Here”则在当前目录下创建一个仓库并打开Git Bash,相当于先打开Git Bash然后运行git init命令。关于Git常用命令后面会详细介绍。
4. 在Git中获取帮助
遇到问题时查阅资料或上网搜索是很方便的,但是关于很多命令的用法在Git中已经有了详细介绍。下面就来介绍几个显示帮助的命令。
$ git help
此命令获取git使用的一般帮助信息
$ git help command | concept
显示某个命令或主题(concept不知该如何翻译,就是下面用-g参数所显示的那些)的详细帮助。例如:
git help commit #显示commit命令的详细用法
git help everyday #显示everyday帮助指南
$ git help -a
列出当前安装的git中所有可用的子命令
$ git help -g
列出当前安装的git中提供的主题指南(concept guides,不知道该如何翻译)
5. 一些名词和概念
- 版本
广义上讲,文件的每一次修改都可以称为一个版本。版本管理系统正是用来管理和跟踪文件的修改的。在版本管理系统中,每一次提交会形成一个版本记录,这些记录串接起来就是整个项目的演化历史。
- 版本库
版本库,也叫版本仓库、仓库,英文名为Repository,经常简写为Repo,是Git用来进行版本管理的主要场所。
在Git中使用init或clone创建一个新的版本库后,就会在当前目录下生成一个.git目录,这个就是Git的版本库,其中保存着本项目的各文件数据、提交记录、分支、配置等等数据。如果我们把.git目录删除的话,版本库也就丢失了。这一点和SVN不同,SVN会把相关数据分散到各个文件所在的目录中。
- 工作区(Working Directory)
工作区就是版本仓库所在的目录,其中的文件处于Git版本库的管理之下。使用init或clone创建一个新的版本库后,当前目录就成为了工作区。
- 本地仓库 vs 远程仓库
首先,本地仓库和远程仓库没有本质区别。在使用Git时,为了方便团队成员之间交换代码,通常会专门部署一台“服务器”作为公共仓库,每个人可以向公共仓库中提交自己的代码,也可以从公共仓库中更新其他人的最新提交。对大家来说,这个公共仓库就是一个远程仓库。
- 克隆(clone)
克隆就是复制一个已经存在的版本库。例如我们可以将公共版本库(远程仓库)克隆一份到自己的电脑上。
- 提交(commit)
将工作区中的代码合并到版本库中的操作就叫提交。每一次提交都会在版本库中留下一个记录,日后可以用其来进行对比、回退等操作。换句话说,处于工作区中但仍未提交的修改不会受到Git的保护,如果文件被删除了,或者改错了,将无法回退到之前的某个正确的状态(如果文本编辑器或IDE还没关的话说不定能弥补回这个错误)。
- 推送(push) vs 拉取(pull)
将工作区中的代码合并到本地仓库的操作叫做提交,而在版本库之间进行合并操作就不是提交了,叫做推送。因为对Git来说,两个版本库之间的关系是平等的,不存在谁“提交”给谁一说。
相应地,从另一个仓库中把代码合并到本地仓库的过程就叫拉取。
- 分支
每次提交是有先后关系的,正常来说,所有提交将会串成一条直线。而分支就是在原本的直线上分出去的岔路。一个分支从分出去的那一刻起,在其上的修改将完全独立于其他分支(除非你显式地将2个分支合并到一起)。
分支的演进过程很像物种的进化。物种在后代之间产生不同的变异,当一个群体中的变异积累到一定程度时,该群体很有可能有机会分化为一个新的物种,此后,新物种与原物种之间将平行进化。这个比喻只适用于演化出新分支的过程,但自然界中两个物种之间不太可能会合并(人工干预除外)。
6. 总结
好了,第一部分就先到这里。接下来我们将介绍Git中的常用操作,从而让你能够快速上手,敬请期待。如果你觉得本文对你有帮助,请帮忙点个赞!!
Git简明教程一、基本概念的更多相关文章
- Git使用教程一
Git是一个分布式版本控制系统,简单的说其就是一个软件,用于记录一个或若 干文件内容变化,以便将来查阅特定版本修订情况的软件. Github (https://www.github.com) 是-一个 ...
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 【转】git - 简明指南
git - 简明指南 助你入门 git 的简明指南,木有高深内容 ;) 作者:罗杰·杜德勒 感谢:@tfnico, @fhd 和 Namics其他语言 english, deutsch, españo ...
- NGUI系列教程一
NGUI是Unity的一个插件,使用它来制作你的游戏UI必定将事半功倍.为什么这么说呢?首先我们说说GUI与NGUI的区别,GUI是Unity自带的绘制界面工具,它的成像原理是基于表层的,所以执行效率 ...
- Git简明教程二、开始进行版本管理
上一篇介绍了Git中的一些基本概念.本篇来实际看一看如何通过几个常用命令来快速上手Git,完成版本管理的日常操作(核心操作). 0. 准备工作 安装Git后,请先在你的电脑上新建或选择一个目录作为测试 ...
- Quartz教程一:使用quartz
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...
- redis学习教程一《Redis的安装和配置》
redis学习教程一<Redis的安装和配置> Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执 ...
- Cobalt Strike使用教程一
Cobalt Strike使用教程一 0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...
- git 教程一
git 是一个开源的分布式版本控件系统,用于敏捷高效地处理任何或小或大的项目. Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件. Git 与常用 ...
随机推荐
- 【费用流】【网络流24题】【P4013】 数字梯形问题
Description 给定一个由 \(n\) 行数字组成的数字梯形如下图所示. 梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成 ...
- 关于JavaScript诞生之初的趣事
我在读很多优秀的JavaScript源码时候常常被它诡异的语法搞的精疲力尽,所以时不时的加固JavaScript基础知识是十分有必要的,这些知识每次温故或者你换个角度去思考都能收获颇多,那么如此深不可 ...
- golang interface 类型变量当作某个具体类型使用
比如,我们定义了一个 struct type person struct { Name string `json:"name"` Age int `json:"age&q ...
- label和fieldset标签
一.label标签 作用:可以通过for属性关联input标签的 id 属性,这样可以实现在点击label标签的内容时,可以使input文本框中获取输入的光标. <body> <la ...
- day12 继承
设计原则:开闭原则:对于拓展open,对于修改close. 类与类的关系:1.is a(继承关系) 2.has a(组合关系) 继承的优点:1.代码的可重用性 2.父类的属性和方法用于子类 3.子类可 ...
- linq的语法和案例
本篇逐一介绍linq各个关键字的用法(from,select,group,into等),本篇所有的案例都是用linqpad来完成的(官方地址:http://www.linqpad.net/),建议想学 ...
- vuejs2.0 vue实例的生命周期
每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .下图展示的就是一个v ...
- ssh 批量执行命令
# python3.5 + paramiko # pip 是python的包管理工具,在shell里执行如下命令安装paramoko模块 # pip install paramiko # import ...
- 把一个IEEE754浮点数转换为IBM370浮点数的C#代码
把一个IEEE754浮点数转换为IBM370浮点数的C#代码. 在这个网页上有古老的IBM370浮点格式的说明. // http://en.wikipedia.org/wiki/IBM_Floatin ...
- APScheduler定时执行外加supervisor管理后台运行
最近写的天气爬虫想要让它在后台每天定时执行,一开始用的celery,但不知道为什么明明设置cron在某个时间运行,但任务却不间断的运行.无奈转用apscheduler,但是不管怎么设置都不能使得当调用 ...