git 是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于 2005 年以 GPL 许可协议发布。最初目的是为了更好地管理 Linux 内核开发而设计
git 是用于 Linux 内核开发的版本控制工具。与 CVS、Subversion(svn)一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git 的速度很快,这对于诸如 Linux 内核这样的大项目来说自然很重要。git 最为出色的是它的合并追踪(merge tracing)能力
git 是用 C 语言开发的,以追求最高的性能
# git 的安装
yum -y install git(CentOS)
apt -y install git(Debian)
brew install git(Mac OS)
https://git-scm.com/download/win(win 下载 Git Bash 的链接)
# git 配置用户名和邮箱
# 设置 git 的 PS1 环境变量
ZSH 设置 git 的 PS1 变量可参考上图
Bash 在 ~/.bash_profile 文件中添加如下内容并执行 source ~/.bash_profile ,其中 /usr/local/etc/bash_completion.d/git-prompt.sh 文件定义了 __git_ps1 等相关函数,并且不同操作系统安装的文件路径和文件名可能不一样,因此要改为对应的文件路径和文件名
source /usr/local/etc/bash_completion.d/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export PS1='\[\033[01;31m\][\[\033[01;32m\]\u\[\033[01;35m\]@\[\033[01;33m\]\h \[\033[01;34m\]\W$(__git_ps1 "(%s)")\[\033[31m\]\[\033[01;31m\]]\[\033[01;36m\]\$\[\033[00m\] '
# git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
# 初始化 git 版本库(设置 git 的 PS1 环境变量后终端就会显示代码分支和 git 仓库的状态信息),git 仓库的状态信息记熟后可避免频繁敲 git status 命令,常见的 git 仓库的状态信息如下:
`#` 表示当前分支是干净的(clean),这意味着当前工作目录中的所有更改都已经提交或暂存,没有未跟踪的文件
`%` 表示当前分支存在未跟踪的文件(untracked files),这意味着在当前工作目录中有一些文件没有添加到 git 仓库中
`*` 表示当前分支存在未提交的更改(changes to be committed),这意味着在当前工作目录中有一些已经暂存但尚未提交的更改
`+` 表示当前分支存在未暂存的更改(changes not staged for commit),这意味着在当前工作目录中有一些已经修改但尚未暂存的更改
`$` 表示当前分支与上游分支存在差异(diverged),这意味着当前分支的提交历史与上游分支的提交历史有所不同
`=` 表示当前分支与上游分支是完全一致的(up to date),这意味着当前分支的提交历史与上游分支的提交历史完全相同
# 工作区 git add -> 暂存区 git commit -> 本地仓库
分支的 commit 比较多时可使用 git log --pretty=oneline 或 --pretty=reference 查看
# git restore file 表示从工作区撤销文件的改动,恢复文件至改动前的状态
# git restore --staged file 表示从暂存区撤销添加的代码,即撤销 git add 操作
# git commit -a file == git add file + git commit file
# git reset --hard HEAD^ 表示代码回滚到上个版本(上次 commit 前),回滚到上两个版本使用 git reset --hard HEAD^^
git reflog 表示查看回滚日志
下图中也可使用 git reset --hard HEAD@{1} 回到 “my first modification”