http://blog.csdn.net/u013510614/article/details/50588446

主体思想

Git作为一个复杂的版本控制系统,命令之多,相信很多小白已经望而却步,有的尝试几次,久攻不克,也只能望洋兴叹。标题起的是15分钟,可是真的能15分钟掌握么??想什么呢?怎么可能?哈哈,15分钟只是个噱头,意思就是快,如果还是按照传统的套路从命理讲起,根本无从“快”起,所以笔者另辟蹊径,这里要介绍的Git,不同于一般的教科书 —— 先讲抽象概念,再讲事物本身的流程。我觉得先建立直觉的模型比较重要,让你先用上Git,再去学Git;先用GUI(图形界面)在谈CLI(命令行),我相信这会更容易让人接受。

严格的说,本教程应该称作SourceTree入门指南,哈哈。因为下面要借助一个图形化的软件,SourceTree,来讲Git。SourceTree下面简称ST。ST是Git的第三方客户端,特点是比较直观,而且呢,不违背Git的逻辑,这里说多了就略显复杂,有些客户端会封装Git的命令操作,隐藏了过多的细节,反而不好学习Git……总之,ST挺好,界面也好看,缺点就是有点慢,不过没关系。

核心思想就是 —— 用ST来降低门槛,先让你看到Git做了什么,给你直觉上的理解,再谈CLI。毕竟CLI才是最终的归宿。

谈谈版本控制工具

版本控制工具,现在有名的就是SVN和Git吧,其他的也有,这两个比较主流。
小白会好奇,版本控制工具是干嘛的?

版本控制工具,其实就是一个文件的追踪器,能够记录一个文件的每一个改动,这样子仿佛有助手,一直在后面帮你备份每次修改的文件。对于你来说,仿佛你有了一个时光机,可以回到文件的任何时候,每当你想查看了,或者回退,你可以轻轻松松搞定。有点像打游戏存档,一旦会了存档大法,多难的怪,都能干死,反正被打死就回档,打怪,只是个磨时间的过程~~

Git还有分支、合并功能,当一个小团队在共同完成一份作品的不同部分的时候,版本控制工具可以先把作品分为不同的分支,给不同的负责人,最后每个部分修改妥善,再合并这些分支,使之变成一个整体。还有……吧啦吧啦,太细就枯燥了,哈哈,不常用的,我也不会。

说到这,你是不是还有点小激动呢?

如果有一天,当你意识到,计算机本身就是把硬盘的数据读出来,经过CPU处理,之后再放到硬盘里保存。整个的电脑体系就是在不断地修改某些文件。你会觉得Git真的是非常有用,无所不在。只要存在修改,存在保存,就有Git的用武之地。

SVN VS Git

小白又问了,各种不明觉厉,那SVN和Git有什么区别?
在我看来就是设计上的区别:

SVN是中心似的,Git是分布式的,两种设计方向,目标都是解决版本控制问题。
谈不上谁个更好,谁个更坏,工具嘛,只有顺不顺手。偏爱Git的人,会觉得Git更强大,同样对Git嗤之以鼻的人,会觉得Git设计的太复杂,以至于无论是个人还是团队,学习成本都比较高,万一遇到一个瓶颈,没人会用Git解决,就歇菜了,SVN相对弱,因为不能本地备份,但是也相对简单,简单介绍就立刻可以上手。

不过上面的难用,易用,现在已经变成相对的了,有很多出色的客户端,比如SourceTree,已经极大的简化了Git的使用流程,解决了很多痛点,一会我们就要介绍到它。

简单的说,SVN就有一个中央服务器,协调大家的代码,大家都和它同步;Git是分布式的,每个人都保留完整的追踪记录,每个人可以成为一个中心。所以说SVN缺点就是,中心宕掉了,所有人都歇菜。Git人人皆可为中心。Git缺点,应该就是学起来比较复杂吧,设计的命令都比较混乱,流程也很难理解和接受,要不然SVN应该不存在了。

下面感受一下,SVN和Git的复杂度

下图是SVN的操作逻辑:

整体来说,就是图中心的三条线:

Checkout:克隆项目(复制代码到本地) <— 在这里!!!
Commit:提交本地代码
Update:更新本地代码

图下面三个线:

add:添加项目
rm:删除项目
revert:撤销

所以我站在用户的角度,SVN的设计是清晰的

下面来看看Git
上图!
下面是Git的操作流程:

Git的设计就复杂的多,甚至很晃眼啊

个人觉得,Git没有在设计上,特别的在易用性上优化过,简化过。尤其是命令,也是很随意的,后面能看到。

