快速入门系列--GIT版本控制工具
由于GIT刚刚开始使用不久,经常会在Merge时出现没有change-id的情况,在结合gerrit使用时,经常出现不能提交的情形,使得自己很困扰。最近有次熬夜加班,在代码完成后,由于多人在很短时间内提交多次,造成提交不上去的情况,当时那个慌啊。还好有给力的大神帮忙处理,突然觉得有必要好好学学Git了,不能仅仅满足于图形化工具的使用。

- 工作区、版本库、缓存区的关系与区别,如下图:

工作区:左侧的工作区就是我们日常编辑的部分
暂存区:使用git add XXX后的部分
版本库:使用commit后的部分
HEAD:当前版本指针
- Git中的tree,blob,commit,tag的概念,

Blob: 就是一块内存区域,其中内容可以是文本,源码或者图片
Tree: 很想文件系统中的目录,可以指向blob或者其他的树,就像目录可以包含文件和子目录一样
Commit: 包含提交者的信息(姓名,Email),指向当前提交下所属的tree的指针,指向之前提交(父提交)的指针
Tag: 包含指向任意commit的指针,便于记录和使用指定的tree,而不用使用哈希值。

| Git命令 | 解释 |
| Git status | 查看当前状态 |
| Git diff | |
| Git diff head | |
| Git diff --cached/--staged | |
| Git checkout | 注意检出时会修改指针、暂存区、工作区,因此要注意该操作可能会丢失修改 |
| Git checkout - | 切换到上一个分支 |
| Git checkout <branch> | 切换到指定branch |
| Git checkout –b new_branch | 检出并创建分支 |
| Git branch | |
| Git branch –r | |
| Git commit –m 'XXX' | 提交并添加评论,需要注意的是提交什么的哈希码,是通过SHA1算法获得的160bit哈希值,在分布式版本控制系统中需要使用SHA1来唯一标识,而不是顺序ID。 |
| Git commit –am 'XXX' | |
| Git commit --allow-empty | 允许空白提交 |
| Git commit --amend | 对刚刚的提交进行修补,不会产生新的提交。有时,在merge操作后,在gerrit出现不能提交的情况,可以通过该命令,为merge commit产生一条changeID。其原理其实是组合了两条git命令,如下所示: |
| Git reset --soft HEAD^ | |
| Git commit –e –F .git/COMMIT_EDITMSG | |
| Git add -i | 进入交互式界面添加/修改/删除文件到暂存区,git add .快速添加所有文件 |
| Git add some_file | |
| Git rebase | |
| Git rebase –i | 合并提交,将pick改为fixup |
| Git clean –nd | 查看那些文件和目录会被删除 |
| Git clean –fd | 强制删除多余的目录和文件 |
| Git reset | 省略commit标识号,相当于使用了HEAD的指向作为提交ID。 |
| Git reset --hard some_commit_hashcode | 包含3个步骤:a.替换引用的指向;b.替换暂存区;c.替换工作区 |
| Git reset --soft <commit> | 包含1个步骤:a.替换引用的指向; |
| Git reset --mixed <commit>,默认方式 | 包含2个步骤:a.替换引用的指向;b.替换暂存区; |
| Git reset --soft HEAD^ | 工作区和暂存区不变,但引用向前回退一次 |
| Git stash | 保存当前进度,会分别对暂存区和工作区的状态进行保存,完整版本为git stash save "XXX" |
| Git stash list | 查看保存的进度列表 |
| Git stash pop | 从最近保存的进度进行恢复,并将该进度清除, |
| Git stash apply | 恢复进度,并且不删除 |
| Git stash clear | 删除所有存储的进度 |
| Git stash branch branch_name | 基于进度创建分支 |
| Git log | 查看日志 |
| Git log -i | 查看指定条目数日志 |
| Git log --graph | 以图形化的方式查看日志,在理解分支信息时很有用 |
| Git log –graph –pretty=oneline | 只查看单行的commitID |
| Git reflog | |
| Git config –global user.name | Git相关环境变量配置 |
| Git config –global alias.ci "commit -s" | 设置git操作别名,例如用ci表示类似SVN中的check in操作 |
| Vim file_name | |
| Git grep | 工作区文件内容搜索 |
| Git clone XXX | 拉代码,可以通过https和ssh等方式 |
| ls | 显示当前路径下的目录和文件 |
| Git rm/mv | 在Git中删除/移动文件 |
| Gitk --all | 最早的图形化工具 |
| Git blame | 追溯文件的修改记录(前提是bug已经定位到代码上) |
| Git bisect | 二分查找, |
| Git describe | |
| Git tag | 查看里程碑列表 |
| Git tag tagname | 轻量级里程碑,在.git/refs/tags中。其他还是重量级里程碑等内容,包括数字签名。 |
| Git cherry-pick <branch>[^^] | 拣选分支 |
| Git revert HEAD | 将HEAD提交反向再提交一次。由于修改历史操作只能是针对自己的版本库,而无法去修改别人的版本库,这时就可能需要使用revert去修正一个错误的历史提交。 |
| Git init | |
| Git push | 注意要禁止非快进式推送,理解不深 |
| Git fsck | 查看到版本库中包含的没有被任何引用关联的松散对象(danglin开头),可能是commit也可能是blob |
| Git prune | 清理临时文件(未被关联的松散对象) |
| Git gc | 垃圾回收,清理版本库 |
| Git fetch | |
| Git merge | |
| Git merge --no-ff | None fast-forward,不快速向前 |
| Git pull | 拉去本地分支关联的远程分支的内容,并merge |
| git push origin :branch-name | git 删除远程分支,冒号前空格不能少,表示把一个空分支push到server,相当于删除 |
| git remote [-v] | 查看当前本地分支track的远程分支 |
| git remote show origin | 显示远程所有的分支信息 |
| git remote rename [a] [b] | 重命名远程库 |
| git remote remove [a] | 删除远程仓库 |
| git push -u origin release | 创建远程分支,配合git branch release |
| git grep -i -r "xxxx" | 查找文件中内容 |
Tip:设置ssh到github,参考资料

