关于版本控制
什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 不单单可以对保存着软件源代码的文件作版本控制,你可以对任何类型的文件进行版本控制。
有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
Git 中所有数据在存储前都计算哈希校验和,然后以校验和来引用。若你在传送过程中丢失信息或损坏文件,Git 就能发现。
实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
——版本的唯一标识,版本回退时就要用到这个标识符。
已修改(modified)、已暂存(staged)和已提交(committed)。
已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。已提交表示数据已经安全的保存在本地数据库中。
基本操作流程
在系统上刚安装完Git后,需要要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
- /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 使用
--system
选项的 git config 时,它会从此文件读写配置变量。- ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 使用
--global
选项让 Git 读写此文件。- 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库,使用
--local
。
配置文件覆盖(overload)关系:当前仓库.git/config 覆盖 ~/.gitconfig 或 ~/.config/git/config 覆盖 /etc/gitconfig
注:只覆盖同名变量
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
.gitconfig文件截图示例
.gitignore文件截图示例 一个各种语言的gitignore列表
顺便一提:home目录下(其他位置也有)有许多的 .xxx开头的隐藏文件和文件夹(需勾选show hiden files),这些文件是各种环境的配置文件,统称为dotfiles,对于一些常用的自己量身定制的配置文件(如.bashrc, .vim, .emacs, .gitconfig, .gitignore …)( 每台计算机上只需要配置一次),技术人员会将这些文件保存到云端(github上一堆),方便换到其他电脑时直接下载使用。好东西值得拥有!!好东西值得拥有!!好东西值得拥有!!(打算弄个,暂时没有)
基本指令大全:已按照功能将指令分块,便于忘记指令时按照需求快速查找定位。点进去啊,这个挺有意思的,可以当document使用~~
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件。
与1.1节不矛盾,上面指git管理下的文件状态,这里指工作空间下的所有文件的状态。
指令只讲用途,不讲具体操作,具体操作靠自己上手。
- init 在当前工作目录初始化git版本管理器(产生.git隐藏文件夹)
- clone 克隆远程仓库到当前工作目录(clone的方式会自带一个.git隐藏文件夹,下载.zip不会有,所以建议用clone的方式下载各种源码,方便远程同步更新和各个版本切换 )
- add 添加到暂存区
- commit 提交到仓库
- log 查看提交日志
- branch 查看所有分支
- reset 版本回退/撤销修改
- checkout 分支切换/撤销修改
- merge 分支合并
- push 把本地仓库推送到远程仓库
- fetch 把远程仓库拉回本地仓库
- pull 把远程仓库拉到工作区 fetch+merge
1. HEAD 始终指向<<当前所处>>分支的最新的提交点。所处分支变了或产生了新的提交点,HEAD会变. 将 HEAD 想象为当前分支的别名
2. Working directory,它是你的工作目录,也是当前你看到的东西。你的工作目录是与版本、分支相关的。
3. Stage 虽然看不见,但是执行git status就会看到哪些对象的修改将在下一次commit的时候被放进本地仓库。
1. fork 将别人的仓库复制到自己的git上。
2. clone 到本地仓库。
3. 新建分支,修改提交A
4. 修改提交B
5. 远程master有更新C
6. rebase操作
7. push到自己的远程仓库
8. 申请提交pull request
大型团队项目中高效快速管理分支(初始化/新建/结束 分支)
先看参考链接2,然后结合上图,7条指令干了什么一目了然。
- git flow init
- git flow feature start xxx
- git flow feature finish xxx
- git flow release start 0.1.xx
- git flow release finish 0.1.xx
- git flow hotfix start xxx
- git flow hotfix finish xxx
知道了基本命令的用途后,可以结合git相关的UI界面来快速上手,如git gui和gitk。
ubuntu可以用非商用免费版的SmartGit,同样支持git-flow。
参考:
1. git教程
2. A successful Git branching model-Git Flow
3. Using git-flow to automate your git branching workflow