git起源
用于管理开源项目'linux', 作者 'linus' . 开发时长 '两周' (第一版) . 2005
第一版git的设计特性
git基本原理
git只关心文件数据的整体是否变化,它并不保存变化前后的差异数据. git在每次提交更新时,会将项目所有的文件做一个快照,然后在文件系统中保存一个指向这次快照的索引,为提高性能,若文件没有变化,git只会对上次的快照做一链接而不做额外操作.
git绝大多数操作都在本地执行.和传统CVS访问网络不同,git会将当前项目的历史更新都存储在本地.
git会时刻保持数据的完整性,在将数据保存到git之前,会进行checksum--使用SHA-1算法,通过对文件的内容或者目录的结果算出一个SHA-1指作为指纹,根据这个值判断数据的变化.所以如果文件在传输是变得不完整或者磁盘损坏导致数据缺失,git能立即察觉
git文件有3中状态
git的三种区域 workspace(普通,未做任何git操作)-->staging area(暂存区域或者说表单区域更好理解些)-->git 数据库
每个项目都有一个git目录(隐藏文件.git),他是git保存元数据和对象数据库的地方. 每次克隆(clone)仓库时,其实复制的就是这个目录里面的数据
git的工作流程 : 1. 对项目进行修改 2. 对修改后的项目做快照,然后保存到暂存区域. 3.提交更新,将暂存的文件快照永久保存到git目录中
git的基本配置
git下载后需要进行初始化配置,如果后续需要修改配置内容,使用相同的命令即可,后续配置会覆盖前面
使用git config工具(安装了git后自带)来读取或者设置相应的工作环境变量. 这些环境变量共有3中,存储在不同地方(作用域不同)
优先级从小到大,也就是说 项目的优先级最强,用户次之,全局最次
默认安装git后,git会自动配置工具的环境变量,所以使用cmd命令可以直接操作git config工具,可以在doc中数据git version查看git版本.若提示git无效,则需要额外配置git的path地址
git配置项 1: 用户信息
cmd中输入 git config --global user.name "xxxx"
git config --global user.email [email protected]
配置完后,你当前用户的git信息就是xxxx了,你可以通过 git config --global user.name/user.email 查看你的配置,如果你想让当前项目有不同配置,进入项目目录后重新执行配置命令,去掉 --global 即可.
设置git默认的编辑器 : git config --global core.editor emacs
设置git默认的差异分析工具: git config --global merge.tool vimdiff
查看现有的git配置 git config --list
配置高亮效果
使用git别名能有效提高工作效率(就是默认的git 命令重命名)git config --global alias.新名字 原始命令
如: git config --globalalias.co checkout
git基本命令的使用
一,初始化本地仓库 git init
如果你有项目,在dos中进入这个项目目录,执行 git init ,那么git会在这个目录中创建.git工作目录.并对目录中的内容进行版本控制
二, git status 检查本地项目状态
刚初始化的时候.git中的数据库中是没有文件快照的,这是你在工作目录中创建一个java文件,再执行 git status,会发现git提示有差异文件为添加到表单
三,git add 不多说 ,就是将 差异文件添加到暂存区域 可以看到dos中的使用提示 use 'git add <file> ...'
使用 git add . 添加所有文件
使用 git add <文件名> 添加指定文件
这时再看git status
既然有add 那么相对应的remove也有吧. 看上图 git rm --chched <file> 就是将表单中的文件移除
四,git commit 提交表单到本地数据库
两种模式 1. git commit -m "<注释>" 2. git commit
第一种会将引号中的内容作为提交的注释添加到数据库中,用以说明这次提交做了什么
第二种会打开一个默认的文本编辑器 如vim ,你可以使用编辑器添加复杂的注释
说明一下,注释支持中文
五,git log 查看项目历史版本
这个e516xxx 的就是这次提交的指纹了,通过项目结构和文件内容,用SHA-1算出来的
下面的first commit 就是这次提交的注释
如果想从注释中提取历史文件
1.使用 git checkout e516xxx <文件名> 即可
2.使用 reset,但是reset操作不对会移除log信息
五. git branch 创建分支
分支等于对项目做一个副本,分支主干互不影响,然后在副本中开发新功能,防止代码混乱或者说新功能影响旧功能.
具体操作流程 1. 开辟分支 2.切换到分支开发 3.切回主干 4.合并分支 5.删除没用分支
如图 b就是创建的分支名了
创建完分支后,可以执行 git branch 查看枝干列表, 带星号说明你在这个枝干上.
git init 后会默认创建一个名为master主干
六.切换分支 git checkout
见图 这里的co 就是前面设置的checkout 的别名,用co就简化了,效果如同
git checkout b.
执行完这条命令后,版本就从master主干切换到名为b的枝干了,见图:
我们在分支中开发项目,如新建了一个Test类,这时如果就算提交到本地,那么主干的版本也是看不到的
切回主干
会发现不仅文件没有,log也没有
七.git merge 合并分支
看看合并后的目录,Test出现了
同时log也出现了
注意合并的时候如果同样的代码被多个修改,那么可能会出现冲突,这时候需要手动调节完冲突再重新执行add commit.
最后,新功能开发完了,分支合并了,那么需要删除无用的分支 git branch -d <分支name>, 删除后再看枝干列表
八.git tag版本标签
一般会在正式发布的版本中添加tag标签,以便以后出意外恢复或者检索
语法 git tag -a <tagName> -m "<注释>"
使用git tag 列出所有的tag版本
使用git show 查看tag的详细信息,git show也能用于查看分支
九.git push 将本地仓库的记录添加到远程
git 大部分是在本地的,但是如果多人合作的话,远程仓库必不可少,团队成员可以从远程中clone(第一次)出项目来进行多人开发.
所以在提交完(commit)项目后, 调用gitpush 发布到远程.(当然你得有远程服务器,或者可以使用github)
提一下 git pull / git fetch / git clone 的区别
git clone: 是把整个git项目拷贝下来,包括里面的日志信息,git项目里的分支,你也可以直接切换、使用里面的分支等等
git fetch :从远程获取最新版本到本地,但是不会和本地合并
git pull: = git fetch + git merge 下载最新后再和本地的合并
ok 最后一个
十.git help <命令>查看指定命令的帮助文档
简单的过了一遍git , 用于快速入门.