跳转至

Git 分布式版本控制系统


2016-01-15 by dongnan

Git简介

Git是目前最先进的分布式版本控制系统。

Linus 虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus,然后由 Linus本人通过手工方式合并代码!

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!

集中式vs分布式

Linus 一直痛恨的CVSSVN都是集中式的版本控制系统,而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
回到页面顶部