1 什么是 Git ?
Git 是一种开源的分布式版本控制系统(Distributed Version Control System),常用于大型项目的版本管理。
-
什么是版本控制系统?
版本控制系统是用于管理文件不同版本的系统。一个项目(Project)可能有很多的版本(Version),也有很多的人在参与。在进行项目时,我们需要不停的更新版本,所以我们需要一个能够自动管理不同版本文件的系统,以方便我们进行回退,合并等操作。
-
什么是分布式?
版本控制系统有三种形式:局部式、集中式、分布式。
局部式:项目不同的版本在每个人自己电脑,可能导致不同人的版本差距较大,难以管理。
集中式:项目不在本地保存,都提交到远程服务器上,以便进行统一地版本管理。但是一旦远程服务器崩坏就会导致所有版本丢失。
分布式:结合了二者的优点,每个人在本地有自己的版本,提交到远程服务器后就有服务器的版本。二者之间版本并行,也可以通过 Git 进行同步。
下载地址 | Git 文档 | 视频教程 |
2 Git 基本操作
第一次进入 Git 要做的事情–个人配置
git config --global user.name "yourname"
git config --global user.email "youremail"
在 Git 中,我们使用 git config
来配置 Git 的配置文件。
创建本地库
要创建本地库,请在一个未被 Git 管理的文件夹内依次输入已下指令。
-
git init
: 第一次创建本地库要做的事情,生成.git
文件夹,使 Git 开始管理该文件夹。 git add <file>
: 使 Git 对文件开始进行管理。- 或者:
git add .
: 使 Git 对文件夹内所有文件开始进行管理。
- 或者:
git commit -m "message"
: 生成本地版本并添加提交信息,不要忘记-m
和引号""
。
以下是一些辅助指令:
git status
: 检测当前文件夹内文件状态,红色代表未进行管理(新增文件或者修改原来的文件),绿色代表已进行管理。git log
: 查看本地版本记录。-
git log --graph
: 图形化有分支的查看本地版本。git log --graph --pretty=format:"%h %s"
: 只显示哈希值和记录。
Git 三个区域
工作区
包含已经被 Git 管理的文件和未被 Git 管理的文件或修改的文件。Git 会自动检测文件是否被管理。
暂存区
用 git add
把工作区中未被 Git 管理的文件或修改的文件到提交暂存区。
版本库
用 git commit
把暂存区文件提交到版本库,生成本地版本。
版本回退
git reset --soft <version>
: 把指定版本从版本库回退/前进到暂存区。
git reset HEAD
: 把暂存文件从暂存区回退到工作区。
git checkout -- <file>
: 把修改过的文件回退到上一个未修改版本的状态。
git reset --hard <version>
: 把指定版本从版本库回退/前进到工作区。
git reflog
: 查看本地操作记录和版本,通常在回退后找不到新版本时候使用。
:bulb: <version>
可以从 git log
中查看,是一串 40 位长度的 16 进制哈希值。当你需要制定某个版本时,你只需要指定版本号的前 4 - 8 位即可,通常版本号的前 4 - 8 位大部分时候不会有冲突。
以下的表格显示了从标题到左侧栏的 Git 操作。
工作区 | 暂存区 | 版本库 | |
---|---|---|---|
工作区 | git checkout |
git reset |
git reset --mix |
暂存区 | git add |
\ | git reset --soft |
版本库 | \ | git commit |
git reset --hard |
3 Git 分支
git 每个版本只保留修改的记录(节省存储空间)。分支的存在使得一个版本可以产生多个新版本,添加新功能。最后再合并这些新功能。每一条分支是一个隔离的版本,分支间互不影响。
git branch
: 查看现存分支。*
表示当前所在分支。
git branch <new branch>
: 从当前分支新建分支。
git checkout <branch>
: 切换到指定分支。
git checkout -b <branch>
: 从当前分支新建并且切换到指定分支。
git merge <branch>
: 把指定分支合并到当前分支。
- 合并可能因为版本不同产生冲突,这个时候文件中会存在各个分支修改的记录,再手动确定所需的修改即可。确定后记得再生成最新版本。
git branch -d <branch>
: 删除指定分支。
4 变基 rebase
该操作使得 Git 记录简洁。
合并版本操作
git rebase -i HEAD~<num>
: 合并包括当前记录后 <num>
个版本。
git rebase -i <version>
: 合并包括当前记录到指定版本之间的所有版本。
注意:合并版本操作不要包含已经推送到远程仓库的版本,会导致无法预料到的麻烦。
合并版本后会产生临时文件,选取版本并加上指令:s
代表压缩。随后再提交。
合并分支操作
git checkout <branch1>
: 切换到指定分支 1。git rebase <branch2>
: 把当前分支 1 合并到指定分支 2,与git merge <branch>
相反。git checkout <branch2>
: 切换到指定分支 2。git merge <branch1>
: 把指定分支 1 合并到当前分支 2。- 如果产生冲突,解决完后用
git rebase --continue
。
- 如果产生冲突,解决完后用
合并拉取操作
git pull
操作无形之间产生了新的分支。为不产生新的分支,先进行 git fetch
操作拉取远端版本,再用 git rebase repository/branch
合并分支。
4 杂项
VSCode + Git 集成开发
VSCode 内集成了 Git,可以在 VSCode 中进行部分简单的 Git 操作。但是我们强烈建议你完全了解每一条 Git 指令的含义,熟悉命令行操作,以便更好地理解 Git 的工作原理。
官方文档 | 视频教程 |
暂存
git stash
: 把工作区的修改暂存起来。
git stash show
: 查看暂存的修改。
git stash pop
: 恢复暂存的修改。
3 个配置文件
Git 配置级别主要有以下 3 类:
- 项目级别 local,对应
git config --local
,配置文件为仓库所在的.git
文件夹中的config
文件,优先级最高。 - 用户级别 global,对应
git config --global
,配置文件为home/
或者C:/user/<name>/
中的.gitconfig
文件,优先级次之。 - 系统级别 system,对应
git config --system
,配置文件为etc/
或者<GIT>/etc/
的gitconfig
文件,优先级最低。
.gitignore
写在 .gitignore 文件中的文件名不会被 Git 管理。
file/
:在该文件夹中的文件均会被忽略。*.xx
:以.xx
结尾的文件会被忽略。!x.xx
:如果以.xx
结尾的文件被忽略了,则!
使得x.xx
被管理。- 甚至 .gitignore 本身也可以被 Git 忽略。