Git 是一个免费的开源分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。这里的版本控制简单的说就是 Git 能保存你每一次的修改记录,如果代码出现问题时使用 Git 可以很方便的还原到修改之前的某个版本。对于多人协同开发来说使用 Git 可以很方便的合并代码,无需手动拷贝合并。

Git & Github

Git 是一个版本控制系统,Git 主要是负责本地的版本控制。Github 是一个集成了 Git 的代码托管平台,Github 可以把 Git 的版本记录存储到云端,方便多人协同开发,Git 负责本地管理,Github 负责云端存储。除了 Github 外国内也有一个 码云 也是支持 Git 的代码托管平台,除了使用第三方托管平台外你也可以自建代码仓库,这里我使用的代码托管平台是 Github

下载 & 安装

Git 官网: https://git-scm.com/ ,根据操作系统下载对应版本,Windows 安装方式和一般的软件安装方式差不多,Linux 如果是 Ubuntu 或 Debian 可以使用 apt 安装,输入 :

apt-get install git

如果是 CentOS 或 Fedora 可以手动下载 rpm 包安装,关于 rpm 包管理的教程可以看: Linux rpm 包管理 ,或者也可以下载源码手动编译安装,关于 Linux 编译安装可以看: Linux 源码编译安装 ,如果是其他发行版 Linux 可以直接下载源码编译安装。

在使用之前可以先设置一下身份信息,对于多人开发来说设置身份信息可以很方便的区分开发者,打开命令行,输入:

git config --global user.name "YourName"
git config --global user.email "youemail@email.com"

其中的 YourName 就是你的名字,youemail@email.com 就是邮箱地址,--global 就是全局设置,使用全局设置后再这台电脑上提交的代码都会使用全局设置的身份信息。

创建版本库

Git 的版本库相当于是一个存储文件版本的仓库,和版本库同一目录的文件包括子目录都可以被版本库管理,一般创建版本库的位置都是项目的根目录。在创建版本库之前可以先进入你要创建版本库的目录,创建版本库的命令是:

git init

Git 会在所在目录生成一个 .git 目录,和版本库相关的文件就存储在 .git 目录,.git 目录默认是隐藏的,只有开启显示隐藏文件才能看到。

除了在本地创建版本库外也可以直接创建远程仓库,然后把远程仓库克隆到本地,克隆远程仓库的命令是:

git clone url

其中的 url 就是仓库地址,以 Github 为例 要查看仓库地址可以点击 Clone or download ,如下:

Github查看仓库地址

点击复制按钮或手动复制地址,然后输入克隆的命令,如下:

git clone https://github.com/996icu/996.ICU.git

版本控制

创建完版本库后 Git 还不能跟踪文件变化,需要先把文件添加到 Git 的版本库,文件范围只能是和版本库同一目录或子目录下的文件,例如我创建的版本库在 E:\test 目录,我只能添加 E:\test 目录内的文件。添加文件的命令是:

git add FileName

其中的 FileName 就是要添加的文件名,如果要添加所有文件可以使用:

git add *

git add 只是把文件添加到暂存区,要把文件提交到版本库还需要:

git commit -m "第一次提交"

其中的 第一次提交 就是提交说明,提交后会输出文件的状态,如下:

[master 7ea6e46] 第一次提交
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

其中的 master 就是提交的分支,关于 分支 后面会有说明,7ea6e46 相当于是一个版本 ID,1 file changed, 0 insertions(+), 0 deletions(-) 就是文件的变化情况,hello.txt 就是我提交的文件名。

我这里在修改一下之前提交的 hello.txt 文件,然后查看状态,查看状态的命令是:

git status

下面是输出内容:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   hello.txt

no changes added to commit (use "git add" and/or "git commit -a")

上面提示 hello.txt 已更改,但还未提交更改。如果要查看更改了哪些内容可以使用:

git diff

输出内容如下:

diff --git a/hello.txt b/hello.txt
index e69de29..c4c2225 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Are you OK
\ No newline at end of file

从信息中可以看到我在 hello.txt 中加入了一行 "Are you OK" 。

如果要查看提交的历史记录可以使用:

git log

提交记录如下:

commit b0cc076ae344e23d61ea39986d507fc93802cffa (HEAD -> master)
Author: Mark <email@changbin.me>
Date:   Sat May 18 17:16:05 2019 +0800

    加入了 Are you OK

commit 7ea6e4650bdf07e2e44924fbb8959c5e939c38fb
Author: Mark <email@changbin.me>
Date:   Sat May 18 16:28:45 2019 +0800

    第一次提交

可以看到我这里提交了两次, commit 后面的一串字符就是版本 ID,Author 后面是 姓名 和 邮箱,Date 后面就是提交日期,下面的中文内容就是提交时的说明。

如果你想回退到某个历史版本可以使用:

git reset --hard commit_id

其中的 commit_id 就是提交日志中的 commit ,如果我想回退到第一次提交的版本就使用:

git reset --hard 7ea6e4650bdf07e2e44924fbb8959c5e939c38fb

commit_id 不一定要写全,只写前几位也可以,执行后工作目录中的文件会回退到第一次提交时的状态,这时候在使用: git log 查看提交日志:

commit 7ea6e4650bdf07e2e44924fbb8959c5e939c38fb (HEAD -> master)
Author: Mark <email@changbin.me>
Date:   Sat May 18 16:28:45 2019 +0800

    第一次提交

可以看到只剩下了第一次提交的日志,虽然后面提交的日志不显示,但版本库中并没有删除后面提交的内容,如果你又想回到最新版本还是可以使用: git reset --hard commit_id ,如果你已经关闭了命令行,也就是无法找到新版本的 commit_id 可以使用:

