git学习,哇瑟说实话我想要的
1.
Git 简介及安装
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
它的诞生也颇具传奇,Linux创始人Linus花了两周时间自己用C写了
一个分布式版本控制系统,这就是Git!有兴趣的话,可查看 Git的诞生
什么是版本控制?
版本控制(Revision control)是一种软体工程技巧,
籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。
版本控制系统/软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,
是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,
追踪多个版本的开发和维护活动,及时发布软件。
常用的版本控制系统/软件有 VSS、CVS、SVN 以及 Git 等。简介详见 百度百科
什么是分布式?
分布式版本控制 (DVCS) 是一种不需要中心服务器的管理文件版本的方法,但是它也可以使用中心服务器。
更改可以被合并到 DVCS 的任何其他用户的系统中,因此可以实现非常灵活的工作流。
DVCS 的两个主要优点是:它比集中的版本控制更灵活,因为它除了支持传统的(集中式)工作流,
还支持其他各种工作流;它比集中式服务器快得多,因为大多数操作在客户机本地进行,而不需要网络操作。
为什么选择 Git ?
实际上,相对于 CVS、SVN 等主流版本控制软件,
Git 的学习成本会更高。SVN等的图形操作界面,对于用惯 Windows 系统的用户来说,
使用和理解上都比较易学。
而对于 Git 用户,需要理解更多更复杂的概念,包括文件、
快照、工作树、索引、本地资源库、远程资源库、远程、提交、分支和 Stash 等。
那相比于 CVS 与 SVN,Git 的优势到底体现在哪里?
第一,Git 底层自行维护的存储文件系统
CVS、SVN 底层采用的为增量式文件系统 。
增量式文件系统的特点是:当文件变动发生提交时,该文件系统存储的是文件的差异信息。
管理修改
为什么Git比其他版本控制系统设计得优秀,
因为Git跟踪并管理的是修改,而非文件。为达成这一目的,
暂存区存在的意义就在于此。
此外,先依据 .git/index (暂存区文件)中记录的时间戳、
长度等信息判断工作区文件是否改变。如果工作区的文件时间戳改变,
说明文件的内容可能被改变了,需要要打开文件,读取文件内容,
和更改前的原始文件相比较,判断文件内容是否被更改。
如果文件内容没有改变,则将该文件新的时间戳记录到 .git/index 文件中。
因为判断文件是否更改,使用时间戳、文件长度等信息进行比较要比通过文件内容比较要快的多,
所以 Git 这样的实现方式可以让工作区状态扫描更快速的执行,这也是 Git 高效的因素之一。
git/index 实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,
记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,
而是保存在 Git 对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系。
git checkout -- 1.txt 撤销
git reset --hard <revision>
必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^ ...
如上,我们要把当前版本回退到最新版本,就可以使用命令行 git reset --hard ,
若使用命令行 git reset --hard HEAD^,则回滚为上一版本,此时 git log 仅显示了当前版本及其之前的信息
命令可输入版本号,前几位即可(通常前7位);显然,若回滚了昨天的版本后,又反悔了的这种情况还是时有发生的
,这时,就需要输版本号了;然则,版本号忘了怎么办。。这时,需要另一个命令帮助:
git reflog 显示操作的日志
该命令可显示操作日志,且显示了对应的版本号及信息,可查询到之前的版本号并再次回滚,
如 git reset --hard 6de39b3 。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,
当你回退版本的时候,Git仅仅是把HEAD指向改变
分支管理
几乎每一种版本控制系统都支持分支。使用分支意味着你可以从开发主线上分离开来,然后不影响主线的同时继续工作。在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。
作为优越的版本控制系统,Git 对分支的管理是极其轻便易用的。本文具体说明Git是如何进行分支管理的,如分支的创建、查看、切换、删除等,以及分支的合并及冲突解决。分支对于多人协作是及其重要,内容较多,慢慢来~
有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。
何谓分支
分支的理念就是分身,就像孙悟空拔出猴毛变出很多跟自己一模一样的猴子,
然后每个猴子(程序猿)做自己的事情互不干涉,等到所有猴子做完之后,
猴子集合来合并劳动成果,然后悟空就把那些猴子猴孙门统统收回了。
其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,
这些版本控制系统创建和切换分支比蜗牛还慢,
简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!
无论你的版本库是1个文件还是1万个文件。
为了理解 Git 分支的实现方式,我们需要回顾一下 Git 是如何储存数据的。
或许你还记得第一章的内容,Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
这就使得 Git分支创建及切换等操作就如拔毛一样迅速。
创建分支、查看及切换
在本地仓库操作一章中,可知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
只是目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,
所以,HEAD指向的就是当前分支。每次提交,master分支都会向前移动一步,
这样,随着你不断提交,master分支的线也越来越长。
冲突解决
之前的merge即合并分支章节,有提及冲突;现在,来具体说明下冲突的产生及 Git是如何解决冲突的。
首先,了解下冲突的产生,如在时间节点a,从master上分支出feature1分支,feature1分支上对文件f做了更新,
此时准备merge至master;如master分支在 a时间节点后已对文件f做了更新并提交;此时,就可能产生冲突。
git 冲突就收工修改,再合并提交,over
git学习,哇瑟说实话我想要的的更多相关文章
- Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
- git学习之branch分支
作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...
- Git学习笔记(10)——搭建Git服务器
本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...
- git 学习使用总结一(本地操作)
通过几天的学习,熟悉了 git 的一些常用命令,要用熟练和操作更复杂的功能还必须继续学习.不过 git 作为工具,它是用来提高我们的工作效率的工具,系统的学习之后可以暂且放放,等到以后实际项目中用到了 ...
- git学习(这个我没有整理,是我不断在学习的过程中,自己总结的,对象是我,不过有问题的,我们可以相互交流)
每次git提交,都会有一个parent指针,指向上一次的commit , 如果合并,master就和hotfix河道一起,就直接删除hotfix就OK 此时,虽然操作一样,大底层实现不一样 ...
- iOS开发之git学习
本人是参考廖雪峰的git学习的.他写的非常详细,我在这里就是把我学习中的总结以及碰到的坑写出来. /* 初始化git仓库:git init */ /* 添加文件到git仓库 */ 分两步: 第一步:追 ...
- Git学习之路(5)- 同步到远程仓库及多人协作问题
▓▓▓▓▓▓ 大致介绍 我们写好文件后添加到版本库,但是这样还没有做完,我们还需要将它同步到GitHub的远程仓库上,这里就以我们刚开始的drag项目为例,我们在Git学习之路(2)-安装GIt和创建 ...
- Git学习之路(6)- 分支操作
▓▓▓▓▓▓ 大致介绍 几乎所有的版本控制系统都会支持分支操作,分支可以让你在不影响开发主线的情况下,随心所欲的实现你的想法,但是在大多数的版本控制系统中,这个过程的效率是非常低的.就比如我在没有学习 ...
- git学习资料包
1.廖雪峰老师的git教程:https://www.liaoxuefeng.com -----点击“GIT教程”开始学习 2.菜鸟教程git学习:http://www.runoob.com/gi ...
随机推荐
- Kubernetes-DNS
Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成: etcd:DNS存储 kube2sky:将Kubernetes Master中的Service(服务)注册到etcd sky ...
- HDU 5530:Pipes Selection
题意: 给定长度为\(L\),元素总和为\(S\)的非负整数序列\(A\),对于每一个\(1 \leq i \leq S\),求出:所有满足\(\sum_{j=l}^rA_j=i\)的二元组\((l, ...
- js获取浏览器内容宽高(小计)
<SCRIPT LANGUAGE="JavaScript">var s = "";s += "\r\n网页可见区域宽:"+ d ...
- android开发过程中项目中遇到的坑----布点问题
我们在红点push 的到达和点击的地方,都加了布点.后来功能上了线,发现,每天的点击都比到达高! 这肯定不科学. 赶紧查问题,打开程序,发红点,关闭程序,布点上传.没问题.数据部门可以收到红点啊! 从 ...
- 如何删除TFS项目
TFS是先建集合,再在集合下面建项目.删除的时候,需要先删除项目,再删除集合,然后重新建.具体步骤如下: 1.删除项目 删除项目必须通过命令来进行删除,调用TFSDeleteProjec ...
- 云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存
当今天早上在日志中发现这样的错误之后,对阿里云OCS(mecached缓存服务)的积怨倾泻而出. 2014-06-08 07:15:56,078 [ERROR] Enyim.Caching.Memca ...
- Unity3d脚本生命周期
如图: 测试脚本: using UnityEngine; public class Test2 : MonoBehaviour { void Awake() { Debug.Log("Awa ...
- linux学习总结-----web前端①
<html> <head> <title></title> <meta charset='utf-8'/> ... </head> ...
- 13-Mysql数据库----权限设置
权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师会创建一个 ...
- 07-Mysql数据库----数据类型
介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/mysql-data- ...