git
分支
# 删除本地存在远程不存在的分支
git remote prune origin
# 删除已经合并到 master 的分支
git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
# 查看远程分支和本地分支的对应关系
git remote show origin
提交
# 重写最后一次提交信息
git commit --amend -m "new message"
# 修改最新的提交而不更改提交消息
git commit --amend --no-edit
配置
# 获取配置帮助信息
git help config
# 配置全局用户名
git config --global user.name "name"
# 配置全局邮箱
git config --global user.email "email"
# 配置全局颜色,对 git 输出进行美化
git config --global color.ui auto
# 在文本编辑器中编辑全局配置文件
git config --global --edit
# 删除全局配置
git config --global --unset <entry-name>
# 查看本地 repo 配置
git config --list
解决中文乱码
git config --global core.quotepath false
不再将 文件权限变更 作为改动
git config core.fileMode false
设置大小写敏感
# 大小写敏感
git config --get core.ignorecase
# 远程有俩相同目录,通过这种方式清除掉,然后提交记录
git rm -r --cached <dirOrFile>
代理
# 查看代理
git config --global http.proxy
git config --global https.proxy
git config --global socks.proxy
# 设置代理
# 适用于 privoxy 将 socks 协议转为 http 协议的 http 端口
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy http://127.0.0.1:1080
git config --global socks.proxy 127.0.0.1:1080
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
git config --global --unset socks.proxy
# 只对 github.com 设置代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
git config --global https.https://github.com.proxy socks5://127.0.0.1:1080
# 取消 github.com 代理
git config --global --unset http.https://github.com.proxy
git config --global --unset https.https://github.com.proxy
统计查询
# 提交数统计
git log --oneline | wc -l
# 查看文件内容的提交者
git blame <file-name>
# 仓库总大小
git count-objects -vH
# 仓库大小
git ls-files | xargs -r du -hs
# 在 commit log 中查找内容
git log --all --grep='<given-text>'
查看 个人代码量
# username 需要修改为 个人用户名
git log --author="username" --pretty=tformat: --numstat | awk \
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
每人增删行数
git log --format='%aN' | sort -u |\
while read name; do echo -en "$name\t";\
git log --author="$name" --pretty=tformat: --numstat | awk \
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
查看提交者排名
# 取前十个的排名
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 10
submodule 子模块
# 添加包含子模块的仓库
git clone <repo_url> --recursive
# 查看当前仓库中的子模块
git submodule status
# 添加子模块
git submodule add <repo_url> <submodule_path>
# 初始化子模块
git submodule init
# 更新子模块
git submodule update --remote
# 删除子模块
git submodule deinit <path_to_submodule>
git rm <path_to_submodule>
切换到子模块的特定提交
cd <path_to_submodule>
git checkout <commit_hash>
切换到父仓库的特定提交,并更新子模块
git submodule update --remote
git checkout <commit_hash>
获取并切换子模块的最新标签
cd <path_to_submodule>
git fetch --tags
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
子模块递归
# 添加所有已存在的子模块
git submodule foreach --recursive git submodule add <repo_url>
# 更新所有子模块到最新提交
git submodule foreach --recursive git pull origin master
# 检出特定的子模块路径
git submodule foreach --recursive git checkout <branch_name>
# 获取仓库中的所有子模块变化
git submodule foreach --recursive git fetch
# 获取并合并子模块的远程分支
git submodule foreach --recursive git pull origin <branch_name>
# 将子模块还原到父仓库中的初始提交
git submodule foreach --recursive git checkout .
# 获取子模块的更新并忽略本地修改
git submodule foreach --recursive git fetch --all
git submodule foreach --recursive git reset --hard origin/master