版本控制主要分为两种,集中式版本控制和分布式版本控制。CVS和SVN即便典型的集中式版本控制系统,而Git是目前世界上最早进的分布式版本控制系统。 git
集中式版本控制:windows
集中式版本控制的仓库是集中存放在中央服务器的,而干活的时候,用的都是本身的电脑,因此要先从中央服务器取得最新的版本,而后开始干活,干完活了,再把本身的活推送给中央服务器。集中式版本控制系统最大的弊端就是必须联网才能工做。在局域网的状况下效率不错,可是经过外放访问的话,因为网络带宽和稳定性的因素将致使效率极低。安全
分布式版本控制:bash
分布式版本控制系统没有“中央服务器”的概念,每一个人的电脑上都是一个完整的版本库,这样,你工做的时候,就不须要联网了,由于版本库就在你本身的电脑上。既然每一个人电脑上都有一个完整的版本库,那多我的如何协做呢?比方说你在本身电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,大家俩之间只需把各自的修改推送给对方,就能够互相看到对方的修改了。服务器
和集中式版本控制系统相比,分布式版本控制系统的安全性要高不少,由于每一个人电脑里都有完整的版本库,某一我的的电脑坏掉了没关系,随便从其余人那里复制一个就能够了。网络
简介:分布式
Git 是用于 Linux内核开发的版本控制工具。与经常使用的版本控制工具 CVS, Subversion 等不一样,它采用了分布式版本库的方式,没必要服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来讲天然很重要。 Git最为出色的是它的合并跟踪(merge tracing)能力。工具
简介:学习
Git 是用于 Linux内核开发的版本控制工具。与经常使用的版本控制工具 CVS, Subversion 等不一样,它采用了分布式版本库的方式,没必要服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来讲天然很重要。 Git最为出色的是它的合并跟踪(merge tracing)能力。spa
Git bash
Git Bash是Git在windows下的一个模拟终端,接下来的Git的学习都将在此终端进行。双击桌面的Git Bash图 标,便可打开Git终端。
由于Git是分布式版本控制系统,因此,每一个机器都必须自报家门。你的名字和Email地址。在Git Bash中输入如下命令:
在Git的全局配置中添加一个用户名
在Git的全局配置中添加一个邮箱
3)可使用git config --list查看全局的配置信息,当中能够看到你所添加的用户名和邮箱信息
建立完用户信息以后,接下来咱们就能够开始建立一个本地的版本库了。
1)在任意一个磁盘中新建一个目录,例如:在D盘中建立一个文件夹叫mygit。
2)在Git Bash中进入此文件夹。
3)使用git init命令将mygit目录初始化一个空的本地版本库
OK,这样咱们就建立了一个本地版本库,只不过这个库的工做区中没有任何的内容,
可是有一个隐藏文件夹“.git”。这个文件夹就是Git的版本库。
(备注:在Git中是有版本库、工做区、暂存区这几个概念,这部份内容将在后面进行详细介绍)
版本库有了,那么咱们就能够向版本库中添加文件了。
1) 在mygit目录中建立一个文本文件(例如hello.txt)并填写一些内容
2)在Git Bash中使用命令git add hello.txt
3)再使用命令git commit -m "提交说明" 提交到版本库中
接下来对hello.txt文件进行修改,再添加一些内容。而后使用git status命令进行查看。git status命令可让咱们时刻关注仓库当前的状态。
红色的部分告诉咱们hello.txt的文件已经修改,可是尚未提交到仓库。
还可使用git diff命令查看修改前和修改后的内容。
修改完后仍是使用git add和git commit命令提交到本地版本库中。
咱们再次使用git status命令查看版本库当前的状态,这时你会发现刚才修改的内容已经提交到版本库中,没有任何可提交的内容了。
工做区(Working Directory)
在以前建立的mygit目录,这个就是工做区。咱们建立的任何文件都是存放在工做区中。
版本库(Repository)
工做区有一个隐藏目录“.git”,这个就是Git的本地版本库。
说明:
Git的版本库里存了不少内容,其中最重要的就一个是暂存区(stage),还有Git为咱们自动建立的第一个主分支master,以及指向master的一个指针叫HEAD(HEAD还能够指向其余的分支,就是切换分支)。
咱们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把新建或修改的文件添加到暂存区。
第二步是用git commit执行提交,实际上就是把暂存区的全部内容提交到当前master分支。
1) 可使用git log命令查看最近的提交日志列表,当初会有相应的版本号、用户信息、提交时间和提交说明等内容。
说明:
commit:提交的版本号
Author:提交人信息
Date:提交时间
再后面的信息就是提交说明
2)使用git reset 命令执行版本回退
reset命令有三个参数,这三个参数将致使回退的内容将在不一样的做用域中。
--soft,这个参数表示在版本库中回退到旧的版本。而最新的版本内容会移到暂存区保存。($ git reset --soft HEAD^soft 绿色,(工做区有,版本库没有)暂存区还有,只须要commit)
--mixed, 这个参数表示在版本库中进行版本回退,同时重置暂存区。(默认选项)
($ git reset --mixed HEAD^mixed 红色,(存在于工做区,版本库也没有)暂存区没有,而且要先add在commit)
--hard,这个参数表示表示在版本库中进行版本回退,同时重置暂存区和工做区。
例如:git reset --soft HEAD^ 表示在版本库中回退到上一个版本
($ git reset --hard HEAD^hard (工做区、暂存区、和版本库都没有)清空全部)
HEAD说明:
1) HEAD表示回退到当前最新版本
例如:git reset --mixed HEAD (回退到当前最新的版本,并重置暂存区)
2) HEAD^表示回退到上一个版本
例如:git reset --mixed HEAD^ (回退到上一个版本,并重置暂存区)
3) HEAD~2表示回退到上两个版本(其中2能够替换成其余数字,表示回退到第几个版本)
例如:git reset --mixed HEAD~2 (回退到上两个版本,并重置暂存区)
版本号说明:
能够将HEAD替换成版本号,表示回退到指定的版本。版本号不必定须要所有输入,只须要输入前面几个字符便可。
例如:git reset --mixed 版本号 (回退到指定版本,并将版本内容重置到暂存区)
3)使用git reset <filename>命令撤销暂存区的操做
例如:git reset hello.txt
1) 使用git rm filename命令删除工做区中的文件
例如:git rm hello.txt
注意:删除以后,记得要将此操做commit到版本库中,由于此时删除的动做还只是在暂存区中,并未同步到版本库。
2) 使用git rm 目录名 -r -f 删除文件夹及其下全部的文件
例如:git rm demo -r -f
注意:执行完一样须要commit到版本库中
1)分支的做用
分支在实际中有什么用呢?假设你准备开发一个新功能,可是须要两周才能完成,第一周你写了50%的代码,若是马上提交,因为代码还没写完,不完整的代码库会致使别人不能干活了。若是等代码所有写完再一次提交,又存在丢失天天进度的巨大风险。有了分支,就不用怕了。你建立了一个属于你本身的分支,别人看不到,还继续在原来的分支上正常工做,而你在本身的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的主分支上,这样,既安全,又不影响别人工做。
2) 分支的概念
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来讲不是指向提交,而是指向master,master才是指向提交的,因此,HEAD指向的就是当前分支。
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也愈来愈长:
当咱们建立新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
从如今开始,对工做区的修改和提交就是针对dev分支了,好比新提交一次后,dev指针往前移动一步,而master指针不变:
假如咱们在dev上的工做完成了,就能够把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
合并完分支后,甚至能够删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,咱们就剩下了一条master分支:
1. 建立分支: git branch 分支名
例如:git branch dev
2. 切换分支: git checkout 分支名
例如: git checkout dev
说明:也可使用 git branch dev -b 一次1和2的两步操做(建立并切换分支)
3. 查看分支: git branch
说明:*号表标识前正在操做的分支
4. 合并分支:git merge 分支名
例如:git meger dev
咱们先切换到master分之下,而后合并dev分支的内容
这样,咱们就把dev分支的内容合并到了master分支上
5. 删除分支:git branch -d 分支名
例如:git branch -d dev
版本冲突
在合并分支时,并不必定都成功。这是由于当两个分支都作了修改而且都提交到了版本库中,这样在合并的时候可能就会产生版本冲突。
场景案例:
1) 在master主分支中对A文件进行修改并提交
2)切换到dev分支也对A文件进行内容修改并提交
3)切换回master分支合并dev分支的内容,这是就产生版本冲突,合并失败
由于master分支和dev分支各自都分别有新的提交。这种状况下,Git没法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就致使了冲突的缘由。
咱们查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容。
所以咱们手动将内容修改合并后再进行提交以解决此问题。
git diff 用于比较内容的差异。
比较规则:
先比较暂存区内容,若是暂存区为空时则比较当前版本库中HEAD所指向的分支内容。
例如:git diff
说明:git diff 默认是比较全部文件的内容。也能够指定文件名,用于比较当前文件的内容。例如:git diff hello.txt
例如: git diff 分支名
说明:一样能够指定具体某个文件进行内容比。例如:git diff dev hello.txt
例如:git diff 分支名..分支名
说明:一样能够指定具体某个文件进行内容比。例如:git diff master..dev hello.txt
例如:git diff HEAD^
说明:还能够比较上n个版的内容。例如:git diff HEAD~2 (比较上两个版本的内容)。
而且能够指定文件名,比较个某个文件内容。例如:git diff HEAD~2 hello.txt
说明:也能够比较上n个版的内容和比较个指定文件的内容。同上
有这样一种状况,例如你在主分支master下进行一些代码的内容修改,忽然因为紧急突发缘由不得不让你立马切换至dev分之下进行一些bug修复。可是当你要切换到dev分支时,不得不先提交master下的内容,不然没法进行切换。以下图:
这时,能够利用git来帮咱们先保存master分之下的工做状态,而后就能够安心切换到dev分之下进行工做,等完成以后再切换回master分支,而后再恢复回以前的工做状态继续工做。
这个命令就是 git stash
1)保存当前工做状态: git stash
保存后,就能够切换到其余分支
在其余分支工做完后,再切换回master分支。
2)查看保存的工做状态列表:git stash list
说明:{0}是保存的状态号
3)恢复状态:git stash pop stash@{状态号}
例如:git stash pop stash@{0}
这样,就成功恢复到以前保存的状态中。
发布一个版本时,咱们一般先在版本库中打一个标签(tag),这样,就惟一肯定了打标签时刻的版本。未来不管何时,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。因此,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针,因此,建立和删除标签都是瞬间完成的。
当咱们要对某个版本进行打包发布时,要找到对应的版本号(也就是commit ID),可是
版本号是一串并很差记的字符串。如:63c4b0c15f897ab4b1c50519f2946af7c5545e8e
这样的字符串,这时标签就很是有用了。由于标签是一个很容易记的名字,一个标签跟一个版本号是绑定在一块儿的,因此只要根据标签查找版本号就能够了。
1)建立标签:git tag 标签名
例如:git tag v1.0
说明:默认标签是打在最新提交的版本号上的,也能够打在指定的版本号上。例如:
git tag v1.0 63c4b0c (只要写上版本号的前几位便可)
2)查看全部标签:git tag
3)根据标签查看版本内容:git show 标签名
例如:git show v1.0
4)删除标签:git tag -d 标签名
例如:git tag -d v1.0