跳至主要内容

一个人用的 Git

Git 是目前比较时髦的版本控制系统,虽然 linux 内核源码是使用它来管理的,但系统非常小巧而且使用简单,比起 svn (subversion) 系统,git 有一个明显的优势就是在不联网的情况下也可以查阅或者回滚历史版本,有时带着笔记本出外工作这个功能是非常有用的。下面介绍一下用 Git 管理个人电脑上的个人文档文件。(@ivarptr)

这篇文章有几个假设前提:
a、你从事的工作有很多文档需要书写或者整理,而且文档篇幅比较大需要经常修修改改,有时还可能需要回档(即恢复到历史的某个版本)。
b、你的文档具有关联性的,比如一个项目策划书,有多份文本文档、电子表格、图片,希望平时能整体记录一个版本(快照)。
c、你有多台工作用的电脑,为了简单起见,下文假设只有两台电脑。
d、你有一台能够在互联网上访问的服务器,最好是跑 linux 系统而且有 ssh 登录权限。
e、为了简明,省略了安全权限设置和Git最为突出的特性“分支”。

1、几个必须厘清的概念
a、svn只有一个远程仓库集中管理所有的版本,而Git分有“本地仓库”和“远程仓库”之分,在提交你的最新文档过程中,需要两层提交,一次是提交到本地仓库,然后才可以提交到远程仓库。
b、svn的远程仓库保存的总是全局最新的版本,各个支点(小组成员)必须对此仓库负责。而Git则没有集中远程仓库之说,理论上每个人的地位是平等的,同时每个人的本地仓库也可以配置为给他人访问的“远程仓库”。不过对于个人或者一个小团队来说,为了简便起见我们通常会协商好让某个远程服务器上的仓库保持最新并且集中管理,这点跟Svn类似。
c、svn的每次提交会产生一个递增的数字作为版本号码,而git每次提交会产生一个“快照”,快照不是用一个递增的数字作为名称的,而是一个hash值,当然用一个hash值来呼叫某一次提交也太累赘了,所以在实际应用过程中我们往往只用hash指的头4~6位就可以了(类似一个人的昵称)。

2、在服务器上创建 Git 仓库
关于在 linux 系统里如何安装 Git 程序可以参考这篇《在CentOS 5.5里安装Git以及搭建Git服务器最简单教程》,要记住 Git 程序是不区分服务端或客户端的。

首先我们要创建一个Git仓库,使用 ssh 登录到你的服务器,在用户home文件夹里创建一个文件夹,为了容易识别,最好在文件夹名字后面加一个“.git”后缀,比如“homework.git”,然后进入这个文件夹并且执行命令
git --bare init

那么仓库就建立好了。远程访问这个仓库的地址是:
your_account_name@your_host_name:homework.git

假如你在用户home文件夹子层里创建仓库,那么就把上面的地址“homework.git”部分替换成完整的路径,比如“mydocuments/projects/homework.git”,当然也可以使用绝对路径。

3、在第一台电脑上创建本地仓库
首先在待版本控制的文件夹里(可以是刚刚新建的)执行下面命令创建本地仓库:
git init

然后将需要版本控制的文件和文件夹创建(或者从别处copy过来)并执行下面的命令将之逐一添加到本地仓库:
git add file1.txt
git add dir1
......

如果希望文件夹里所有的文件都加入本地仓库,那么只需简单执行:
git add .

需要注意的是,git add命令仅仅是将文件标识为“受版本控制”,并没有真正进入git仓库。在添加过程中可以使用 git status 命令查看哪些文件已经添加了,哪些还没有。

有时可能希望排除一些文件,可以把希望排除的文件或文件夹名字书写到文件夹根目录的 .gitignore 文件,没有这个文件的话则新建即可。内容如下:
bin/
.notes
/temp/

上面三行分别表示排除所有文件夹里面名字为 bin 的文件夹,排除所有文件夹里面名字为 .notes 的文件,排除首层文件夹里面名字为 temp 的文件夹。
当然别忘了把这个文件也添加到本地仓库:
git add .gitignore

所有文件和文件夹添加完毕之后,就可以提交了(要注意这次提交仅仅提交到本地仓库,接下来才是提交到服务器),提交之后就会形成一个快照:
git commit

上面的命令执行的时候你需要输入提交备忘文字,跟 svn 不同,git 每次提交的备忘文字是必须填写的。

你可以使用命令 git log 来查看这次提交的hash值。

4、把第一台电脑上的本地仓库提交(上传)到服务器
在受版本控制的文件夹里执行下面命令添加一个远程仓库
git remote add origin your_account_name@your_host_name:homework.git

这里的 origin 表示远程仓库的名字,默认的主要的远程仓库我们一般命名为 origin。然后就可以把本地仓库提交到远程仓库了:
git push

不过先等等,由于服务器上的版本库是刚刚创建的,也就是说里面是空的,所以第一次提交需要指定一个远程仓库分支名称,默认主分支名称为 master,所以上面的命令要改为:
git push origin master

