GIT学习
2016-07-20 10:01:53 0 举报
AI智能生成
git
作者其他创作
大纲/内容
GIT基本使用
获取GIT仓库
在现有目录中初始化仓库
git init:当前目录会建立一个名为.git子目录,包含所有必须的仓库文件,也包含即将提交的文件元数据
克隆远程仓库
git clone 地址:下载远程仓库中的每一个文件每一个版本
克隆远程仓库中指定分支:git clone -b promotion_dev http://gitlab.dmall.com/trading/promotion.git
-b promotion_dev:表示直接checkout出promotion_dev分支,而不是master分支
提交的基本流程
git status:检查文件处于那种状态
工作区显示的几种状态
On branch dev:表示当前分支在dev分支上
Changes not staged for commit:表示当前文件已被修改,但未被放入暂存区
Untracked files:表示当前文件没有被跟踪,及在GIT中不存在此文件
Changes to be committed:表示该已被加入到暂存区,下次提交时会被持久化到库中
git status -s:以简短的方式展示状态信息
git add *.c:添加结尾为c的文件到暂存区
添加两种状态的文件到暂存区
未被跟踪的文件
已跟踪且被修改的文件
git commit -m 'initial ':将暂存区的文件提交到本地库中,-m表示提交说明
git commit:会启动文本编辑器,以便输入本次提交的说明
git commit -a -m "new submit":会跳过git add步骤,也就是跳过暂存区,直接提交到本地库汇总
git commit --amend:提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了,即最终你只会有一个提交 - 第二次提交将代替第一次提交的结果
git push:将本地库中的文件推送到远程库中
忽略文件:项目目录中建立文件,名为.gitignore
格式规范
所有空行或者以#开头的行都会被 GIT 忽略
可以使用标准的glob模式匹配
匹配模式可以以"/"开头防止递归
匹配模式可以以"/"结尾指定目录
"*"匹配零个或多个任意字符
[abc]匹配任何一个在方括号内的字符
“?”匹配任意一个字符
“**”匹配任意中间目录
[0-9][a-z]表示匹配给定范围
每行一个表达式
全局配置定义忽略文件
在~/.gitconfig目录新建.gitignore_global
将.gitignore_global路径添加至.gitconfig
{"svg:width":"500"}
打标签:给历史中的某一个提交打上标签,以示重要
标签分类
轻量标签:像一个不会改变的分支,它只是一个特定提交的引用
附注标签:存储在 Git 数据库中的一个完整对象,包含附属的打标签者名字、电子邮件地址、日期时间和标签信息
常用命令
git tag:列出已有的标签
git tag -l 'v1.8.5*':列出匹配v1.8.5的所有标签
git tag -a v1.0 -m 'test':附注标签,添加版本为v1.0,信息为test的标签
git tag v1.4-lw:轻量标签,轻量标签没有作者,电邮,日期,标签等信息
git tag -a v1.2 43335b36ec9f8c53c8610713acb595ce8249a4fb:对过去的某个提交打标,后面跟随着校验和
git show v1.0:可以显示标签信息和对应提交的信息
常用命令
本地命令
git diff:对比修改的文件
查看已暂存的修改git diff --staged:已暂存的和GIT库中版本的差异
查看未暂存的修改git diff:工作目录中当前文件和暂存区域快照之间的差异
git rm:从已跟踪的文件清单(已暂存区)中移除,不会删除文件。
git rm -f:删除之前修改过并且已经放到暂存区域的文件,可用此命令
git rm --cached:删除GIT仓库中的文件,但该文件仍然在当前工作目录,也即GIT不会继续跟踪改文件
git rm \*.log:支持删除glob通配符,记住“*”前需要加上反斜杠,因为GIT有自己的扩展匹配
git mv file1 file2:修改文件名file1 -> file2
git log:查看提交历史,包括SHA-1 校验和;作者的名字;电子邮件地址;提交时间以及提交说明
扩展命令:组合例子(git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \)
git log --stat:查看每次提交的简略统计信息
git log --pretty=oneline/short/full/fuller:以不同格式展示提交的日志
git log --pretty=format:"%h - %an, %ar : %s": 以自定义格式展示提交的日志
%H:提交对象(commit)的完整哈希字串
%h:提交对象的简短哈希字串
%T:树对象(tree)的完整哈希字串
%t:树对象的简短哈希字串
%P:父对象(parent)的完整哈希字串
%p:父对象的简短哈希字串
%an:作者(author)的名字
%ae:作者的电子邮件地址
%ad:作者修订日期(可以用 --date= 选项定制格式)
%ar:作者修订日期,按多久以前的方式显示
%cn:提交者(committer)的名字
git log --abbrev-commit:仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
git log --graph:显示 ASCII 图形表示的分支合并历史
git log -p:按补丁格式显示每个更新之间的差异
git log --since=2.weeks:表示最近两周提交的日志
git log -2:表示最近两条提交日志
git log --author:仅显示指定作者相关的提交
git log --grep:仅显示含指定关键字的提交
git log -Sfunction_name:仅显示添加或移除了某个关键字的提交
git log --after:仅显示指定时间之后的提交
git reset HEAD file:暂存区的file文件重置为未暂存文件为未暂存文件,更新内容还在
git reset --hard:还原已暂存的文件为初始状态,更新内容丢失,但对未暂存的文件不影响
git checkout new_branch:切换本地分支至new_branch,注意必须保证当前分支文件都提交了,否则切换不了
git checkout file:还原未暂存的文件为初始内容,但对暂存区的文件无效
git checkout 263b258861d701bb25c9f7099c27496b817a:检出指定的历史版本
git checkout -b new_branch:新建分支new_branch,并自动切换到new_branch分支
git branch:查看本地仓库的所有分支及当前所在分支
git branch new_branch:新建本地分支,名为new_branch
git branch -a:查看远程和本地的所有分支
git branch -d old_branch:删除本地分支old_branch
远程命令
git remote:查看当前所对应的远程仓库
git remote -v:显示远程仓库简写与其对应的 URL
git remote add test https:/remote_store/test:添加一个远程仓库,仓库名为test
git remote show origin:查看远程仓库origin更详细信息
git remote rename test test2:重命名远程仓库test->test2
git remote rm test:删除test远程仓库
git fetch test:可以通过名字或地址来拉取远程仓库所有数据
git pull:同步当前远程分支到本地
git push:推送当前分支已提交的代码到远程
git push origin new_branch:推送当前分支test代码到远程origin仓库中,配合新建本地分支(git branch new_branch)使用
git push origin v1.2:默认本地新建标签不会同步到远程,需要用本条命令将特定标签推送至远程服务器
git push origin --tags:将本地所有的标签推送至远程服务器
git branch -r -d origin/del_branch
git push origin :del_branch
删除远程分支del_branch,本地不会被删除
删除远程分支另一种方案:git push origin --delete serverfix,删除远程分支serverfix
GIT分支模型
对比:SVN,CVS等相对于GIT,常常需要完全创建一个源代码目录的副本
GIT数据结构(对象之间的指向,都可看做一个指针指向)
GIT针对每个提交,目录,文件都会产生一个对象信息。目录对象存储着目录下所有文件对象的信息,而顶级目录对象会被一个提交对象(每次提交都会产生一个新的提交对象)所关联。 提交对象 -> 目录对象 -> 文件对象
分支主题
除了初始对象,之后每次提交都会产生一个新对象并指向父级(前一次提交)对象
分支主题
master(名字可随机取)分支总是指向最新的提交对象,HEAD表示当前工作目录的是那个分支
分支主题
分支切换原理
分支创建(git branch testing):仅仅创建一个可移动的指针对象
分支主题
切换分支(git checkout testing):仅仅将HEAD重新指向testing分支上
分支主题
当在新分支(testing)提交新文件,HEAD向前移
分支主题
切换回master分支,仅仅将HEAD指向原master分支上
分支主题
在master分支提交新文件,会产生新的枝干,并且HEAD也会向前移
分支主题
合并分支原理
直线父子合并
设定为三个分支:master,hotfix,iss53。当前所在分支为master
分支主题
合并hotfix分支:git merge hotfix,这里没有文件分歧情况,仅仅将master指针向前移至hotfix分支
分支主题
分叉分支合并
git merge方式:可以通过git branch --merged查看那些分支已合并至当前分支
设定两个分叉分支:master,iss53,当前分支在master上
分支主题
合并分支iss53:git merge iss53,将在C4和C5基础上产生一个新快照C6,并将master指针指向C6
分支主题
git rebase(变基)方式:使分支历史看起来没有经过合并一样
设定两个分支:origin,mywork,当前分支为mywork
分支主题
合并origin分支:git rebase origin,运行命令后,C5和C6分叉分支会被回收,而mywork分支则指向新的C6`,并且其直线父提交为C4
分支主题
服务器端GIT
支持4种协议传输资料
本地协议(Local)
从本地克隆:git clone /opt/git/project.git
从本地克隆:git clone file:///opt/git/project.git
HTTP协议
ssh协议
GIT协议
建立GIT私服
版本控制简史
手工版本控制
优点:方便,简单
缺点:易被误删,易被误覆盖,单点数据易丢失,不利于协作,不可控制权限
本地化版本控制系统
优点:方便,简单,集中式管理,版本自动管理,可控权限
缺点:易被误删,单点数据易丢失,不利协作
集中式版本控制系统
优点:方便,简单,集中式管理,版本自动管理,易协作,可控权限
缺点:单点数据易丢失,服务器脱机后不可同步,历史数据丢失风险
分布式版本控制系统
优点:方便,简单,集中式管理,版本自动管理,易协作,可控权限,拷贝既是完整历史
缺点:分布式版本管理复杂,学习曲线
GIT基本概念
版本跟踪:直接记录快照,而非差异比较
GIT:保存全部文件的快照的索引,有更新则索引指向新文件,反之则指向原文件
子主题 1
传统:以文件变更列表的方式存储信息,它将保存的信息看作一组基本文件和文件随时间逐步累积的差异
子主题 1
近乎所有操作都是本地,因为本地就存有完整的历史
保证完整性,利用SHA-1来校验,GIT利用文件内容的哈希值来索引,而不是文件名
五种状态
未跟踪(untracked):表示在GIT仓库中没有快照,也没有放入暂存区中
已暂存(staged):表示对已修改文件的当前版本做了标记,使其包含在下次提交的快照中
已提交(committed):表示已经安全的保存到本地数据库中
未修改(unmodified):表示从仓库取出后未做修改,也不存在与暂存区
已修改(modified):表示已经修改了文件,但还没有保存到数据库中
三个工作区域
GIT仓库:用来保存项目的元数据和对象数据库的地方
工作目录:对项目的某个版本独立提取出来的当前可编辑的内容
暂存区域:保存了下次将提交的文件列表信息,一般在GIT仓库目录中
三个流程
在工作目录中修改文件
暂存文件,将文件的快照放入暂存区
提交更新,将暂存区的快照提交到GIT仓库目录中
GIT环境配置
常用命令
配置用户名:git config --global user.name "aguang"
配置电子邮件:git config --global user.email aguang1203@gmail.com
配置默认编辑器:git config --global core.editor emacs
查看某项配置:git config user.name
查看所有配置:git config --list
获得config命令的帮助:git help config
记住密码:git config --global credential.helper store
配置命令别名:简化输入命令,设置别名依次类推
git config --global alias.co checkout:输入git co表示git checkout
git config --global alias.br branch:输入git br表示git branch
git config --global alias.ci commit:输入git ci表示git commit
三个配置文件:优先级高的覆盖优先级低的
git目录中的config文件(.git/config):只针对当前仓库有效
git config --global(~/.gitconfig):对当前用户有效
git config --system(/etc/gitconfig):对系统上所有用户有效
0 条评论
下一页