config 常用操作
# 设置global信息
git config --global user.name fenghe
# 查看git config
git config -l
# 如果你正在使用 HTTPS URL 来推送,Git 服务器会询问用户名与密码。如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”
git config --global credential.helper cache
# Rerere 是“重用已记录的冲突解决方案(reuse recorded resolution)”的意思——它是一种简化冲突解决的方法。 当启用 rerere 时,Git 将会维护一些成功合并之前和之后的镜像,当 Git 发现之前已经修复过类似的冲突时, 便会使用之前的修复方案,而不需要你的干预。
git config --global rerere.enabled [true](url)
好用的操作汇总
- 安装oh-my-zsh
- 快捷脚本至zshrc中
# 快捷commit
function fg() {
# 获取当前分支名
local branch=$(git symbolic-ref --short HEAD)
# 清理分支前缀 (如果有)
branch=${branch#feature/}
branch=${branch#fix/}
branch=${branch#hotfix/}
branch=${branch#release/}
# 获取提交信息
local message="$*"
# 确保调用的是 git commit,而不是 git checkout
git commit -m "feat(${branch}): ${message}"
}
# 确保 gc 是 git commit
alias gc='git commit'
# 快捷pull
function gll() {
local branch=$(git symbolic-ref --short HEAD)
git pull origin $branch
}
# 快捷push
function gpp() {
local branch=$(git symbolic-ref --short HEAD)
git push origin $branch
}
- 批量cherry-pick
# git cherry-pick 多个commit
git log --reverse --no-merges --first-parent --oneline b9cf27f08a^..fdefcc0906 | awk '{print $1}' | xargs git cherry-pick
- 根据内容查找记录
# 查看在src目录下,内容含有test的变更的commit
git log -S test -p -- src
log 常用操作
- 显示简略的统计信息
git log --stat
- 查看最近两次commit的内容
# -p patch(commit的内容); -2查看最近两次的记录
git log -p -2
- 根据提交内容查找变更
# 查看内容含有test的变更的commit
git log -S test
# 查看内容含有test的变更的commit内容
git log -S test -p
# 查看在src目录下,内容含有test的变更的commit
git log -S test -p -- src
- 区间查看
git log --no-merges issue54..origin/master
- 查看变更树
# 只看当前分支
git log --oneline --decorate --graph
# 查看所有分支
git log --oneline --decorate --graph --all
- git reflog
# Git 会在后台保存一个引用日志(reflog), 引用日志记录了最近几个月你的 HEAD 和分支引用所指向的历史。
git reflog
8. 查看文件历史
git log --oneline --branches -- git.tgz
# 已删除的文件
git log --all --full-history -- git.tgz
撤销操作
- 撤销commit信息
git commit --amend
- 撤销暂存区内容
# 撤销所有add的内容
git reset HEAD
# 撤销单个文件
git reset HEAD stash.md
- 删除本地文件修改
# 强制恢复已被track的文件
git reset HEAD --hard
# 强制恢复部分文件
git checkeout HEAD stash.md
# 删除未被track的文件
git clean -fd
git tag
# 查看所有tag
git tag
# 筛选tag
git tag -l "v1.*"
# 添加tag
git tag v1.3
# 添加备注信息
git tag -a v1.4 -m "my version 1.4"
# 查看tag信息
git show v1.4
# 补打tag
git tag -a v1.2 9fceb02
# push tag; git push 不会push tag,需要手动push
# push 单个tag
git push origin v1.4
# push 所有tag
git push origin --tags
# 删除tag
git tag -d
# 删除远程tag
git push origin :refs/tags/v1.4
git push origin --delete <tagname>
git brach
# 查看所有包含未合并工作的分支(未合并到 **当前** 分支的分支)
git branch --no-merged
# 查看所有包含未合并到master的分支
git branch --no-merged main
# 创建分支
git checkout -b newBranch
# 指定分支创建
git checkout -b newBranch main
# 删除分支;如果是为合并分支,则提示无法删除
git branch -d testing
# 强制删除分支
git branch -D testing
# 删除远程分支
git push origin --delete branchName
git push origin :branchName
# 批量删除分支
# git branch -d git branch --list 'lm-scm-saas-web-2024-07*'
git branch --list 'lm-oms-saas-web*' | xargs git branch -D
# 显示更多本地branch信息
git branch -vv
git stash
# 添加贮藏
git stash push
# 查看stask
git stash list
# 只贮藏未add的文件
git stash --keep-index
# stash 忽略文件
git stash --all
# pop stash
git stash pop
# drop stash
git stash pop
# clear 清除所有stash
git stash clear
# apply
git stash apply
git stash apply stash{1}
git merge
git rebase
# rebase master
git rebase master
# 指定分支rebase
git rebase master server
# 取出 `client` 分支,找出它从 `server` 分支分歧之后的补丁, 然后把这些补丁在 `master` 分支上重放一遍,让 `client` 看起来像直接基于 `master` 修改一样
git rebase --onto master server client
git cherry-pick
# git cherry-pick 多个commit
git log --reverse --no-merges --first-parent --oneline b9cf27f08a^..fdefcc0906 | awk '{print $1}' | xargs git cherry-pick
git diff
git diff --cached
### git apply
```sh
git apply /tmp/patch-ruby-client.patch
git show
git show commit
git show master@{yesterday}
git show stash@{1}
git grep
git grep -n test
git cat-file
git cat-file -p commitid
查看文件大小
git count-objects -v
不小心加了大文件,如何彻底删除
演示步骤
- 下载一个大文件 curl -L www.kernel.org/pub/softwar… > git.tgz
- git add git.tgz
- git commit -m 'add git tarball' 删除文件
- git rm git.tgz
- git commit -m 'oops - removed large tarball'
- git gc
- git count-objects -v 可以看到差不多占用了5M
彻底删除
- git log --oneline --branches -- git.tgz
- 重写所有历史
git filter-branch --index-filter 'git rm --ignore-unmatch --cached git.tgz' --77a6667^..
- 移除任何包含指向那些旧提交的指针的文件
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
如果不知道哪个文件怎么办?
- 从pack文件中找到那个最大的文件,查找已删除的大文件
git verify-pack -v .git/objects/pack/pack-*idx \
| sort -k 3 -n \
| tail -3
2. 查看文件名
git rev-list --objects --all | grep 82c99a3
3. 查看文件历史
git log --oneline --branches -- git.tgz
# 已删除的文件
git log --all --full-history -- git.tgz
4. 从起始commit重写所有历史
git filter-branch --index-filter \
'git rm --ignore-unmatch --cached git.tgz' -- 8dbebae^..
- 移除任何包含指向那些旧提交的指针的文件
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
6. 查看文件大小
git count-objects -v
7. 完全移除对象
git prune --expire now
log参数文档
常用选项
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异。 |
--stat | 显示每次提交的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
--relative-date | 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 |
--graph | 在日志旁以 ASCII 图形显示分支与合并历史。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 |
--oneline | --pretty=oneline --abbrev-commit 合用的简写。 |
过滤选项
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异。 |
--stat | 显示每次提交的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
--relative-date | 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 |
--graph | 在日志旁以 ASCII 图形显示分支与合并历史。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 |
--oneline | --pretty=oneline --abbrev-commit 合用的简写。 |
pretty 选项
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |