1. 什么是 Git

Git 最初由 Linux 系统内核的作者 Linus Torvalds 在 2005 年开始开发,是世界上使用最为广泛的现代化版本控制系统。

1.1. Git 工作流程

Git 是分布式版本管理(DVCS)的一种。CVS 和 Subversion(SVN)等集中式的版本管理软件将完整的版本历史存放在同一个地方。而在 Git 中,每个开发者的机器上都有一份本地仓库,每个人可以将代码提交至本地仓库,然后再推送至远程仓库

  1. 在公司服务器创建一个远程仓库
  2. 其他人把远程仓库克隆到本地,拥有了各自的本地仓库,开始并行开发
  3. 每个人独立负责一个功能,可以把每一个小改动提交到本地仓库
  4. 功能开发完毕,将和这个功能相关的所有提交从本地推送到远程仓库
  5. 当有人把新的提交推送到远程仓库的时候,其他人就可以选择把这些提交也同步合并到自己的本地仓库上

1.2. Git 三区四状态

三个区域

  1. 提交历史 (History):工作目录下有一个隐藏目录 .git ,所有本地仓库 Local Repository和远程仓库 Remote Repository 的版本信息都存在这里。
  2. 暂存区域 (Stage/Index):存放在 .git 目录下的 index 文件中,所以我们把暂存区域也叫作索引。
  3. 工作目录 (Working Directory):就是代码所在的目录。

四种状态

  1. 未修改 Origin
  2. 已修改 Modified & 未追踪 Untracked
  3. 已暂存 Staged
  4. 已提交 Committed

三区四状态之间切换

  1. git add files 把工作目录文件放入暂存区
  2. git commit 给暂存区生成快照并加入 commit 历史。
  3. git reset -- files 从暂存区撤销最后一次 git add files,你也可以用 git reset 撤销所有暂存区文件
  4. git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。

2. Git 安装与配置

2.1. 安装 Git

对于 Windows 用户,安装后如果希望在全局的 cmd 中使用 Git,需要把 git.exe 加入 PATH 环境变量中,或在 Git Bash 中使用 Git。

2.2. 配置 Git 提交者信息

参考:Git 和 GitHub 使用入门

git config --global user.name <name> # 定义全局作者姓名 git config --global user.email <email> # 定义全局作者邮箱 git config --system core.editor <editor> # 定义默认编辑器 git config --global alias.<alias-name> <git-command> # 自定义Git命令别名

2.3. 配置 Git 换行符规则

2.3.1. 换行符全局设置

AutoCRLF

git config --global core.autocrlf input

SafeCRLF

git config --global core.safecrlf warn

2.3.2. 按仓库设置换行符

vim .gitattributes

# Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.c text *.h text # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary

扩展:在更改行结束符后刷新仓库

2.4. 配置 Git 忽略文件

如果在仓库中创建名为 .gitignore 的文件,Git 将使用它来确定在提交之前要忽略哪些文件和目录。

.gitignore 文件应提交到仓库,以与克隆仓库的任何其他用户共享忽略规则。

# 创建本地 .gitignore touch .gitignore # 创建全局 .gitignore git config --global core.excludesfile ~/.gitignore_global

.gitignore 文件:

2.5. 编辑 Git 配置文件

git config --global --edit

优先级:仓库>用户>系统

[core] autocrlf = input safecrlf = warn excludesfile = .gitignore editor = vim [user] name = WangYan email = no-reply@wangyan.org [merge] tool = vimdiff [alias] st = status co = checkout br = branch up = rebase ci = commit

2.6. 配置编辑器默认格式

插件 EditorConfig for Visual Studio Code

vim .editorconfig

# EditorConfig is awesome: https://EditorConfig.org root = true [*] end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true [*.ts] indent_style = tab [{*.json,*.md,*.yml}] indent_style = space indent_size = 2

3. 创建代码仓库

3.1. 通过 SSH 克隆远程代码仓库

3.1.1. 生成 SSH 密钥

使用 SSH 方式,必须先配置好 SSH 密钥,然后将公钥粘贴到 SSH keys 页面

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ssh-add ~/.ssh/id_rsa # 选做,将密钥添加到 ssh-agent 的高速缓存中:

3.1.2. 通过 SSH 检出仓库

git clone username@host:/path/to/repository

提示:可以通过添加 --bare 或者 --mirror 参数检出 裸仓库

3.1.3. 如何理解裸仓库?

扩展阅读:Git 本地仓库和裸仓库

3.2. 通过 https 克隆远程代码仓库

git clone https:/path/to/repository.git

提示:通过 HTTPS 检出的仓库,今后提交代码需要帐号密码登录。

3.3. 初始化本地代码仓库

git init #在当前目录创建 git init <directory> #在指定目录创建 git init --bare <directory.git> #创建裸仓库

3.4. 添加远程仓库

以 github 为为例 推送提交到远程仓库

git remote add origin git@github.com:username/repository.git # 推送提交到远程仓库 # git push <REMOTENAME> <BRANCHNAME> # -u 将 origin master 设置为 upstream # -u 等同于 git remote add upstream <THEIR_REMOTE_URL> git push -u origin master

4. 使用常见 Git 命令

4.1. git add 添加

git add 命令将工作目录中的变化添加到暂存区域。

# 跟踪所有文件并且添加到暂存区域 # 也就是将暂存区域与工作目录同步,包括工作目录中新增、修改和以及删除的文件 # 如果要忽略已删除的文件,请加上 --no-all git add . # 所有已跟踪的文件(tracked) 文件中被修改过或已删除的文件添加到暂存区域。 # 请注意,它不会处理未跟踪(untracted)的文件。 git add -u . # 在 git 2.0 中,等同于 git add . git add -A

4.2. git status 查看状态

git status 命令查看暂存区域与当前工作目录的状态。

git status -s # 简短的结果输出 git status -b # 在简洁模式中同时显示分支信息

简洁模式说明:

4.3. git diff 比较差异

git diff 命令用于比较工作目录中当前文件和暂存区域快照之间的差异

# 显示工作目录(尚未暂存文件)和已暂存(git add)文件之间的不同 git diff # 显示工作目录(包括已暂存和尚未暂存文件)和上一次提交(git commit)之间的不同 git diff HEAD # 显示已暂存文件与和上一次提交(git commit)之间的不同 git diff --cached # 显示摘要而非整个 diff git diff --stat

4.4. git commit 提交

git commit -m "<message>" # 将暂存区域提交到本地代码仓库

提交时,git用暂存区文件创建一个新的提交 f0cec, 同时,当前分支用 HEAD 指向这个新提交。

上图中,当前分支是 master。 在 commit 之前,master 指向 ed489,提交后,master 指向新的节点 f0cec 并以 ed489 作为父节点。