![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/12e6b5e4c687312247b7b955e7e2374b.png)
前言
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算不上了解,打算从头好好梳理下。
Git官网提供了丰富的教程: https://git-scm.com/book/zh/v2 。官网的教程比较全面,内容比较多,平时使用时当作字典查询来说并不方便。这边文章将对相关内容做个摘录或补充,方便自己查询使用。
使用笔记
软件安装
Windows
Windows上直接在下面地址下载安装包安装就行:
https://git-scm.com/downloads
安装时可以选择勾选在资源管理器集成(windows explorer integration)git bash
或 git gui
,这样就可以在文件夹右击打开相应工具。
Debian/Ubuntu
Debian或Ubuntu中使用 sudo apt install git
命令来安装,安装完成后可以先设置下用户名和邮箱地址:
sudo apt install git-all
基础设置
安装完成后可以先设置下用户名和邮箱地址(可能需要以管理员身份运行):
git config --global user.name "naisu"
git config --global user.email naisu@example.com
上面带有 --global
的是全局设置,也可以在每个项目中不带该参数来对这个项目单独设置。
可以使用 git config --list
来查看当前的配置,也可以使用 git config 配置项
来查看单项的配置情况。
本地使用
在本地目录中可以 使用 git init
来初始化仓库 ,初始化完成后就会生成一个 .git
的隐藏目录。
本地使用来说git分为三个区域:
三区划分只是管理上一个抽象的概念,通常项目文件夹中除 .git
目录外的都属于工作区,剩下两区实际存储都是在 .git
目录中的。
本地使用中对三个区的基础操作如下:
使用 commit
提交到本地仓库中就是开发各个过程的归档了,每次提交时会生成一份快照并对此校验生成一串40位的字符串作为本次校验的编号。除了初次提交外每次提交时还会包含它的父提交的指针。
Git中有一个HEAD指针表示只向当前工作所在的某次提交。如果有需要就可以从仓库中 checkout
检出将工作区恢复成某次提交时的版本。检出操作会移动HEAD指针,然后恢复工作区。
Git中一次次的提交串成一条线,这被称为分支,分支有自己的名称和指向最后一次提交的指针,并且通常的时候HEAD指针其实是指向某条分支的。通常使用 git init
初始化仓库时就会有默认的分支master。
可以使用 git branch <branch-name>
来创建分支,然后使用 git checkout <branch-name>
来切换分支;或者也可以使用 git checkout -b <branch-name>
直接创建并切换到新分支。HEAD在哪里,提交时就只会从那里开始增长。
可以使用 git merge <branch-name>
将指定分支合并到当前分支,合并完成后没用的分支可以使用 git branch -d <branch-name>
进行删除。
远程交互
Git是一个分布式版本控制系统,项目仓库可以托管在一个公共的服务器上,方便团队合作开发或是异地开发。
远程交互使用时各个区的基本交互如下:
相比新项目使用 git init
来初始化仓库而言,很多时候基于已有的项目进行开发的情况可能更常见点,所以 使用 git clone <url>
方式克隆远程仓库到本地 是更加常用的方式。
使用 git clone <url>
通常情况下克隆的只有master分支,不包含远程仓库中其它分支。可以使用 git branch -a
来查看远程分支,然后可以使用命名检出该分支。当然更加常用的是使用 git clone -b <branch-name> <url>
直接克隆某个分支。
忽略文件
项目目录下的 .gitignore
文件用于描述不需要版本控制的文件的匹配规则。下面是个基本规则的示例:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO,即不进行递归
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
对于很多项目该文件也有模板可供参考:
https://github.com/github/gitignore
提交信息格式参考
提交信息最常见的格式是 Angular Git Commit Guidelines 。简单点表示就是下面这样:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
type
本次 commit 的类型;feat
添加新特性;fix
修复 bug;docs
仅仅修改了文档;style
仅仅修改了空格、格式缩进、typo 等等,不改变代码逻辑;refactor
代码重构,没有加新功能或者修复 bug;perf
增加代码进行性能测试;test
增加测试用例;chore
改变构建流程、或者增加依赖库、工具等;
scope
本次 commit 波及的范围;subject
本次 commit 的主旨(标题);body
本次 commit 的详细描述;footer
本次 commit 相关的链接;
更多内容可以参考下面:
https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#commits
实际使用中这个格式只是参考,可以根据实际情况选择。一般来说标题不能少,因为在单行模式查看日志的时候会显示第一行信息。