git reflog

查看执行命令的日志,输出如下:

7ea6e46 (HEAD -> master) HEAD@{0}: reset: moving to 7ea6e4650bdf07e2e44924fbb8959c5e939c38fb
b0cc076 HEAD@{1}: reset: moving to b0cc076ae344e23d61ea39986d507fc93802cffa
b0cc076 HEAD@{3}: commit: 加入了 Are you OK
7ea6e46 (HEAD -> master) HEAD@{4}: commit: 第一次提交

如果我要恢复到 加入了 Are you OK 这个版本 commit_id 就是: b0cc076 ,使用:

git reset --hard b0cc076

此时在查看提交日志:

commit b0cc076ae344e23d61ea39986d507fc93802cffa (HEAD -> master)
Author: Mark <email@changbin.me>
Date:   Sat May 18 17:16:05 2019 +0800

    加入了 Are you OK

commit 7ea6e4650bdf07e2e44924fbb8959c5e939c38fb
Author: Mark <email@changbin.me>
Date:   Sat May 18 16:28:45 2019 +0800

    第一次提交

可以看到又恢复到了最新版本。

如果你工作目录中的文件已经保存,但还未添加到暂存区,你想放弃修改可以使用:

git checkout -- FileName

文件会还原到上次提交后的状态,也就是你修改之前的状态,其中的 FileName 就是文件名。

如果你的文件已经添加到了暂存区但是还未提交到分支,也就是已经执行 git add 但还未执行 git commit -m "xxx" ,你想放弃暂存区的文件可以使用:

git reset HEAD FileNamet

文件会从暂存区移除,但不会影响到工作目录中的文件,相当于是工作目录中的文件已经保存但还未提交的状态,其中的 FileName 就是要移除暂存区的文件名。

如果你要删除已添加到版本库的文件可以使用:

rm FileName

其中的 FileName 就是文件名,然后在执行:

git commit -m "删除了hello.txt"

下面是输出内容:

[master e95d522] 删除了hello.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 hello.txt

分支管理

分支相当于是把仓库分成几个区域,无论某个区域内的内容发生什么变化都不会影响到其他区域的内容。在修复 BUG 或开发新功能的时候为了不影响到原有的代码可以创建一个新的分支,在新的分支里开发,开发完成后再和主分支合并。默认情况下在建立版本库的时候会有一个 master 分支,也就是主分支,

创建并切换分支:

git checkout -b branch

其中的 branch 就是分支名称,创建后会切换到创建的分支,下面创建一个 test 分支:

git checkout -b test

如果要查看分支可以使用:

git branch

输出内容如下:

  master
* test

我这里有两个分支,分别是 mastertest ,前面有 * 的就是当前所在分支。

现在我在 test 分支,使用 git commit -m "xxx" 也会提交到 test 分支,不会影响到 master 分支的内容。如果要切换回 master 分支 或者是切换其他分支可以使用:

git checkout master

其中的 master 就是分支名。

如果要对比两个分支的差异可以用:

git diff master test

其中的 mastertest 就是分支名称,输出内容如下:

diff --git a/hello.txt b/hello.txt
index 01e6470..03cc5b6 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,3 @@
 Are you ok
-Hello
\ No newline at end of file
+Hello
+Thank you
\ No newline at end of file

可以看到两个分支的 hello.txt 的第2行的内容不一样。

如果要合并分支的内容可以用:

git merge branch

其中的 branch 就是分支名称,例如我这里要把 test 分支的内容合并到 master 分支 我就需要先切换到 master 分支,然后输入命令:

git merge test

合并的时候如果两个分支的同一个文件的同一行的内容不一样可能会导致合并冲突,我上面演示的两个分支的 hello.txt 的第2行就不一样,也会导致合并冲突,输出内容如下:

CONFLICT (add/add): Merge conflict in hello.txt
Auto-merging hello.txt
Automatic merge failed; fix conflicts and then commit the result.

处理方式就是对比两个分支的内容,冲突的地方会用特殊字符标出,如下:

-<<<<<<< HEAD
 Hello
-=======

手动修改文件,然后在执行 add filegit commit -m "xxx" 提交。

如果要删除分支可以使用:

git branch -d branchName

其中的 branchName 就是分支名称,删除分支不会影响到已合并的分支。

远程仓库

在把分支推送到远程库之前还需要先连接到远程库,如果你是从远程库克隆到本地开发可以无需连接远程库,如果你是在本地建立的仓库在第一次推送之前需要先连接到远程存储库,如果还没有远程存储库可以先创建一个,连接远程库的命令是:

git remote add origin url

其中的 url 就是远程库的地址,如果要查看远程库的地址以 Github 为例可以点击 Clone or download 就能看到地址,如果你的 Github 存储库没有任何文件的话在存储库首页就能看到地址。

如果要把本地分支推送到远程存储库可以使用:

git push origin master

其中的 master 就是分支名称。

如果远程库和本地库都有同一个文件在推送的时候远程库的文件会被替换,如果本地库内的文件被删除推送的时候远程库内的文件也会被删除。

以上就是 Git 的简易使用指南,一些不常用的功能就没有写,如果要查看更详细的说明可以访问: 官方文档 。除了使用原版的 Git 命令行工具外 Git 也有带图形界面的可视化工具,下面是一些常用的 Git 可视化工具:

注意!Github Desktop 是 Github 的官方桌面可视化工具,对于其他的代码托管平台或自建远程库支持的可能不是太好。如果你不喜欢用命令行工具的话用可视化工具也是一个比较好的选择。