Git 是目前比较流行的版本控制系统,系统非常小巧。简单看了一下,基本功能使用起来也不算,而且可以在不联网的情况下也可以查阅或者回滚历史版本。正好搭建静态Blog需要一套同步系统,几经周折,打算试试用Git做写作文档的同步和版本管理。简单查阅了一下Git的基础用法,整理一下。该使用笔记比较适合Git做个人简单笔记和文件的版本管理和同步场景,真正团队代码版本管理的场景还要考虑安全权限、分支等更复杂的功能。

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

1、安装Git

git不区分服务器端和客户端,Linux下直接 yum install git;Windows下载安装;

2、SSH访问服务器:

git shell中执行ssh-keygen,在用户文件夹的.ssh文件夹下生成id_rsa、id_rsa.pub密钥对,将id_rsa.pub中的内容复制到server对应用户.ssh/authorized_keys中即可;

3、Git Config

Git 提供了一个叫做 git config 的工具(译注:实际是 git-config 命令,只不过可以通过 git 加一个名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方: /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。 ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。 在 Windows 系统上,Git会找寻用户主目录下的.gitconfig 文件。主目录即$HOME变量指定的目录,一般都是 C:\Documents and Settings\$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。 要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录 $ git config –global user.name “John Doe” $ git config –global user.email johndoe@example.com $ git config –list

4、在服务器上创建 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”,当然也可以使用绝对路径。

5、在第一台电脑上创建本地仓库

首先在待版本控制的文件夹里(可以是刚刚新建的)执行下面命令创建本地仓库: git init 然后将需要版本控制的文件和文件夹创建(或者从别处copy过来)并执行下面的命令将之逐一添加到本地仓库: git add file1.txt git add dir1 如果希望文件夹里所有的文件都加入本地仓库,那么只需简单执行: git add . 需要注意的是,git add命令仅仅是将文件标识为“受版本控制”,并没有真正进入git仓库。在添加过程中可以使用 git status 命令查看哪些文件已经添加了,哪些还没有。有时可能希望排除一些文件,可以把希望排除的文件或文件夹名字书写到文件夹根目录的 .gitignore 文件,没有这个文件的话则新建即可。内容如下: bin/ .notes /temp/ 然后把这个文件也添加到本地仓库: git add .gitignore 所有文件和文件夹添加完毕之后,就可以提交了(要注意这次提交仅仅提交到本地仓库,接下来才是提交到服务器),提交之后就会形成一个快照: git commit 上面的命令执行的时候你需要输入提交备忘文字,跟 svn 不同,git 每次提交的备忘文字是必须填写的。 你可以使用命令 git log 来查看这次提交的hash值。

6、把第一台电脑上的本地仓库提交(上传)到服务器

在受版本控制的文件夹里执行下面命令添加一个远程仓库 git remote add origin your_account_name@your_host_name:homework.git 这里的 origin 表示远程仓库的名字,默认的主要的远程仓库我们一般命名为 origin。然后就可以把本地仓库提交到远程仓库了。由于服务器上的版本库是刚刚创建的,也就是说里面是空的,所以第一次提交需要指定一个远程仓库分支名称,默认主分支名称为 master: git push origin master 以后提交就可以省略“master”这个分支名称。

#####7、在第二台电脑上创建本地仓库并拉取(下载)远程仓库 转到待版本控制的文件夹里(可以是刚刚新建的)执行下面命令创建本地仓库: git init 添加远程仓库: git remote add origin your_account_name@your_host_name:homework.git 拉取远程仓库的最新版本下来 git fetch origin master 拉取下来之后会发现本地文件夹里面仍然没有任何改变(假如文件夹是新建的,则里面是空荡荡的),那是因为本地仓库仍然停留在旧时状态,只要把远程最新的提交合并到本地仓库就好了: git merge origin/master

8、有文档发生更改,或者有新文档需要增加

通常我们在提交新的更改之前,最好先拉取一下远程仓库,以保证你得到最新的版本,你的工作是在最新版本的基础之上开始进行的。 git fetch (默认拉取origin/master分支,此命令相等于 git fetch origin master) 把远程分支合并到本地分支: git merge origin/master 对于新增加的文档,需要用 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)

附录1:一些常用的命令
  • 修正最后一次提交,比如刚刚提交完毕之后发现漏掉添加一个文件了,或者备注文字写错了: 先把该添加的文件添加上(git add),然后: git commit –amend
  • 取消不小心添加进入暂存的文件 git status (先查看是否被暂存了) git reset HEAD some.file
  • 还原文件的修改 git checkout – some.file (两个减号)
  • 恢复到某次快照(即回档) git log (查看所有修改记录,记住快照的hash值,一般记住hash值前头4到6位就足够了) git checkout HASH (把HASH替换成相应的hash值)
  • 恢复到最新版本 git checkout master
附录2:Git 的学习资料

《Pro Git》:http://progit.org/ 中文版:http://progit.org/2010/06/09/pro-git-zh.html