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 为例)就可以分为四个工作区域。如下图所示:

Git 工作流程
Git 工作流程
  • 工作区: 平时存放项目代码的文件夹。
  • 暂存区: 临时存放你当前的所有操作改动,其本质上只是一个文件,保存将提交到文件列表信息。
  • 本地仓库: 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中 HEAD 指向最新放入仓库的版本
  • 远程仓库: 托管代码的服务器,可以简单的认为是项目组中的一台电脑,其专门用于代码存放和远程数据交换。

工作流程

一般情况下,git 的工作流程是这样的:

  1. 在工作区进行文件的添加、修改操作(即代码开发,或资源文件添加修改);
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 列出本地所有分支
git branch

# 列出远程仓库所有分支
git branch -r

# 新建一个分支,但仍然停留在当前分支工作区
git branch [branch-name]

# 新建一个分支,并切换到新的分支
git branch [branch-name]

# 合并目标分支到当前分支
git merge [target-branch]

# 删除某一分支
git branch -d [branch-name]

# 删除远程仓库某一分支
git push origin --delete [branch-name]
git branch -dr [remote-branch-name]

查看文件状态

1
2
3
4
5
6
7
8
# 查看所有文件状态
git status

# 查看指定文件状态
git status [filename]

# 查看文件修改记录,红色删除、绿色新加。
git diff [filename]

暂存文件

将修改过的文件添加到暂存区。

1
2
3
4
5
# 添加单个修改的文件至暂存区
git add [filename]

# 添加所有修改的文件至暂存区
git add .

提交修改

将暂存区的更改提交到本地仓库,并添加提交信息。

1
git commit -m "Message"

拉取

从远程仓库拉取最新的更改到本地。

1
2
3
4
git pull origin master

# 或者如果在分支下工作
git pull origin [branch-name]

推送

将本地的更改提交到远程仓库。

1
2
3
4
git push origin master

# 或者如果在分支下工作
git push origin [branch-name]

子仓库

  • 创建:

当我们的项目伴随着时间的增长越来越大的时候,单一的仓库便不再方便管理,这时候就需要将部分功能提取出来单一作为一个仓库管理,这时候就会出现仓库里面包含仓库的情况。这时候就需要 git submodule 添加子仓库。

1
2
git submodule add https://github.com/#yourname#/#repositoryname#.git path

注意: 添加完子仓库后,一定记得先 commit 提交保存后,在进行其他操作,养成保存的良好习惯。

  • 删除:
  1. 进入包含子模块的父仓库根目录。
  2. 使用命令 git submodule deinit 子仓库路径 ,将子仓库从父仓库的配置中删除。
  3. 使用命令 git rm 子仓库路径 ,删除子仓库所有文件。
  4. 进入 .git/module ,删除相关仓库文件夹。
  5. 提交修改,使用命令 git commit -m “备注"

多人协作

对于非仓库管理者而言,因为没有任何的权限,无法进行 push 操作,首先需要将项目克隆至本地,这样可以获取代码并在本地进行修改,修改完后需要进行 pull request 操作请求仓库管理者进行代码合并。

什么是 fork ?

fork 即在自己的 GitHub 账户中创建一个原始仓库的副本,该操作会使得副本仓库包含原始仓库的所有代码和历史记录,此时能够在副本中独立进行修改和开发,且不影响原始仓库。如果你想要将你的修改合并到原始仓库中,可以向原始仓库提交 “Pull Request(拉取请求)”,请求将你的修改该合并到原始仓库,待仓库管理员同意后即可合并。这是一种多人协作方式,常见于开源项目的贡献和团队合作。

什么是 Pull Request ?

Pull Request 是协作机制,常用于开源项目或团队协作中。此操作是将自己的修改提交到项目的管理者,请求将这些修改合并到原始仓库中。Pull Request 一般会伴随着 fork 同时使用。


Git 命令速查表
Git 命令速查表

此间车厢已使用  次 |   人乘坐过此趟开往世界尽头的列车