跳转至

Git学习笔记

快速入门

Git是一个分布式的版本控制系统,这意味着每一个终端上的仓库都是一个完整的仓库。一方面,分布式的设计提高了工程项目的安全性,即使一台终端上的数据丢失了,只需要重新检出其他终端上的仓库即可恢复全部的数据;另一方面,每一个终端上都需要保存全部的工程历史版本信息,增加了数据存储空间的需求。但是,Git使用的是增量式的存储方式,拥有极其优秀的空间压缩能力,即使管理一个较大的仓库,版本仓库的体积也可以控制在较小的水平上,在很大程度上弥补了分布式存储的不足。

创建Git仓库

在命令行工具(Windows操作系统中推荐使用powershell,也可以使用Git自带的Git bash工具)中将当前目录移动到工程根目录下,并执行下属指令:

git init
即可在当前目录下创建git仓库。此时目录下会出现一个.git文件夹,默认为隐藏的。

创建分支

git checkout -b <branch_name> <commit_id>

<commit_id>处创建一个名为<branch_name>的分支,并检出该分支。

创建commit

git commit -m <comments>

合并

git merge <target_commit>

其中的<target_commit>可以是HASH ID,可以是一个分支的名字,也可以是一个标签。所起的作用是将当前HEAD指向的分支合并到<target_commit>处。方便起见,我们将<target_commit>称为目标分支。合并之后的工作空间中会同时保留当前分支所作的修改,以及目标commit中的修改。

当目标分支是当前分支的直接后继分支时,合并操作会直接将当前分支移动到目标分支处。否则,Git会创建一个新的commit,并同时保留当前分支和目标分支对工作空间的修改。

解决冲突

在执行合并的过程中,如果当前分支和目标分支同时修改了同一个文件的同一行(这里对“同一行”的判断,是Git的内置规则),则会产生冲突,也即Git自己无法判断应当保留哪些代码,需要用户手动解决。

发生冲突的时候,工作空间会进入一个特殊的状态,所有存在冲突的文件会被标记为conflict状态,并且文件的内容会被修改,同时存在两个不同分支对文件的修改情况。用户此时需要对这些文件进行编辑,保留需要的代码,删除不需要的代码。当修改完成之后,执行一次git commit操作,即完成合并操作。

创建标签

使用以下指令可以在当前HEAD指向的位置创建一个带备注的标签。

git tag -a <tag_name> -m <tag_comments>

标签可以用于标记软件开发的一个阶段性的节点,方便进行功能回溯。

进阶用法

Git Submodule

添加子模块

用于将一个已经存在的Git仓库作为另一个Git仓库的子模块。

git submodule add <url> <path>

clone仓库时自动clone子模块

默认情况下,git clone指令只会clone当前仓库,而不会将当前仓库所引用的其他仓库全部clone。如果要全部clone到本地的话,需要使用

git clone --recursive <url>

更新子模块

当子模块仓库更新之后,有两种方法可以更新子模块仓库。

git submodule update --recursive
git submodule update --remote --recursive

第一条指令是将子模块更新到主仓库所记录的版本;第二条指令是拉取子仓库的远程最新版本。