1、什么是git?
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
2、git的特点?
从一般开发者角度:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者角度:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
3、git的优缺点
Git的优点:
1、适合分布式开发,强调个体;
2、公共的服务器压力和数量都不会太大;
3、速度快, 成熟的架构,开发灵活;
4、任意两个开发者之间可以很容易的解决冲突;
5、离线工作,管理代码成本低,不需要依赖服务器;
6、部署方便。基本上下个命令就可以用;
7、良好的分支机制,可以让主干代码保持干净。
Git的缺点:
1、资料少,学习成本比较大,学习周期比较长,要求人员素质比较高;
2、不符合常规思维;
3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
4、git仓库的创建
$ git init; 创建一个版本库
注意:这里只是命令的展示,其实你可以在你任何一下目录下创建,命令是:
1 、$mkdir gittutorcn
2、$cd gittutorcn/
3、$git init
这时系统会输出:
Initialized empty Git repository in/[yourpath]/.git或
(Initialized empty Git repository in /Users/1a/gittutorcn/.git/
)
这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。
你可以用 ls -a 查看一下,并请注意其中的三项内容:
-
一个叫 HEAD 的文件,我们现在来查看一下它的内容
输入命令:cat .git/HEAD
我们可以看到,HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。 -
一个叫 objects 的子目录,它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
存储对象的目录,本地仓库,git中对象分为三种:commit对象,tree对象(多叉树),blob对象;
关于 git 对象的分类,以及 git 对象数据库的说明,请参看 [Discussion] -
一个叫 refs 的子目录,它用来保存指向对象的索引。
具体地说,子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。
请注意:master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。
另外,这只是一个约定俗成的习惯而已,实际上你可以将你的工作分支叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。
现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库植入数据了。
5、植入数据
增加内容
$ git add
为了简明起见,我们创建两个文件夹作为练习:
$ echo"Helloworld">hello
$ echo"SnakeZero">snake
我们再用 git add 命令将这两个文件加入到版本库文件索引当中:
$ git add hello snake
注意,这里使用不同的终端窗口会影响操作,如果你出现了这种错误:
不要慌,因为windows中的换行符为CRLF,而Linux下的换行符为LF(使用Git命令行Git Bash,实际上就是相当于linux环境),所以在执行git add xxx.xx操作时,会出现这个错误提示!
那么怎么解决呢?
<1>删除.git 【rm -rf .git】
<2>禁用自动转换,即将设置:git config --global core.autocrlf false
再重新初始化,并执行添加add操作:
<3>【git init】
<4> 【git add xxx.xx】
是不是很神奇呢?好啦,我们已经将hello和snake文件夹添加到版本库文件索引当中啦。
git add 实际上是个脚本命令,它是对 git 内核命令 git update-index 的调用。因此上面的命令和下面的命令其实是等价的:
$ git update-index --add hello snake
如果你要将某个文件从 git 的目录跟踪系统中清除出去,同样可以用 git update-index 命令。例如:
$git update-index --force-remove foo.c
git add 可以将某个目录下的所有内容全都纳入内容跟踪之下,例如: git add ./path/to/your/wanted 。但是在这样做之前,应该注意先将一些我们不希望跟踪的文件清理掉,例如,gcc 编译出来的 .o 文件,vim 的交换文件 ..swp 之类。
应该建立一个清晰的概念就是,git add 和 git update-index 只是刷新了 git 的跟踪信息,hello 和 snake 这两个文件中的内容并没有提交到 git 的内容跟踪范畴之内。
普通用户总是应该使用 git add, 而不要使用上面提到的 update-index内部命令。
添加所有未跟踪文件用 git add -A, 添加所有未跟踪文件并且提交用 git commit -a。(注意大小写)
从当前跟踪文件中删除用 git reset HEAD 。事实上也就是用当前 HEAD(commited) 中的内容替换掉 index(staging) 的内容。
提交内容
提交内容到版本库:
$ git commit
既然我们刷新了 Git 的跟踪信息,现在我们看看版本库的状态:
$ git status
我们能看到:
提示信息告诉我们版本库中加入了两个新的文件,并且 git 提示我们提交这些文件,我们可以通过 git commit 命令来提交:
$git commit -m "Initial commit of git tutor reposistory"
引号里面内容是你的备注,可以随便写,但是最好便于识别,不然以后你就不知道自己做了什么了,也不好做版本回退。
如果你输入的时候提示让你输入邮箱和名字,输入就行了,比如:
查看当前的工作:
$git diff
git diff 命令将比较当前的工作目录和版本库数据库中的差异。现在我们编辑一些文件来体验一下 git 的跟踪功能。
$echo'这段是后来加的'>snake
我们再来比较一下,当前的工作目录和版本库中的数据的差别。
$ git diff
差异将以典型的 patch 方式表示出来:
此时,我们可以再次使用组合命令 git add 和 git commit 将我们的工作提交到版本库中。
$ git add snake
$ git commit -m "new day for git"
实际上,如果要提交的文件都是已经纳入 git 版本库的文件,那么不必为这些文件都应用 git add 命令之后再进行提交,下面的命令更简捷并且和上面的命令是等价的。
$git commit -a -m"new day for git"
好了,更加的具体用法可以百度大神们的操作,后续会持续更新,么么哒。