# Git 速查表

# 配置

git config --global "Your Name"
git config --global "Email Address"
git config --global credential.helper store    # 保存密码(每次要输密码/重复输密码)

# 初始化

git init

# 提交修改

git add <file>
git add --all
git add .
git add -u # 提交work directory中所有已track的文件至staging area
git commit 
git commit -m "descriptions"
git commit --amend # 对最近一次的提交做内容修改
git commit --amend --author "user_name <user_email>" #修改最近提交用户名和邮箱

# 查看状态

git status
git status -s #文件状态缩略信息, 常见 A:新增; M:文件变更; ?:未track; D:删除

# 比对

git diff <file>
git diff HEAD -- <file>                 # 查看工作区和版本库里面最新版本的区别
git diff --check <file>                 # 检查是否有空白错误(regex:' \{1,\}$')
git diff --cached <file>                # 查看已add的内容(绿M)
git diff branch1 branch2 --stat         # 查看两个分支差异
git diff branch1 branch2 <file...>      # 查看分支文件具体差异

# 查看历史

git log                     # 展示历史记录 
git log <branch_name>       # 查看某分支的历史记录
git log -n                  # 最近n条的提交历史
git log --oneline           # 对提交历史图形化排列
git log --graph             # 以分支图的形式展示
git log --decorate          # 对提交历史关联相关引用, 如tag, 本地远程分支等
git log --stat              # 历次commit的文件变化
git log --shortstat         # t只显示最后的总文件和行数变化统计
git log --name-status       # 显示新增、修改、删除的文件清单
git log -p                  # 历次commit的内容增删
git log -p -W               # 历次commit的内容增删, 同时显示变更内容的上下文
git log lhs_hash..rhs_hash  # 对比两次commit的变化(增删的主语为lhs, 如git log HEAD~2..HEAD == git log HEAD -3)
# 建议 alais 保存
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen%ai(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit 
git log --since --after     # 显示时间之后的提交
git log --until --before    # 显示时间之前的提交
git --author                # 显示指定作者的提交
git --committer             # 显示指定committer的提交(注:committer不一定是author)
# 查看某作者在某发布版本最近一个月的提交, 常见于线上背锅
git log origin/b3.3/master --author=yx-ren --since="2019-10-01" --before="2019-11-01" 
# 查看某刚离职同事过去一个月的提交, 常见于背锅
git log origin/b3.0/master --author=some_leave --since="1 month ago" 
# 过去一周的提交(写周报的时候可以看看我这一周干了啥)
git log --since=1.weeks     
# 过去一天的提交(下班的时候可以看看我这一天干了啥)
git log --since=1.days      
# 过去1周2天3小时40分50秒之内的提交
git log --since="1 weeks 2 days 3 hours 40 minutes 50 seconds ago" 
git log -S [keyword]        # 仅显示添加或移除了某个关键字的提交(某些场景比单独git log -p | grep [keyword] 好用很多)
git reflog

# 版本回退、前进

git reset --hard HEAD^      # 回退到上1版本
git reset --hard HEAD~5     # 回退到上5个版本
git reset --hard <commit_id># 回退到指定版本

# 撤销修改

git checkout -- <file>      # 撤销修改:误修改工作区文件,未git add/commit
git restore <file>          # 撤销修改:误修改工作区文件,未git add/commit
git reset HEAD <file>       # 撤销git add:误将文件加入暂存区(git add),未git commit
git reset --hard HEAD^      # 撤销git commit:误将文件提交(一旦提交,只能通过版本回退进行撤销)

# 删除与恢复

git rm/add <file>           # 删除版本库中的<file>:删除工作区文件后,继续删除版本库中相应的文件
git checkout -- <file>      # 根据版本库中的<file>恢复工作区<file>
git restore <file>          # 对于 checkout -- <file> 的新写法 (2.23 引入)

清理工作区未 track 也未 ignore 的文件或文件夹(如各种临时.swp, .patch 文件等)

git clean -i         # 交互式清理, 不常用
git clean -n         # 查看清理文件列表(不包括文件夹), 不执行实际清理动作
git clean -n -d      # 查看清理文件列表(包括文件夹), 不执行实际清理动作
git clean -f         # 清理所有未 track 文件
# 清理所有未 track 文件和文件夹, 常用, 但使用前确保新增加的文件或文件夹已 add, 否则新创建的文件或者文件夹也会被强制删除
git clean -df        

# 关联远程仓库

git remote add origin <remote address>   # 在本地工作区目录下按照 GitHub 提示进行关联
git remote remove origin                 # 解除错误关联
git push -u origin master                # 第一次将本地仓库推送至远程仓库(每次在本地提交后进行操作)
git push origin master                   # 以后每次将本地仓库推送至远程仓库(每次在本地提交后进行操作)

# 克隆远程仓库

git clone <remote address>    # git协议速度更快但通常公司内网不允许,https协议速度慢
git clone <remote address> --depth=1 

# 分支管理

git branch <branch name>            # 创建<branch name>分支
git checkout <branch name>          # 切换至<branch name>分支
git switch <branch name>            # 切换至<branch name>分支 (2.23 引入)
git checkout -b <branch name>       # 创建并切换至<branch name>分支
git switch -c <branch name>         # 创建并切换至<branch name>分支
git branch                          # 查看已有分支(* 表示当前分支)
git merge <branch name>             # 合并<branch name>到当前分支(通常在master分支下操作)
git merge --no-commit <branch name> # 合并<branch name>到当前分支,但不提交
git branch -d <branch name>         # 删除分支
git branch -m oldbranchname newname # 重命名分支


# 解决合并冲突

合并时报错“分支发生冲突”,首先 vim 相应文件,修改冲突位置,然后按照 git add/commit 重新提交,最后删除多余分支即可。

git log --graph --pretty=oneline --abbrev-commit
git log --graph

分支管理:合并后删除分支也在 log 中保留分支记录

git merge --no-ff -m "descriptions" <branch name>

# 使用 GitHub

fork --> clone --> add/commit/push --> pull request

# 其他配置

git config --global color.ui true 显示颜色

# 配置.gitignore 文件

/<dir name>/                    忽略文件夹
*.zip                           忽略.zip文件
/<dir name>/<file name>         忽略指定文件

文件 .gitignore 生效后

git add -f <file>               强制添加
git check-ignore -v <file>      查看生效规则

# 配置别名

git config [--global] alias.<alias> '<original command>'    为所有工作区/当前工作区配置别名
.git/config             当前工作区的配置文件
~/.gitconfig            当前用户的配置文件

# 子模块

git submodule foreach git pull    子模块更新

# References

https://www.liaoxuefeng.com/wiki/896043488029600 (opens new window)

https://git-scm.com/book/en/v2 (opens new window)