而以后的第二次第N次提交就可以省略“master”这个分支名称了。“分支”是Git的重要特性,建议读者阅读文章末尾的书籍,而此文为了简便则省略了。

5、在第二台电脑上创建本地仓库并拉取(下载)远程仓库

转到待版本控制的文件夹里(可以是刚刚新建的)执行下面命令创建本地仓库:
git init

添加远程仓库:
git remote add origin your_account_name@your_host_name:homework.git

拉取远程仓库的最新版本下来
git fetch origin master

拉取下来之后会发现本地文件夹里面仍然没有任何改变(假如文件夹是新建的,则里面是空荡荡的),那是因为本地仓库仍然停留在旧时状态,只要把远程最新的提交合并到本地仓库就好了:
git merge origin/master

6、第一台电脑上有文档发生更改,或者有新文档需要增加
对于新增加的文档,需要用 git add 命令标识它受版本控制,否则使用 git commit 命令提交时是不会自动包含新增加文件的。比如新增加 readme.txt:
git add readme.txt

对于修改过的文档,同样需要用 git add 命令标识它需要重新提交到本地仓库,否则提交时不会自动提交发生更改的文档。比如 file1.txt 发生了更改:
git add file1.txt

然后提交到本地仓库
git commit

如果没有新文档需要增加,仅仅是提交发生过更改的文档,则上面的命令可以简化为:
git commit -a

合并到远程分支
git merge origin/master

提交到远程仓库
git push (默认提交到origin/master分支,此命令相等于 git push origin master)

7、第二台电脑也有文档发生更改
通常我们在提交新的更改之前,最好先拉取一下远程仓库,以保证你得到最新的版本,你的工作是在最新版本的基础之上开始进行的,所以上面的第6步其实缺少了下面的两个操作。
git fetch (默认拉取origin/master分支,此命令相等于 git fetch origin master)


把远程分支合并到本地分支:
git merge origin/master



对于修改过和新增的文件需要先使用 git add 和 git commit 提交到本地仓库,然后合并到远程分支,再提交:


git merge origin/master
git push

日常操作流程
往后第一台和第二台电脑的操作都跟上面的第7步一样了,实际上日常的操作大致如下:
a、(工作开始之前,或者上班之后第一件事)拉取远程仓库最新的提交,合并到本地分支。
b、工作中途时不时提交到本地仓库,以制造更多的快照以便日后能更细粒度地回档。
c、一个阶段完毕之后(或者下班之前),把本地分支合并到远程分支,并提交到远程仓库。

补充1、简化第二台电脑的初始化工作
即上面的第5步,可以用下面命令一步完成:
git clone your_account_name@your_host_name:homework.git

补充2、一些常用的命令
a、修正最后一次提交,比如刚刚提交完毕之后发现漏掉添加一个文件了,或者备注文字写错了:
先把该添加的文件添加上(git add),然后:
git commit --amend

b、取消不小心添加进入暂存的文件
git status (先查看是否被暂存了)
git reset HEAD some.file

c、还原文件的修改
git checkout -- some.file (两个减号)

d、恢复到某次快照(即回档)
git log (查看所有修改记录,记住快照的hash值,一般记住hash值前头4到6位就足够了)
git checkout HASH (把HASH替换成相应的hash值)

e、恢复到最新版本
git checkout master

f、已经修改了一些文件,希望创建多一个分支来处理这些修改(这点已经有少许超纲了,不过因为很常用所以在此列出来)
先用 git status 看看是否真的已经修改过文件了,确定之后再继续。
git stash (创建临时储存堆栈)
现在用 git status 查看应该是干净了。
git branch NAME(创建一个新分支,名字为 NAME)
git apply (调出临时储存堆栈)
git commit -a (提交到新的分支)

对于临时储存堆栈,还有 git stash list, git stash drop 这两个常用命令,看名字就知道他们的作用了。

补充3、Git 的学习资料
《Pro Git》可以在这里免费获取:
还有中文版

评论

此博客中的热门博文

在家用PC里体验 FreeBSD 8.1(上)