Android项目包含近200个Git版本库,因而google公司开发了repo(对git的封装)和gerrit两个工具进行版本库管理,其中gerrit是一种特别的集中式协同模型,通过SSH协议管理Git版本库,并实现一个Web界面的评审工作流。其中,Git不能直接推送到分支,而是推送到特殊的引用refs/for/<branch-name>。
其中困扰我良久的change-id其实不是git中的概念,而是gerrit中的概念,它通过hooks的方式(其实就是面向切面的拦截器,在C语言中一般叫做hooks钩子,位于.git\hooks\文件夹中)为该次提交添加一个change-id,然后就可以被gerrit管理起来了。Gerrit提交方式,Git push origin HEAD:refs/for/your_brance。
Gerrit审核服务器最初其实是为Android项目开发。Redmine是一款实现需求管理和缺陷跟踪的项目管理软件,可以和Git版本库实现整合,git的提交可以之间关闭redmine上的Bug,同时Git的提交还可以反映出项目成员的工作进度。Redmine中的用户(项目成员)用一个ID做标识,而Git的提交者则用一个包含用户名和邮件地址的字符串,需要一个关联配置。
Git模型图如下所示:

Tip:
主要供自己工作参考,若有疏漏,望见谅。参考蒋鑫大师的《GIT权威指南》和大塚弘记的GitHub入门与实践,前者非常全面,后者简单有效。
Git设置SSH
第一步:生成本机ssh key, ssh-keygen -t rsa -C "xxxxxx@yy.com"
第二步:设置用户名密码,$ git config --global user.name “your_username” #设置用户名
$ git config --global user.email “your_registered_github_Email” #设置邮箱地址
第三步:测试是否成功,ssh -T git@github.com
对于git小乌龟来说:只需要在设置 -> git 编辑本地 .git/config 增加[credential] helper = store即可
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
快速入门系列--GIT版本控制工具的更多相关文章
- Git版本控制工具(一)----git的安装及创建版本库
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 前端学习 node 快速入门 系列 —— 初步认识 node
其他章节请看: 前端学习 node 快速入门 系列 初步认识 node node 是什么 node(或者称node.js)是 javaScript(以下简称js) 运行时的一个环境.不是一门语言. 以 ...
- 前端学习 node 快速入门 系列 —— npm
其他章节请看: 前端学习 node 快速入门 系列 npm npm 是什么 npm 是 node 的包管理器,绝大多数 javascript 相关的包都放在 npm 上. 所谓包,就是别人提供出来供他 ...
- vue 快速入门 系列 —— vue-cli 上
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 上 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- vue 快速入门 系列 —— 使用 vue-cli 3 搭建一个项目(上)
其他章节请看: vue 快速入门 系列 使用 vue-cli 3 搭建一个项目(上) 前面我们已经学习了一个成熟的脚手架(vue-cli),笔者希望通过这个脚手架快速搭建系统(或项目).而展开搭建最好 ...
- vue 快速入门 系列 —— Vue(自身) 项目结构
其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- Git版本控制工具(三)----远程仓库GitHub的使用
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- DOS tasklist 命令(转)
Dos命令之Tasklist用法及参数函义 2012-10-24 14:44:34| 分类: Windows |字号 订阅 TASKLIST [/S system [/U username [/ ...
- Codeforces #380 div2 C(729C) Road to Cinema
C. Road to Cinema time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- android5.1 for tq335x
万万没有想到再次编译aosp已经是半年以后了,未完的工作总是要继续进行的. aosp不是通过repo下载的,而是在百度网盘里面找了网友的分享下载的.然后编译的方法直接挂个vpn到谷歌的官网上去看需要什 ...
- Linux系统部署体验中心
Linux系统部署体验中心 安装Linux虚拟机 1. 下载安装VMware,安装64位Linux系统(Ubuntu),要求:CPU双核,2G内存,60G硬盘 2. 安装系统时,选择安装ssh服务 ...
- selenium总结篇,常见方法和页面元素的操作【转】
原文:http://www.cnblogs.com/tobecrazy/p/4570494.html 今天,总结一下selenium怎么操作web页面常见的元素. 主要有: 上传 alter dial ...
- Python-变量
1.Python的变量是什么 变量是用来存储计算机程序中的信息,唯一的目的是将数据存储在内存中. 2.Python变量的组成 变量由字母.数字.下划线组成: 变量的第一位不能是数字,可以是字母或下划线 ...
- seajs模块化作用理解(一句话)
seajs是js模块化的工具,主要大文件js不方便其他人理解,加载也较慢,seajs把各个功能模块分开,方便平行化开发,同时易于修改和理解,不用重复写功能需要时就应用 (有什么错误,请指正,缺少多谢补 ...
- sql查询重复记录、删除重复记录方法大全
查找所有重复标题的记录:SELECT *FROM t_info aWHERE ((SELECT COUNT(*)FROM t_infoWHERE Title = a.Title) > 1)ORD ...
- android更换工具链
欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=73 android编译系统是跟随android源码一起发布的,使用了gcc编译器,也就是 ...
- [原创]cocos2dx加载网络图片&异步加载图片
[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...