Git官网html
维基百科git
Git
名字由来是林纳斯·托瓦兹自嘲地取了这个名字“git”,该词源自英国俚语,意思大约是“混帐”github
自2002年开始,林纳斯·托瓦兹决定使用BitKeeper
做为Linux内核主要的版本控制系统用以维护代码。由于BitKeeper
为专有软件,这个决定在社群中长期遭受质疑。在Linux社群中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来做为Linux
核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件做为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS
(svn
就是cvs
)的架构,受到林纳斯·托瓦兹的批评。windows
2005年,安德鲁·垂鸠写了一个简单程序,能够链接BitKeeper
的存储库,BitKeeper
著做权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper
内部使用的协议进行逆向工程,决定收回免费使用BitKeeper
的许可。Linux
内核开发团队与BitMover公司进行磋商,但没法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper
以十天的时间,编写出第一个git版本。bash
说白了Git
解决了咱们什么痛点的,好比咱们有一个 v1.0.0
版本的项目,若是咱们不是用版本控制工具,发布一个v1.0.0
版本后,咱们想保留v1.0.0
版本的项目供之后某些状况下使用或提供用户不一样版本项目的使用,咱们只能将v1.0.0
版本的项目复制一份保留起来,若是咱们在发布一个版本v1.2.0
,咱们又要保留一个v1.0.0
版本的项目,如此一来,若是版本发布了不少咱们将会有大量的版本项目,这样咱们管理起来也会很麻烦。而版本工具的出现正好解决了咱们这个问题,固然版本工具也解决了多我的共同开发一个项目的问题以及一些提升团队开发效率的问题,而且还能够在不链接网络的状况下对咱们的版本进行控制,而像svn这样的集中式管理工具只能在联网的状况下才可使用。网络
作程序的人对于Git和svn应该是在熟悉不过了,当咱们想控制咱们的项目版本时会常常用到这两个工具,而他们的工做原理却有很大差异。它们的大体区别以下:架构
怎么理解分布式和集中式,我这里是这里去理解的,git 和 svn在远程都有一个仓库(集中版本库),可是不一样的是当咱们克隆下来项目时,git会在本地创建一个和远程仓库同样的本地版本库,而svn是不存在这个版本库的,也就是说咱们每一个人在本身的电脑上使用git克隆的项目都会有一个版本库,咱们在进行咱们的版本控制时添加新分支是不会影响其余人的。而svn因为是集中式管理工具,当咱们把本地项目推送到远程仓库后,会对其余人带来影响,而且由于git在本地有一个版本库,这使得在没有网络连接的状况下,仍然能够正常管理咱们项目的版本,而svn则必须在连接网络的状况才可使用分布式
WARNINGsvn
须要注意的是,上面列举的git和svn区别并非为了说明git要比svn好不少,这也不能成为它们好坏的评判标准,一个工具的优点主要仍是要看咱们项目的实际需求工具
window上的安装
在window上安装git官网下载下来后一直点击下一步就能够了。 安装成功后在任意一个文件夹中右击鼠标会出现, Git Bush Here
和 Git Gui Here
说明咱们已经安装成功了。点击Git Bush Here
咱们能够在命令面板中进行一些git命令操做。
安装成功后,咱们须要设置咱们的邮箱和帐号,由于Git是分布式版本控制系统,每一个机器都要进行区分
全局配置:
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
复制代码
局部配置
$ git config user.name "Your Name"
$ git config user.email "Your Email"
复制代码
查看全部配置
$ git config --list
复制代码
假设咱们有一个本地的使用git控制版本的project
项目,目录结构以下
|--- .git // git版本库
|--- index.js
复制代码
接下来在讲git工做原理前,咱们先要明白几个概念
概念 | 说明 |
---|---|
工做区 | 所谓工做区就是指的你的本地目录也就上上边的project项目,固然不包括.git目录 |
暂存区 | (索引) 存放在.git目录下的index文件中 |
版本库 | 指咱们工做区中的.git目录,该目录是个隐藏目录 |
远程仓库 | 指的是咱们网上托管项目的地方,好比github、码云 |
咱们在使用git时常常是用的过程就是:
git
的工做流程以下图 如下内容来自 菜鸟教程
index
的区域是暂存区(
stage
,
index
),标记为
master
的是
master
分支所表明的目录树,分支范畴下面会讲到
图中咱们能够看出此时 HEAD 实际是指向 master
分支的一个"游标"。因此图示的命令中出现 HEAD
的地方能够用 master
来替换。
图中的 objects
标识的区域为 Git
的对象库,实际位于 .git/objects
目录下,里面包含了建立的各类对象及内容。
当对工做区修改(或新增)的文件执行 git add .
命令时,暂存区的目录树被更新,同时工做区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操做(git commit
)时,暂存区的目录树写到版本库(对象库)中,master
分支会作相应的更新。即 master
指向的目录树就更新成了提交时暂存区的目录树。
当执行git reset HEAD
命令时,暂存区的目录树会被重写,被 master
分支指向的目录树所替换,可是工做区不受影响。
当执行 git rm --cached <file>
命令时,会直接从暂存区删除文件,工做区则不作出改变。
当执行 git checkout .
或者 git checkout -- <file>
命令时,会用暂存区所有或指定的文件替换工做区的文件。这个操做很危险,会清除工做区中未添加到暂存区的改动。
当执行 git checkout HEAD .
或者 git checkout HEAD <file>
命令时,会用 HEAD
指向的 master
分支中的所有或者部分文件替换暂存区和以及工做区中的文件。这个命令也是极具危险性的,由于不但会清除工做区中未提交的改动,也会清除暂存区中未提交的改动。
git push
时,咱们本地版本库中的项目将会推送到远程仓库中。