尝试一下Git

15分钟虽然是个噱头,还是来谈谈怎么个15分钟法吧。

下面的部分可以称为《SourceTree向导》,《SourceTree图解手册》哈哈,没有啦,还是要讲点东西的,如果对于Git的东西一点都不讲,确实应该改名字。

整个的流程,是先讲解原理,再用SourceTree操作一下,后面介绍一点命令内容,我也是在学习中,有错误的地方,还请包涵和指正。大家共同学习,共同进步。

眼睛瞧这里,这个就是Source Tree,下载猛戳。

设计的还挺好看,咳咳,当初选择它也是因为好看……哈哈哈,用软件都看脸。SourceTree确实设计的很好。一会我们来探索一下它。

处女座的朋友要问了,Git客户端千千万,为什么就说SourceTree?

刚才不是说了么……看脸,哈哈,其实主要还是ST做的比较靠谱,用过一个叫做TortoiseGit的,大名鼎鼎,反正我用的时候状况百出。

懒得推荐,而且不好看,哈哈
个人感觉软件刷新率不高,比如:
当你用Sublime打开文件的时候,然后最小化,用TortoiseGit来pull最新代码,Sublime经常不会刷新的。
还有TortoiseGit简化了Git的模型,取消了暂存区的概念,和Git的模型不太一样。

总之,应该解答一部分疑惑了。Source Tree是个好东西 。

来说说Git是咋么一回事

写代码,写完了保存,这是一般文件的流程。Git多加了一个流程,就是保存后,你要提交。Git会追踪你每次保存,和上次保存之间的差别,然后把这些信息,保存在一个文件夹下,文件夹名叫.git。这个文件夹,Git的术语里称之为仓库,用仓库可以追踪代码,看到每次改变了什么,可以还原到以前的状态,也可以看别人改了什么,这就是代码版本控制的本质,一种高级的保存功能,自带时光机的那种

现在祭上图

咱们挨个挨个解释一下,解释完,大概就知道怎么回事了。
第一遍看不懂,不放多看几遍,或者看看其他的资料,对照着。每个人理解的点可能不一样。
最好把这张图,单独开在一个窗口,对照着,下面就来解释这个图

首先看这张图中间,四个圆柱 :

  • Workspace:工作区,就是你正在写的代码
  • index:暂存区,一个本地的缓冲区
  • local repository:本地仓库
  • remote repository:远程仓库

Workspace工作区

就是你正在写的代码,正在打开的编辑器里面的内容,解释完了,就这样

index暂存区

index照理应该翻译叫索引,这里叫暂存区
暂存区是干嘛的?
暂存区是Git和SVN的最重要的差别之一
我们来看图,箭头就是代码流动的方向

Git的流程工作流程就是:
眼前正在写的代码(workspace)觉得差不多了
add命令
提交到暂存区(index)类似于保存一下
然后你可以返回正在写的代码(workspace)继续写,写的到了一个阶段了
add命令
又提交到了暂存区(index)

对就是这样子工作的!

举一反三!!
举一反三!!
重要的事情说三遍,举一反三

当你多次提交,基本工作完成的差不多了
按照道理
你应该每次都add到了index暂存区

现在好了,任务完成
要把暂存区里的东西,放到本地仓库(local repository)

使用commit命令

大家看图应该注意到
worksp –> local repository
有一个绿色的箭头 commit -a
这条命令
就是同时完成,把当前的修改,提交到暂存区,然后把暂存区的提交到
本地仓库

Git每次提交的,都是保存变化的改动,不是简简单单的复制一遍

本地仓库(local repository)

就是正式的代码保存的地方

如果你本地所有的内容都被commit到本地仓库了
表示你已经很满意所有的代码
并且完成了所有的编写

这个时候,你想把代码上传到Github或者公司的Git服务器,提交给别人
看图
local repository –> remote repository
中间是push操作

想对你正在工作的电脑,你电脑叫local,本地
网络上的,就叫remote,远程

remote repository 远程仓库

就是网络上的仓库
一般是放在网络上保存
或者和团队一起配合着干活
网络仓库就成为一个中枢的感觉

我们看图的上半部分
提交的过程,按照箭头,由下往上:

remote repository:远程仓库
^
|
| push:就是“推”,把本地的正式的提交代码,推到网络上
|
local repository:本地仓库
^
|
| commit:合并多次修改,提交到仓库保存
|
index :暂存区
^
|
| add:一段阶段的代码,保存
|
Workspace:正在写代码,写的不错了

