1. 介绍


Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

2. 安装


Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。

Git 各平台安装包下载地址为:http://git-scm.com/downloads

Debian/Ubuntu

Debian/Ubuntu Git 安装命令为:

apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
apt-get install git-core

Centos/RetHat

Centos/RedHat Git 安装命令为:

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum -y install git-core

Windows平台

在官网下载相应的安装包进行安装。

Mac平台

如果安装了Xcode,则默认git已经成功安装,如果没有安装可以去官网下载安装包。

也可以使用SourceTree或者Fork进行管理。

3. 配置


要使用git需要进行相应的配置。

git config --global user.name "username"
git config --global user.email email-address

4. Git工作区、暂存区和版本库


工作区、暂存区和版本库概念:

工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

1352126739_7909-300x157.jpg

图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。

图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 git rm –cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

5. 基本命令


创建仓库

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。

git init

该命令执行完后会在当前目录生成一个 .git 目录。

克隆仓库

我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。

克隆仓库的命令格式为:

git clone repo

如果我们需要克隆到指定的目录,可以使用以下命令格式:

git clone repo directory

添加与提交

git add

git add 命令可将该文件添加到暂存区。

git commit -m "提交信息"

该命令会将暂存区的内容添加到仓库中,-m后的内容为该次提交的描述信息。

分支

分支是用来将特性开发绝缘开来的。其中当创建仓库时,默认会创建名为master的分支,该分支叫做主分支。我们可以自己创建新的分支,并在该分支下工作,完成后再合并至主分支。

git checkout -b 分支名

该命令会传建一个名为分支名的分支,并切换至该分支

git checkout 分支名

该命令会切换至该分支,切换时要保证暂存区是没有内容的。

git branch -d 分支名

该命令会删除该分支。

推送改动

git remote add origin server

在提交改动到远程仓库时,需要添加服务器地址,比如上面的指令表示添加一个名为origin的服务器,地址为server。

git push origin master

当提交过改动后,我们可以执行该指令将仓库推送到远程仓库,其中origin表示当前仓库设置的远程服务器,master表示推送的分支。

更新与合并

git merge 分支

该命令会将该分支合并至当前分支,当合并时会有可能导致冲突(conflicts)。这双我们需要我们自己解决这些冲突。出现冲突的文件中会出现冲突标记,需要我们自己去解决。修改完成后需要执行git add fiename命令提交改动。

git diff branch1 branch2

我们可以使用该命令查看文件内容的不同信息。

git pull 

该命令会在当前工作目录中获取(fetch)并合并(merge)远端改动。此时也会有可能导致冲突。

替换本地改动

git checkout -- 文件名

此命令会使用HEAD中最新的内容替换工作目录中的文件,已添加到暂存区的改动,以及新文件都不受影响。

如果想丢弃所有的本地改动与提交,可以在服务器上获取最新版本并将本地主分支指向它。

git fetch origin
git reset --hard origin/master