git 是一个分布式版本控制软件,最初由林纳斯·贝内迪克特·托瓦兹(Linus Benedict Torvalds)创作,于 2005 年以 GPL 许可协议发布。最初目的是为了更好地管理 Linux 内核开发而设计。应注意的是,这与 GNU Interactive Tools (一个类似 Norton Commander 界面的文件管理器)不同。
git 最初的开发动力来自于 BitKeeper和Monotone 。 git 最初只是作为一个可以被其他前端(比如 Cogito 或 Stgit )包装的后端而开发的,但后来 git 内核已经成熟到可以独立地用作版本控制。很多被广泛使用的软件项目都使用 git 进行版本控制,其中包括 Linux 内核、X.Org 服务器和 OLPC 内核等项目的开发流程。
工作区域
Git 在本地一般有三个区域: 工作区、暂存区、本地仓库。如果加上远程仓库(在这里我们以 GitHub 为例)就可以分为四个工作区域。如下图所示:
- 工作区: 平时存放项目代码的文件夹。
- 暂存区: 临时存放你当前的所有操作改动,其本质上只是一个文件,保存将提交到文件列表信息。
- 本地仓库: 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中 HEAD 指向最新放入仓库的版本
- 远程仓库: 托管代码的服务器,可以简单的认为是项目组中的一台电脑,其专门用于代码存放和远程数据交换。
工作流程
一般情况下,git 的工作流程是这样的:
- 在工作区进行文件的添加、修改操作(即代码开发,或资源文件添加修改);
- 将需要进行版本管理的文件放入暂存区域;
- 将暂存区域的文件提交到 git 本地仓库。
文件的状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会导致提交了现在还不想提交的文件,或者要提交的文件没提交上。一般文件的状态有以下四种:
- Untracked: 未跟踪。此文件在文件夹中,但是并没有加入到 git 仓库中,不参与版本控制,如果需要参与版本控制其可通过 git add 状态即可变为 Staged。
- Unmodify: 文件已入库但未修改。即版本苦衷的文件快照内容与文件夹中的文件完全一致,这种类型的文件有两种去处,如果被修改则会变为 Modified;如果使用
git rm
命令移出仓库,则会成为 Untracked 文件。 - Modified: 文件已修改。其只进行了修改操作,也有两种去处,使用
git add
命令可进入暂存 Staged 状态;使用git checkout
则丢弃修改记录,返回到 Unmodify 状态(git checkout
即从仓库中去除文件,会覆盖当前修改) - Staged: 文件进入暂存区。使用
git commit
则将修改同步到仓库中,此时仓库中的文件和本地文件一致,文件即变成 Unmodify 状态;使用git reset HEAD filename
从暂存区取出文件,文件状态变为 Modified 。
基本操作
本文章所有的操作是基于 Git2.4x 、GitHub 环境下,读者请按需查看。
克隆
克隆远程仓库至本地,即从远程仓库完全镜像一个仓库到本地文件夹下。
1 | git clone https://github.com/#name#/#repositoryname#.git |
分支
一般情况下,为了避免对 master 分支代码直接开发,需要在本地创建一个新的分支,以避免不同开发环境造成的配置冲突等。
1 | 列出本地所有分支 |
查看文件状态
1 | 查看所有文件状态 |
暂存文件
将修改过的文件添加到暂存区。
1 | 添加单个修改的文件至暂存区 |
提交修改
将暂存区的更改提交到本地仓库,并添加提交信息。
1 | git commit -m "Message" |
拉取
从远程仓库拉取最新的更改到本地。
1 | git pull origin master |
推送
将本地的更改提交到远程仓库。
1 | git push origin master |
子仓库
- 创建:
当我们的项目伴随着时间的增长越来越大的时候,单一的仓库便不再方便管理,这时候就需要将部分功能提取出来单一作为一个仓库管理,这时候就会出现仓库里面包含仓库的情况。这时候就需要 git submodule
添加子仓库。
1 | git submodule add https://github.com/#yourname#/#repositoryname#.git path |
注意: 添加完子仓库后,一定记得先 commit
提交保存后,在进行其他操作,养成保存的良好习惯。
- 删除:
- 进入包含子模块的父仓库根目录。
- 使用命令
git submodule deinit 子仓库路径
,将子仓库从父仓库的配置中删除。 - 使用命令
git rm 子仓库路径
,删除子仓库所有文件。 - 进入 .git/module ,删除相关仓库文件夹。
- 提交修改,使用命令
git commit -m “备注"
。
多人协作
对于非仓库管理者而言,因为没有任何的权限,无法进行 push
操作,首先需要将项目克隆至本地,这样可以获取代码并在本地进行修改,修改完后需要进行 pull request
操作请求仓库管理者进行代码合并。
什么是 fork ?
fork
即在自己的 GitHub 账户中创建一个原始仓库的副本,该操作会使得副本仓库包含原始仓库的所有代码和历史记录,此时能够在副本中独立进行修改和开发,且不影响原始仓库。如果你想要将你的修改合并到原始仓库中,可以向原始仓库提交 “Pull Request(拉取请求)”,请求将你的修改该合并到原始仓库,待仓库管理员同意后即可合并。这是一种多人协作方式,常见于开源项目的贡献和团队合作。
什么是 Pull Request ?
Pull Request 是协作机制,常用于开源项目或团队协作中。此操作是将自己的修改提交到项目的管理者,请求将这些修改合并到原始仓库中。Pull Request 一般会伴随着 fork
同时使用。