再来看看这张图的下三路

remote repository –> workspace

这里有一个pull 黄颜色的,操作(rebase后面讲)
pull就是“拉”的意思,拉动,把网络的代码,拉动到本地
拉动的目标是workspace,就是你正在写的代码

解释一下这里,比如你正在写代码,或者打开了一个项目
编辑器Sublime Text上代码显示出来了,表示文件打开了
这个时候,公司的小明告诉你,公司昨天几位同事加班加点,代码更新了
让你更新一下代码,以获得人家工作一晚上加班的工作成果
你这个时候就要pull,拉取最新的代码,以保证自己和大家的工作进度一致
pull的意义在于,执行完操作,会刷新你的编辑器
Sublime Text上的代码,会变化到最新的代码
不信你试试

TortoiseGit来pull的时候,编辑器刷新与否,似乎看心情 = =b

下面来看红色,红色的两个箭头
最左边有一个小字
revert
意思大概是反转,撤销的意思

对啊,你光提交,万一提交错了呢?
Git里有一套撤销的机制
撤销的机制尤其复杂
这里引用一篇文章戳这里
不过那些都不是我们要说的重点
学习嘛,要抓住主干,细枝末节的,晚点再说,又不一定全都遇上
Git复杂的就可能是撤消了,这些我们暂时不管

下面还有两路灰色的,左边的说明是compare
就是可以比较你每次修改的代码和之前的代码有什么区别
这是Git最重要的作用,就是可以看到每次提交的不同

这些也不说,放在后面说

现在主要的就是把上三路和pull熟悉

小结

【工作区】->add->【暂存区】->commit->【本地仓库】->push->【远程仓库】

【工作区】<------------------ pull ----------------- 【远程仓库】

记住:
add、commit、push、pull

可爱的Source Tree

Source Tree是一个优秀的,直觉式的Git的图形界面客户端
Source Tree用了很优雅的方式和直觉化的流程,让你很优雅的使用Git
基本上所有常用场景下,都可以胜任,如果实在情况特殊,使用命令行

下面是Source Tree界面

Source Tree的设计符合直觉
这张图上面的图标,基本上是所有常用的操作了

  • Clone/New:Clone就是克隆,copy拷贝的另一种称呼,这里意思是从远程仓库,拷贝一个项目到本地

  • Commit:大家一看就明白

  • Checkout:没讲,简单的说,你保存了一个版本到暂存区,然后继续写,写着写着后悔了,挨个挨个改回去太麻烦,checkout就是从暂存区的一个保存版本还原到正在写的编辑器,这一点,看第一地图,红色的短的checkout描述的就是这个意思(checkout HEAD后面讲)

  • Discard:丢弃

  • Stash:保存你目前的所有状态,到一个特别的文件–>我个人觉得这个很常用,一会提到

  • Add:把文件提到暂存区

  • Fetch:看看地图,远程仓库拉去到仓库,目前打开的编辑器不会变化

  • Pull:提过了

  • Branch:分支,这个不讲,一般项目负责人负责

  • Merge: 合并分支,同上

觉得难记没关系,SourceTree有中文界面可以挑
用英文,主要是和Git的命令,对应起来,有助于找规律

下面一个框区,就是diff,比较代码不同的地方
红色是删掉的,标记为减号
绿色是添加的,标记为加号

Source Tree实时帮你显示,所以diff这个命令压根不需要你敲

现在了解完毕Git的工作流程
现在让我们用Source Tree走一遍

本篇文章就是在Github上建立的一个项目(如果不知道怎么做,请查询Github官方教程)
然后clone到本地
把项目添加到了Source Tree

把项目添加到Source Tree
下面简称SourceTree为ST
然后用编辑器打开文件编辑,编辑完毕后,保存文件,这个一定要保存,然后可以把编辑器最小化了,然后可以看看ST
点击如图,第一步,工作副本
这个要经常点,只要你点了,切换就会刷新
稍微等一会,第二部的地方,就会出现文件的修改状态
第二部所在的区域,就是工作区,就是你编辑器,编辑器的文件临时状态,可以部分选,也可以全选,选择后,会出现如下图:

整个项目移动到上面,就是暂存区,右边是Diff状态,表示你修改了什么

提交按钮,就是Commit,点击他,进入下图:

如图会跳出一个commit信息,看过Git的同学,应该知道,每次commit都会让你键入一个message,其实就是写明,你做了什么,改了什么,这样子等到回退,撤销的时候,一看信息就明白了

