Git学习笔记: From Principles to Cases
什么是Git?
Git是一个分布式版本控制系统,由Linux内核创始人Linus Torvalds于2005年开发。相较于集中式版本控制系统,Git的分布式特性使得团队成员可以在本地独立地进行代码开发,不再依赖于中央服务器的稳定性和网络连接。这为团队协作带来了巨大的便利,同时也为个人开发者提供了强大的版本管理能力。
在本篇博客中,我们将深入探讨Git的使用方法,带你了解Git如何帮助你高效地管理代码版本。无论你是刚刚接触Git还是想深入了解其高级功能,这篇指南都将为你提供全面的帮助。
接下来,我们将一步步学习如何安装和配置Git,并介绍Git的基本概念,例如仓库、提交、分支等。随后,我们将探讨常用的Git工作流程,涵盖从创建新功能分支到合并代码的全过程。同时,我们还将了解如何处理代码冲突、回滚错误提交以及优化Git操作,使你在日常开发中更加游刃有余。
Git是一个功能强大而灵活的工具,但也可能会让初学者感到有些复杂。但不用担心,本篇博客将以简洁明了的语言,结合实例演示,带你逐步掌握Git的精髓。让我们一起开始,成为Git版本控制的高手吧!
基本流程:Git工作流
当学习Git时,建议按照以下顺序逐步掌握各个命令:
git init:创建一个新的空白仓库或在现有目录中初始化一个Git仓库。
git add:将文件添加到暂存区,准备进行提交。
git commit:将暂存区中的文件提交到本地仓库,创建一个新的版本。
git status:查看当前仓库状态,包括已修改和未跟踪的文件。
git diff:查看未暂存文件与最后一次提交之间的差异。
git log:查看提交历史,包括提交者、日期和提交信息。
git checkout:切换分支或恢复文件,可以用于创建新分支。
git branch:查看、创建和删除分支。
git merge:将一个分支的更改合并到另一个分支。
git remote:连接远程仓库,可以添加、重命名和删除远程仓库。
git pull:从远程仓库拉取并合并更改到本地仓库。
git push:将本地仓库的更改推送到远程仓库。
git clone:克隆远程仓库到本地,用于初始化一个新的本地仓库。
git fetch:从远程仓库拉取代码,但不合并到本地仓库。
git reset:撤销提交,将HEAD指向之前的提交,并可选择保留或丢弃更改。
git revert:撤销指定的提交,并创建一个新的提交来反转更改。
git stash:将当前工作目录的更改保存在临时区域,以便稍后恢复。
git tag:创建、列出和删除标签,用于标记重要的提交或版本。
基本用法:案例
步骤1:初始化仓库和第一个提交
首先,我们创建一个新的空目录,进入该目录,并初始化Git仓库。
1 | mkdir my-web-app |
接下来,在该目录下创建一个简单的HTML文件。
1 | <!-- index.html --> |
现在,将该文件添加到暂存区并提交第一个版本。
1 | git add index.html |
步骤2:创建并切换分支
我们决定在项目中添加一个新的功能,为此,我们需要创建一个新的分支。
1 | git branch feature/add-about-page |
或者可以使用一条命令来创建并切换分支:
1 | git checkout -b feature/add-about-page |
现在,我们在index.html
文件中添加一个“关于”页面。
1 | <!-- index.html --> |
然后添加并提交这些更改。
1 | git add index.html |
步骤3:合并分支
在添加了“关于”页面之后,我们决定将这个功能合并回主分支。
首先,切换回主分支。
1 | git checkout main |
然后将feature/add-about-page
分支合并到main
分支。
1 | git merge feature/add-about-page |
步骤4:部署项目
现在,我们已经完成了项目的开发并将功能合并回主分支。接下来,我们可以将项目部署到服务器或托管平台上。
这里假设我们将代码托管在GitHub上。首先,我们将远程仓库与本地仓库关联。
1 | git remote add origin <GitHub仓库URL> |
然后将代码推送到远程仓库。
1 | git push -u origin main |
至此,我们的简单Git案例就完成了,包括了从初始化仓库到创建和合并分支,并最后将代码推送到远程仓库的过程。
提交:commit 命名规范
遵循一致的命名规范可以使提交历史更加清晰、易于理解和管理。以下是一些建议的Git commit
命名规范:
使用简洁明了的描述:每个
commit
的标题应该简洁明了地描述此次提交所做的更改。尽量避免冗长的标题。使用现在时态:提交标题通常使用现在时来描述一个动作或更改,例如:”Add feature”, “Fix bug”等。
使用动词开头:在标题中使用动词开头,说明这次提交所做的主要操作。常见的动词有:”Add”(新增)、”Update”(更新)、”Fix”(修复)、”Remove”(删除)等。
分离主题和描述:提交标题与提交描述之间使用一个空行进行分隔,提交描述可以进一步补充说明本次提交的详细信息。
参考项目规范:如果你在一个团队或项目中工作,请遵循项目的提交规范。许多团队会有特定的提交规范,例如Angular的规范(Angular Commit Message Guidelines)。
使用标签:可以在标题中使用标签来更好地标识提交类型,如”[Feature]“, “[Bugfix]“, “[Docs]“, “[Refactor]“等。
可以参考以下案例:
- 添加新功能:
Add user authentication feature
- 修复Bug:
Fix login page alignment issue
- 更新文档:
Docs: Update README with installation instructions
- 重构代码:
Refactor: Improve performance of data processing
其中,commit
的类型至关重要,能够将我们的提交很好地分门别类。
- feat(Feature):添加新功能或特性。
- fix(Bugfix):修复Bug或错误。
- docs(Documentation):更新文档,如README、注释等。
- style:对代码样式进行调整,如缩进、空格、格式等,不影响代码逻辑。
- refactor:重构代码,优化代码结构、提高性能,不是Bug修复,也不是添加新功能。
- test:添加或修改测试用例、测试代码。
- chore:对构建过程或辅助工具的修改。
- perf(Performance):改善代码性能的提交。
- build:修改项目构建相关的内容,如更新依赖、修改构建脚本等。
- revert:撤销之前的提交。
- merge:合并分支或解决合并冲突。
- init:初始化项目。
- dependencies:更新或修改项目依赖的外部库或工具。
- security:涉及安全性的提交,如修复安全漏洞。
然而,我们有时仍然会忘记,或者偷懒而没有遵循提交的规范,这会给后期查看代码带来麻烦。而Commitizen是一个用于规范化Git提交消息的工具,旨在帮助团队成员更好地遵循一致的提交规范。它提供了一个交互式的命令行界面,引导用户填写提交信息,并根据预定义的提交规范生成规范化的提交消息。使用方法如下:
- 安装:
-g commitizen
表示全局安装;cz-conventional-changelog
为项目配置Commitizen适配器,最常用的适配器cz-conventional-changelog(约定式提交适配器):1
npm install -g commitizen cz-conventional-changelog
- 在项目根目录下创建一个
.czrc
文件,指定使用的适配器:1
2
3{
"path": "cz-conventional-changelog"
} - 使用
git cz
命令代替git commit
来进行提交,然后按照交互式界面的提示填写提交信息。
命令详解:parameter-level explanation
GIT BRANCH: 分支操作
git branch
是用于管理Git分支的命令,用于查看、创建、删除、重命名和切换分支。以下是git branch
命令的常用参数及其作用:
不带参数:
1
git branch
作用:查看当前仓库中的所有分支,并在当前分支前面添加一个星号
*
标识当前所在的分支。: 1
git branch <branch_name>
作用:创建一个新的分支,名称为
<branch_name>
。-d / —delete
: 1
git branch -d <branch_name>
作用:删除指定的分支,如果分支未合并到其他分支,则会警告;如果确定要删除,可以使用
-D
参数进行强制删除。-m / —move
: 1
git branch -m <old_branch_name> <new_branch_name>
作用:重命名分支,将
<old_branch_name>
改为<new_branch_name>
。-M:
1
git branch -M <name>
作用:执行
git branch -M main
命令后,将会发生以下操作:你的默认分支将变成main
,并且原先的默认分支(如果存在)的更改将被保存在新的main
分支上。- 如果当前仓库的默认分支不是
main
,Git 会将默认分支的名称更改为main
。 如果
main
分支已经存在,则将当前所在的分支(当前分支)重命名为main
,并且该操作是强制性的(因此使用了-M
参数)。-r / —remotes:
1
git branch -r
作用:显示远程分支。
-a / —all:
1
git branch -a
作用:显示所有本地和远程分支。
-v / —verbose:
1
git branch -v
作用:显示每个分支的最后一次提交信息。
-vv:
1
git branch -vv
作用:显示每个分支的最后一次提交信息,并显示跟踪的远程分支。
—no-color:
1
git branch --no-color
作用:在输出中禁用颜色。
GIT ADD: 加入暂存
git add
是用于将工作目录中的文件更改添加到暂存区(Staging Area),准备提交到版本库。git add
命令有多个参数可以控制添加文件的方式。以下是常用的 git add
参数及其作用:
文件名:
1
git add <file>
作用:将指定的文件
<file>
添加到暂存区。目录名:
1
git add <directory>
作用:将指定目录下的所有文件(包括子目录)添加到暂存区。
-A / —all:
1
git add -A
作用:将所有更改(包括新文件、修改和删除)添加到暂存区。相当于
git add .
和git add -u
的合并效果。-u / —update:
1
git add -u
作用:将所有修改和新文件(不包括删除)添加到暂存区。不会添加新的未追踪文件。
-p / —patch:
1
git add -p
作用:交互式地选择要添加到暂存区的文件内容,可以选择部分修改并排除其他部分。
y
:表示将当前修改块添加到暂存区。n
:表示不将当前修改块添加到暂存区。s
:表示将当前修改块分割成更小的块。譬如一个文件中,修改了多次,可以将每一个不同的更改分开来选择添加或修改e
:表示手动编辑当前修改块。q
:表示退出git add -p
命令。a
:表示将当前的显示的修改
添加到暂存区。由于多个文件中的修改是逐个显示的,可以理解为show next one
;
-i / —interactive:
1
git add -i
作用:以交互式的方式添加文件,可以选择添加、忽略或取消添加。
其中, 第一个表格展示了修改的状态,Commands
展示了可输入的命令,可以通过输入序号
或首字母
来调用该命令。
我们修改了test2
,随后unstaged
栏有更新, 此时我们输入命令2
或u
,命令前缀符变为Update,即命令名称时,会出现选项选择要操作的文件对象,输入1
选中一个,随后回车选中这一个文件,文件行前出现星号*
。但此时并不会执行,如果继续输入序号,仍然会继续选中。直到我们直接输入回车。—intent-to-add:
1
git add --intent-to-add
作用:将新创建但尚未添加的文件添加到暂存区。这对于标记即将添加的文件非常有用。
—renormalize:
1
git add --renormalize
作用:将已经跟踪的文件重新标记为未标准化状态,并添加到暂存区。文件在 Git 中被保存为对象,并在存储库中进行压缩,其中某些文件在保存时可能会被转换为特定的格式(例如换行符或空格的处理)。在一些情况下,可能需要更改这些转换规则,以便 Git 在存储库中正确地保存文件。
GIT COMMIT: 提交至本地版本库
git commit
命令用于将暂存区中的文件更改提交到本地版本库,并生成一个新的提交(commit)。
-m \
/ —message=\ :
作用:用于指定提交的消息(commit message),即提交的描述信息。消息应该简洁明了,描述本次提交的内容。1
git commit -m "Add new feature"
-a / —all:
作用:自动将所有已跟踪文件的更改提交到本地版本库,==跳过git add
步骤==。未跟踪的文件不会被提交。1
git commit -a -m "Fix bugs"
-v / —verbose:
作用:在提交消息中显示 diff 信息,即显示每个更改的具体内容。1
git commit -v -m "Update documentation"
—amend:
作用:修改最近一次提交的内容,将新的更改合并到该提交中。这个参数可以在忘记提交某些更改或修改了错误的提交消息时使用。1
git commit --amend -m "Fix typo"
需要注意的是,如果你已经推送(push)了上一次的提交到远程仓库,修改提交消息后,最好不要再次推送,除非你确定这个操作不会影响其他开发者的工作。因为
git commit --amend
实际上是对历史提交进行修改,会改变提交的 SHA-1 值,如果将修改后的提交推送到远程仓库,可能会导致其他开发者的工作出现问题。
GIT STATUS: 查看当前track状态
git status
是用于查看当前工作目录的状态和变更的命令。它会显示当前分支的状态,包括已修改、已暂存、未跟踪等文件的信息。以下是 git status
命令的详细用法和每个参数的介绍:
1 | git status [<options>] [--] [<pathspec>...] |
无参数:
1
git status
作用:显示当前分支的状态,包括已修改、已暂存、未跟踪的文件信息。
-s / —short:
1
git status -s
作用:以更简洁的格式显示状态信息。使用这个参数,状态的输出将被缩短并显示为两列。
-b / —branch:
1
git status -b
作用:显示分支的状态,包括本地分支和与之关联的远程跟踪分支。
-v / —verbose:
1
git status -v
作用:显示详细的状态信息,包括修改的文件内容和行数的变化。
-u[\
] / —untracked-files[\=\ ]: 1
git status -u
作用:显示未跟踪文件的状态。
<mode>
参数可以是no
、normal
或all
,分别表示不显示、显示普通未跟踪文件和显示所有未跟踪文件。—ignored:
1
git status --ignored
作用:显示被忽略的文件的状态。
—no-renames:
1
git status --no-renames
作用:在状态中不显示重命名/复制的文件。
—column[\=\