F reeBSD ( http://www.freebsd.org/ ) 是一个开源免费的操作系统,最早接触FreeBSD是约7年前在 @hplcsz 挂bbs的服务器,后来很少关注了,最近接触到 Apple 的 MacOS 和 iOS (基于FreeBSD衍生出来的操作系统)联想起FreeBSD项目,才发现它已经更新到8.1版了。 恰好家里多出一台电脑暂时没有用,于是尝试用FreeBSD 8.1配置一台适合家用的电脑(用来看看新闻灌灌水的那种),于是有了如下一篇文章。 (注:这里假设读者已经有一定的Linux/BSD基础) 首先访问 FreeBSD 项目的官方网站,下载 FreeBSD 8.1的安装镜像文件( ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.1/ ),这里提供CD版、DVD版和U盘版,考虑到我有DVD刻录机,所以下载了DVD版。 下载过程是一个漫长的等待,期间强烈推荐阅读一下官方的《FreeBSD使用手册》(中文版,以下简称《使用手册》)( http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/index.html ),如果对Linux/BSD不是很熟悉,前3章是很有必要阅读的,否则会被折腾到2012年。等待DVD镜像下载完,大概已经看到第10章了。 1、安装 FreeBSD 8.1 刻录下载回来的DVD镜像文件,从光驱启动然后选择“Quick模式”即开始安装过程。结合《使用手册》一般没有多大问题,因为这篇文章重点是如何搭建家用PC的环境,所以具体的安装过程这里就省略了。小技巧: A、 FreeBSD 必须安装在主分区,在安装之前你必须腾出一个至少10来GB的主分区。 B、 当安装问你是否安装“Ports(相当于软件商店、软件中心)”时,要选择“YES”。 C、 当安装接近完成时,程序会问你 “Would you like to browse the collection now?“,这一步是问你是否安装DVD上附带的软件,选择Yes,然后把下面这两个大块头选中,这样能避免从网络下载桌面环境的安装文件,节省时间和网络流量,减低碳排放: + X11/xorg-7.5 + gnome/gnom

全新 CentOS 5.5环境挂WordPress3

本文目标:在全新的 CentOS 5.5 (32位)里安装 1、apache 2.2+ 2、mysql 5.1+ 3、php 5.3+ 4、wordpress 3 + 安装 apache, mysql, php apache 2 可以使用 yum 安装。 而 mysql 和 php 由于CentOS源的版本太旧了,所以需要添加另外一个源。这里选用的是 REMI 源,直接下载这个rpm包: http://rpms.famillecollet.com/enterprise/remi-release-5.rpm 安装这个包然后就可以安装 httpd和php了 yum --enablerepo=remi install httpd php php-common 安装php5的附加模块 yum --enablerepo=remi install php-pear php-pdo php-mysql php-pgsql php-pecl-memcache php-gd php-mbstring php-mcrypt php-xml 启动httpd服务之后,在 /var/www/html 里创建一个PHP测试文件比如 test.php,里面写入如下内容 <?php phpinfo(); ?> 浏览一下这个页面 http://localhost/test.php,如果出现PHP测试页面的话就说明 apache 和 php 已经安装成功了。 安装mysql yum --enablerepo=remi install mysql 安装完毕之后登录到 mysql 创建一个名字为 blog 的数据库,添加一个访问帐号。 安装 wordpress 下面开始安装 wordpress 了,首先到官网下载最新版的 wordpress ,然后解压到  /var/www ,要注意因为 apache 会以 root 帐号权限运行,所以为了减少麻烦,最好切换到 root 帐号再做刚才的解压操作以及下面的所有步骤。解压之后形成 /var/www/wordpress 目录,然后把该目录下面的 wp-content 添加其他人写入权限,即 chmod o+w wp-content 因为这个目录是用来存放主题、上传附件等可变

在家用PC里体验 FreeBSD 8.1(下)

在 上一章 讲到如何配置 gnome 桌面环境以及 firefox 浏览器,很快你会发现上网时不能播放 flash,这是因为 Adobe Flash 没有提供 FreeBSD 版本,为了运行这类没有开源只有编译好的 Linux 版程序,我们需要安装一个 Linux 二进制兼容包。[注1] 1、安装 Linux 二进制兼容包 为了确保安装顺利,最好把 FreeBSD Ports 更新一下。[注2] # portsnap fetch 第一次运行这个命令会下载最新的 Ports Collection,大概半小时左右下载完,然后展开安装文件: # portsnap extract 使用 portsnap update 命令更新已安装的 Ports: # portsnap update 这样更新就完成了。下面开始安装 Linux 二进制兼容包,[注3]先开启 Linux KLD 模块: #kldload linux 如果希望 Linux 兼容支持在系统初始化过程中自动启用,则应在 /etc/rc.conf 中增加: linux_enable="YES" 可以使用 kldstat 命令检查KLD模块是否已经加载成功(以百分号开头的命令表示可以用普通帐号操作,下同): % kldstat 如果看到 linux.ko 字样则表示加载成功。下面还要安装 Linux 运行时库, # cd /usr/ports/emulators/linux_base-f10 # make install distclean 这又是一个漫长的等待过程,运行完毕之后还要挂载 Linux 进程文件系统,使用如下命令: # mount -t linprocfs linproc /usr/compat/linux/proc 如果希望机器启动时自动挂载,需要在文件 /etc/fstab 里面加上这一行 linproc    /usr/compat/linux/proc  linprocfs   rw  0   0 2、安装浏览器 Flash 插件 [注4] 我们开始下载安装 Flash 的 Linux 版插件: # /usr/ports/www/linux-f10-flashplugin10 # make install c