下面有一个按钮,和上面的推送是一样的
可以先commit,然后push
如果仓库是配置好的

按一下,就可以提交代码了

提交好代码后,可以看到如图:

左边的分支,可以看到整体情况
右边的字段:
图表:一种分支图,可以看清项目合并情况
描述:就是commit的message
提交:提交生成的hash码
作者:谁提交的,这个团队配合作用救命掀了

真正的复杂的项目,上一张图,让大家感受下:

分支情况会特别的复杂,感受下。

小结

ST确实用图形界面把Git的操作简化到十分优雅的地步
Git提交代码的流程,已经描述完毕
是不是十分简单

15分钟学会使用Git的更多相关文章

  1. 15分钟学会使用Git和远程代码库

    git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  2. 【git】15分钟学会使用Git和远程代码库

    Git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  3. 15 分钟学会使用 Git 和远程代码库

    Git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  4. 15 分钟学会 Eclipse GMF

    背景 坦白说:过去在 Eclipse 里使用 Graphical Editor Framework(GEF)创建图形化编辑器 既慢又痛苦.这个过程包括理解复杂的框架和大量的冗余代码.但也说明 GEF ...

  5. 15分钟学会git基本的操作命令

    http://hao.jobbole.com/try-git/ 假如你现在新创建了一个项目,想把它提交到github上面? 假设你创建好了一个项目,并切换到项目的根目录下面: $ git status ...

  6. 零基础十分钟学会用git在coding.net上传(pull)和push

    ---恢复内容开始--- 对于入门者来说,特别是刚刚接触计算机的人来说,模仿是最快的学习方式了,先能够会使用(对于初学者来说,这种使用新事物的感觉很能爽的)至于原理,以后再说.下面先让初学者快速的学会 ...

  7. [指南] 15分钟学会MySQL(Linux版)

    原文链接:http://www.mysqlpub.com/thread-348-1-1.html 原创出处:MySQLpub.com  , 作者:kider  ,转载请注明作者和出处,并不能用于商业用 ...

  8. 15分钟学会Lua

    lua的很多语法跟matlab很像 最基本的赋值是一样的 循环和选择判断后面必须跟一个关键字:do和then ,, do ... end if - then - end table是lua的唯一一种数 ...

  9. PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

    这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...

随机推荐

  1. AndroidStudio修改主题外观和字体大小

    修改主题外观 File --> Settings --> Appearance & Behavior --> Appearance 右边 Theme 修改编辑器的字体大小 F ...

  2. Android菜单代码

    前言: 学习android断断续续也有一年半左右,但一直在学习,很少回顾以往的知识.所以我打算用业余时间来写一些这样总结性的文章,希望温故知新. 以下只是我个人的一些感悟和见解(当然会查证资料验证), ...

  3. java io流中怎么在一个文本中追加字符串

    1/ FileOutputStream(File file, boolean append)2/FileWriter(File file, boolean append) 不管哪一种IO都有 appe ...

  4. Epoll简介以及例子

    第一部分:Epoll简介 问题 :  Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别.select判断是否有事件发生是遍历的,而epoll是事 ...

  5. 【Codeforces自我陶醉水题篇~】(差17C code....)

    Codeforces17A 题意: 有一种素数会等于两个相邻的素数相加 如果在2~n的范围内有至少k个这样的素数,就YES,否则就NO; 思路: 采用直接打表,后面判断一下就好了.那个预处理素数表还是 ...

  6. P1648 看守

    传送门 以二维的两个点\((x1,y1),(x2,y2)\)为例,那么他们之间的曼哈顿距离肯定为一下四个之一\((x1-x2)+(y1-y2)\),\((x2-x1)+(y1-y2)\),\((x1- ...

  7. C++类 单冒号

    1.继承 class Base { }; class Derived : public Base { }; 示列: class Base   { public: int a=10;  }; class ...

  8. hdu 4442 Physical Examination (2012年金华赛区现场赛A题)

    昨天模拟赛的时候坑了好久,刚开始感觉是dp,仔细一看数据范围太大. 题目大意:一个人要参加考试,一共有n个科目,每个科目都有一个相应的队列,完成这门科目的总时间为a+b*(前面已完成科目所花的总时间) ...

  9. 关于MyBatis的两种写法

    刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml ...

  10. NTP服务简介

    定义:NTP全称为Network Time Protocol,即网络时间协议.是用来使计算机时间同步的一种协议.它可以使计算机对服务器或时钟源做同步,可以提供高精度的时间校正(LAN 上与标准时间小于 ...