Git 应用入门
什么是 Git
什么是 Git?,我们不妨看看看看官方的定义(点击Git,访问Git主页):
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
这段描述的大意为:Git 是一个免费且开源的分布式版本控制系统,旨在快速高效地处理从小到超大型项目的所有事务。
所以,我们可以理解 Git 是一个版本控制系统。
版本控制系统
版本控制系统,也可称之为修订系统,是一种用户可以根据时间追溯项目文件(存放于版本库中)修订历史和属性的工具,它可以帮助团队成员协作开发。
不同于 SVN,Git 采用分布式版本库的方式,可以为每个用户提供专属于自己的项目历史副本、版本库的副本,不必服务器端软件支持。
Git 与 SVN 的区别
- 架构形式不同:Git 是分布式的,SVN 是集中式的;SVN 把资源集中存储在中心点的 SVN 资源库,每个用户从中心资源库拷贝工作区到本地;而 Git 将资源库同时建立在本地和服务端(如果存在服务端的话),即每个用户本地都有资源库。
- 存储方式不同:Git 把内容按元数据方式存储;SVN 按照文件存储,把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- 分支不同:在 SVN 中分支仅仅是版本库中的一个目录;但在 Git 中分支模型支持本地分支,而且分支的发布也非常灵活,用户可以使用分支进行内容切换,还可以在开发过程中将不同工作放置于相互隔离的沙箱中,帮助构建独立、灵活的分支工作流。所以Git 的分支模型被称为必杀技特性。
- 版本管理不同:Git 没有全局版本号,而 SVN 有全局本包号。
- 安全形式不同:Git 的内容存储使用 SHA-1 哈希算法,可以降低磁盘、网络故障时对版本库的破坏;所以 Git 的内容完整性优于 SVN。
安装 Git
访问Git - Downloads ,这里提供了 macOS、Windows、Linux/Unix 环境的安装包下载或安装方法。
Git 源码托管在 GitHub,用户可以通过下面的命令获取最新版本的 Git:
git clone https://github.com/git/git
Window 端安装 Git
Windows 端 Git 安装包形式如下图所示:
下载完成后,双击 EXE 安装包,即可进行安装。
Linux/Uinx 端安装 Git
-
从源码构建
从 kernel.org 下载 Git 源码,然后从源码开始构建。
-
在线安装
# Debian/Ubuntu # For the latest stable version for your release of Debian/Ubuntu $ apt-get install git # For Ubuntu, this PPA provides the latest stable upstream Git version $ add-apt-repository ppa:git-core/ppa $ apt update $ apt install git #Fedora $ yum install git (up to Fedora 21) $ dnf install git (Fedora 22 and later) # Gentoo $ emerge --ask --verbose dev-vcs/git # Arch Linux $ pacman -S git # openSUSE $ zypper install git # Mageia $ urpmi git # Nix/NixOS $ nix-env -i git # FreeBSD $ pkg install git # Solaris 9/10/11 (OpenCSW) $ pkgutil -i git # Solaris 11 Express $ pkg install developer/versioning/git # OpenBSD $ pkg_add git # Alpine $ apk add git # Red Hat Enterprise Linux, Oracle Linux, CentOS, Scientific Linux, et al. # RHEL and derivatives typically ship older versions of git. You can download a tarball (https://www.kernel.org/pub/software/scm/git/) and build from source, or use a 3rd-party repository such as the IUS Community Project (https://ius.io/) to obtain a more recent version of git. # Slitaz $ tazpkg get-install git
macOS 端安装 Git
macOS 端安装 Git 可以通过以下方式:
-
brew 安装
通过 brew 安装首先需要在 Mac 上安装 Homebrew,然后执行以下命令安装:
$ brew install git
或者直接安装 git-gui 和 gitk:
brew install git-gui
-
Xcode
Xcode 集成了 Git。
-
二进制安装包
下载 Git 二进制安装包进行安装。
-
从源码构建
从 kernel.org 下载 Git 源码,然后从源码开始构建。
Git 基本概念和操作
基本概念
Git 技术中有三个重要的概念或术语,分别是工作区、暂存区和版本库。
- 工作区:电脑或操作系统中可见的目录,例如 opnssl 项目代码放置在 /src/openssl 目录下,那么 /src/openssl 即可视为工作区。
- 暂存区:英文称为 stage,一般存放在 .git 目录下的 index 文件中(
.git/index
) ,所以暂存区也叫索引(index)。 - 版本库:工作区的隐藏目录
.git
为 Git 的版本库(包含在工作区中但不属于工作区)。
上图中 index 即为缓存区;master 为 master 分支所代表的目录树;HEAD 为指向 maser 分支的游标;object 为 Git 的对象库,存户 Git 的数据对象(blob)、树对象(tree)以及提交对象(commit)。
目录结构
文件 | 类型 | 作用 |
---|---|---|
hooks | 文件夹 | Git 能在特定的重要动作发生时触发自定义脚本 |
info | 文件夹 | 信息 |
logs | 文件夹 | 日志 |
logs/refs/heads | 文件夹 | 本地仓库分支操作 |
logs/refs/remotes/origin | 文件夹 | 远程仓库分支操作 |
objects | 文件夹 | 所有对象 |
refs | 文件夹 | 引用间接引用 commit 的方式,commit 哈希的别名 |
ORIG_HEAD | 文件 | 当前引用的远程仓库 |
HEAD | 文件 | 当前引用的本地仓库 |
packed-refs | 文件 | Clone 仓库时的所有引用 |
COMMIT_EDITMSG | 文件 | 本地最后一次提交的信息 |
index | 文件 | 暂存区 |
config | 文件 | 配置文件 |
FETCH_HEAD | 文件 | 某个分支在服务器上的最新状态 |
基本操作
Git 的基本操作包括:创建或克隆仓库、配置仓库、提交与修改、分支管理、提交日志和操作远程仓库。
-
创建仓库
命令 说明 git init [project-name]
创建一个本地仓库 git clone [url]
下载项目及其整个版本历史记录(克隆一份远程仓库) -
配置仓库
命令 说明 git config
配置所有本地存储库的用户信息 -
提交与修改
命令 说明 git add [file]
为文件创建快照,为版本控制做准备(添加文件到仓库) git status
列出要提交的所有新文件或修改后的文件(查看仓库当前状态,显示有变更的文件) git diff
显示尚未转移的文件差异(比较暂存区和工作区文件的差异) git commit -m "[descriptive message]"
在版本历史记录中永久记录文件快照(提交暂存区到本地仓库) git reset [file]
取消转储文件,但保留其内容(回退版本) git rm [file]
从工作目录中删除文件并分段删除(删除工作区文件) git mv [file-original] [file-renamed
移动或重命名工作区文件,为提交作准备 -
分支管理
命令 说明 git branch [branch-name | -d branch-name]
创建分支、列出所有分支、-d 删除指定分支 git checkout [branch-name]
切换指定分支并更新工作目录 git merge [branch]
合并分支 -
提交日志
命令 说明 git log
列出当前分支的版本历史记录 git blame [file]
查看指定文件的历史修改记录 -
操作远程仓库
命令 说明 git remote
远程仓库操作 git fetch
从远程获取代码库 git pull
下载远程代码并合并更改 git push
将所有本地分支机构提交上载并合并到远程仓库
相互关系
当你执行一条 Git 的操作命令时,Git 的工作区、暂存区、本地仓库以及远程仓库会发生什么变化呢?
- 当在工作区修改或新增一个文件,并使用
git add
命令将文件添加到暂存区,此时暂存库中的目录树被更新,修改或新增的文件内容被写入 objects 中的一个新的对象中,而该对象的 ID 会被记录到暂存区的文件索引中。 - 在执行
git commit
时,暂存区的目录树会被写入到版本库(对象库)中,master 分支会做相应的更新,此时 master 指向的目录树就是提交时暂存区的目录树)。 - 当执行
git reset HEAD
命令时,暂存区的目录树会被 master 分支指向的目录树所替换,但是工作区不受影响。 - 当执行
git rm --cached [file]
命令时,暂存区内的文件会被直接删除,工作区则不做出改变。 - 当执行
git checkout .
或者git checkout -- [file]
命令时,工作区中的文件将被暂存区的文件替换,如果此时工作区有未被提交的修改,也会被清除。 - 当执行
git checkout HEAD .
或者git checkout HEAD [file]
命令时,工作区和暂存区中的文件会被 HEAD 指向的 master 分支中的全部或部分文件替换,该命令不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Github、Gitee、Gitlab
Git 没有像 SVN 一样的中心服务器,如果你想通过 Git 分享你的代码或者与其他开发人员合作,你就需要将你的项目存储到一台其他开发人员能够访问的服务器上。GitHub、Gitee 和 GitLab 都是基于 Web 的 Git 远程仓库,提供远程托管代码服务。
GitHub 作为目前最火的开源项目托管平台,可以提供公共仓库和私钥仓库服务,但使用私有仓库需要付费,国内访问速度较慢。
Gitee 是开源中国推出的基于 Git 的代码托管服务,中文名为码云,它提供免费的 Git 仓库,还集成了代码质量检测、项目演示等功能,但也有部分收费功能,在国内使用 Gitee,可以获得高速的网络访问体验。
GitLab 可以构建自托管的 Git 项目仓库,可以获得私人的免费仓库服务,一般用于企业内部的代码托管。