Git 分布式版本控制系统
2016-01-15 by dongnan
Git简介
Git是目前最先进的分布式版本控制系统。
Linus
虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过 diff
的方式发给 Linus
,然后由 Linus
本人通过手工方式合并代码!
Linus
花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git
管理了!
集中式vs分布式
Linus
一直痛恨的CVS
及SVN
都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,
可如果在互联网上,遇到网速慢的话,可能提交一个10M
的文件就需要5
分钟,这还不得把人给憋死。
首先,分布式版本控制系统根本没有中央服务器
,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?
比方说你在自己电脑上改了文件A
,你的同事也在他的电脑上改了文件A
,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,
而SVN
在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
版本库
版本库又名仓库,英文名 repository
,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,
每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
第1步,在合适的地方创建一个空目录
mkdir git
cd git/
第2步,通过git init
命令把这个目录变成Git可以管理的仓库
git init
初始化空的 Git 版本库于 /home/dongnan/git/.git/
可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
ls .git/
branches config description HEAD hooks info objects refs
把文件添加到版本库
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT
文件,网页,所有的程序代码等等,Git也不例外。
版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词Linux
,在第8行删了一个单词Windows
。
而图片、视频这些二进制文件(如 Word文件),虽然也能由版本控制系统管理,但没法跟踪文件的变化,
只能把二进制文件每次改动串起来,也就是只知道图片从100KB
改成了120KB
,但到底改了啥,版本控制系统不知道,也没法知道。
克隆项目
git clone git@ywwd.net:dongnan/oma.git
设置标识
git config --global user.email "dongnan@ywwd.net.com"
git config --global user.name "dongnan"
添加文件
cd oma
cp shell .
git add shell
提交文件
git commit -m "add defend_ssh to shell"
[master 8e43be6] defend_ssh
2 files changed, 39 insertions(+)
create mode 100644 shell/ssh/defend_ssh.awk
create mode 100644 shell/ssh/defend_ssh.sh
推送文件
git push origin master
检查状态
git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
帮助
git --help
用法:git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
这些是各种场合常见的 Git 命令:
开始一个工作区(参见:git help tutorial)
clone 克隆一个仓库到一个新目录
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
在当前变更上工作(参见:git help everyday)
add 添加文件内容至索引
mv 移动或重命名一个文件、目录或符号链接
reset 重置当前 HEAD 到指定状态
rm 从工作区和索引中删除文件
检查历史和状态(参见:git help revisions)
bisect 通过二分查找定位引入 bug 的提交
grep 输出和模式匹配的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作区状态
扩展、标记和调校您的历史记录
branch 列出、创建或删除分支
checkout 切换分支或恢复工作区文件
commit 记录变更到仓库
diff 显示提交之间、提交和工作区之间等的差异
merge 合并两个或更多开发历史
rebase 在另一个分支上重新应用提交
tag 创建、列出、删除或校验一个 GPG 签名的标签对象
协同(参见:git help workflows)
fetch 从另外一个仓库下载对象和引用
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象
小结
现在总结一下今天学的两点内容:
- 初始化一个Git仓库,使用git init命令。
- 添加文件到Git仓库,
git add <file>
。 - 提交到Git仓库,
git commit
。