title: Git
tags: git,版本管理工具
grammar_cjkRuby: true
文章目录
使用
获取项目
git clone 克隆远端项目仓库至本地
分支
-
git branch 查看本地分支及当前所在分支
-v 查看分支及最后一次提交内容
-a 查看所有分支 [ 本地工作分区 + 远端仓库 ] -
git fetch 更新远端分支到本地
-
git checkout branch_name 切换到本地已存在分支
-
git checkout -b new_branch 以当前分支为基础创建分支
PS : 等同于 git branch new_branch + git checkout new_branch -
git merge branch_name 分支合并
-
git branch -d branch_name 分支删除 [未合并分支无法删除]
-D 强制删除分支 -
git push origin develop 推送分支至远端
-
git push origin : develop 删除远端分支
文件操作
-
git add 添加文件进入本地暂存区
-
git commit -m ‘标注提交内容’
-
git commit --amend 编辑最后一次提交的内容
-
git commit -a -m ‘跳过提交暂存区’
-
git stauts 查看当前当前工作区文件状态
- -s 状态简览
- git diff 查看当前工作区文件变更
- –cached 查看提交至暂存区的变更文件
- git rm index.php 删除工作区文件
- -f 强制删除变更过的文件
- -cached file_name 删除暂存区文件
- git mv a.file b.file 移动文件
- PS : 等同于 mv a.file b.file + git rm a.file + git add b.file
-
git reset <->
file_name 暂存区文件撤销提交
hard 版本回滚 -
git push origin branch_name 文件提交至远端分支仓库
-
.gitignore 过滤
Tag
-
git tag 查看所有标签
-
git tag v1.0 -m ‘’ 创建轻量级标签
- -a 附注标签
- hard 后期打标签
- git push origin tag 标签共享
- –tags 全部上传
-
git tag -d tag 删除指定标签
-
git push origin : v1.1 远端删除
-
git checkout tag 切换版本
Log
git log
-
-p 展示每次提交内容变化
-
-number -2 展示条数
-
–name-only 显示文件名
-
–name-status 显示文件状态变更
-
–author 根据提交作者展示
-
–grep 根据提交内容搜索
-
–S 根据变更内容搜索
-
–stat 简略信息
-
–pretty=[oneline | full | short] 选择展示格式
-
–pretty=format:[]
-
%H 提交对象(commit)的完整哈希字串
-
%h 提交对象的简短哈希字串
-
%T 树对象(tree)的完整哈希字串
-
%t 树对象的简短哈希字串
-
%P 父对象(parent)的完整哈希字串
-
%p 父对象的简短哈希字串
-
%an 作者(author)的名字
-
%ae 作者的电子邮件地址
-
%ad 作者修订日期(可以用 --date= 选项定制格式)
-
%ar 作者修订日期,按多久以前的方式显示
-
%cn 提交者(committer)的名字
-
%ce 提交者的电子邮件地址
-
%cd 提交日期
-
%cr 提交日期,按多久以前的方式显示
-
%s 提交说明
-
Other
-
git --version 当前GIT版本
-
git --help 命令摘要
–a | --all 全部命令列表
command 查看某条命令的操作文档 -
git remote -v 查看远程仓库
-
git archive
分支的概念
Master
- master分支只有一个。
- master分支上的代码总是稳定的,随时可以发布出去。
- 平时一般不在master分支上操作,当release分支和hotfix分支合并代码到master分支上时,master上代码才更新。
- 当仓库创建时,master分支会自己创建
Hotfix
- 当发现master分支出现一个需要紧急修复的bug,可以使用hotfix分支。
- hotfix分支基于master分支,用来修复bug,当完成bug的修复工作后,需要将其merge回master分支和Develop分支。
- 同一时间只有一个hotfix分支,其生命周期较短。
Develop
- develop分支只有一个。
- 新特性的开发是基于develop分支的,但不直接在develop分支上开发,特性的开发是在feature分支上进行。
- 当develop分支上的特性足够多以至于可以进行新版本的发布时,可以创建release分支的。
Release
- 当完成了特性的开发,并且将feature分支上的内容merge到develop分支上,这时可以开始着手准备新版本的发布,release分支正是作为发布而开设的分支。
- release分支基于develop分支,在同一时间只有一个release分支,其生命周期较短,只是为了发布而使用。这意味着,在release分支上,只是进行较少代码修改,比如bug的修复,原有功能的完善等。不允许在release分支增加大的功能,因为这样会导致release分支的不稳定,不利于发布的进行。
- 当release分支(例如,v.1.0)被创建出来后,develop分支可能正准备另一版本(例如,v.2.0),因此,当release分支merge回develop分支时,可能会出现冲突,需要手工解决冲突才能继续merge。
Future
- 可以同时存在多个feature分支,新特性的开发正是在此分支上面。
- 可以对每个新特性创建一个新的feature分支,当该特性开发完毕,将此feature分支合并到develop分支。
更多的理解:http://md.cxlf.com/htmls/public/git-flow的分支模型与及常用命令简介.html
GitFlow : http://www.cnblogs.com/cnblogsfans/p/5075073.html
其他
源
一位出生于1969.12.28的芬兰人。李纳斯·托沃兹(Linus Benedic Torvalds)linux之父,为了帮助管理Linux内核二开发的一个开源的分布式版本控制系统,可以有效处理从很小到非常大的项目版本管理。
类比
其他版本管理软件
- VSS (Visual SourceSafe)
微软的版本控制工具,仅支持Windows操作系统。虽然简单好用,但是仅适用于团队级开发,不能胜任企业级的开发工作
优:
- 安装、配置、使用均较简单,很容易上手使用;
- 权限划分可到文件夹级,有Read、Check-Out & Check-In、Add/Rename/Delete、Destroy四种权限级别。
劣:
- 权限管理基于文件共享形式,只能从文件夹共享的权限设定对整个库文件夹的权限,而且必须要有可写权限;
- 版本管理和分支管理只能靠人为的手工设置;
- 安全性不高,基于文件系统共享实现对服务器的访问,需要共享存储目录,这样用户可以对VSS的文件夹执行删除操作。
- SVN(Subversion)
其前身是CVS。SVN是根据CVS 的功能为基础来设计的,它除包括了CVS 的大多数特点外,还有一些新的功能,如:文件目录可以方便的改名、基于数据库的版本库、操作速度提升、权限管理更完善等。
优:
- 管理方便,逻辑明确,操作简单,上手快。
- 易于管理,集中式服务器更能保证安全性。
- 代码一致性非常高。
- 有良好的目录级权限控制系统。
劣:
- 对服务器性能要求高,数据库容量经常暴增,体量大。
- 必须联网。如果不能连接到服务器上,基本上不可以工作,如果服务器不能连接上,就不能提交,还原,对比等等。
- 不适合开源开发。
- 分支的管控方式不灵活
GIT & SVN
1.GIT是分布式的,SVN不是:
- 这是GIT和其它非分布式的版本控制系统,GIT并不是目前第一个或唯一的分布式版本控制系统。但GIT在这方面做的更好。
- GIT跟SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chectout代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创建项目分支。
2.GIT把内容按元数据方式存储,而SVN是按文件:
- 所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果把.git目录的体积大小跟.svn比较,会发现它们差距很大。因为,.git目录是处于自身的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3.GIT分支和SVN的分支不同:
- 分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果想知道是否合并了一个分支,需要手工运行像这样的命令svn propget_svn:mergeinfo,来确认代码是否被合并。所以,经常会发生有些分支被遗漏的情况。
- 处理GIT的分支相当的简单。可以从同一个工作目录下快速的在几个分支间切换。很容易发现未被合并的分支,能简单而快捷的合并这些文件。
4.GIT的内容完整性要优于SVN:
- GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
PS: 好好的样式导入全乱了,不让放PDF,不让上传HTML,不让传压缩文件 FK [中指] !
—— 非专业程序员的吐槽