Git 常用命令汇总

92 阅读4分钟

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)

好用的操作汇总

  1. 安装oh-my-zsh
  2. 快捷脚本至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
}


  1. 批量cherry-pick
    # git cherry-pick 多个commit
    git log --reverse --no-merges --first-parent --oneline b9cf27f08a^..fdefcc0906 | awk '{print $1}' | xargs git cherry-pick
  1. 根据内容查找记录
# 查看在src目录下,内容含有test的变更的commit
git log -S test -p -- src

log 常用操作

  1. 显示简略的统计信息
git log --stat
  1. 查看最近两次commit的内容
# -p patch(commit的内容); -2查看最近两次的记录 
git log -p -2
  1. 根据提交内容查找变更
# 查看内容含有test的变更的commit
git log -S test
# 查看内容含有test的变更的commit内容
git log -S test -p
# 查看在src目录下,内容含有test的变更的commit
git log -S test -p -- src
  1. 区间查看
git log --no-merges issue54..origin/master
  1. 查看变更树
# 只看当前分支
git log --oneline --decorate --graph
# 查看所有分支
git log --oneline --decorate --graph --all
  1. git reflog
    # Git 会在后台保存一个引用日志(reflog), 引用日志记录了最近几个月你的 HEAD 和分支引用所指向的历史。
    git reflog

8. 查看文件历史

git log --oneline --branches -- git.tgz
# 已删除的文件
git log --all --full-history  --  git.tgz

撤销操作

  1. 撤销commit信息
git commit --amend
  1. 撤销暂存区内容
# 撤销所有add的内容
git reset HEAD
# 撤销单个文件
git reset HEAD stash.md
  1. 删除本地文件修改
# 强制恢复已被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

不小心加了大文件,如何彻底删除

演示步骤

  1. 下载一个大文件 curl -L www.kernel.org/pub/softwar… > git.tgz
  2. git add git.tgz
  3. git commit -m 'add git tarball' 删除文件
  4. git rm git.tgz
  5. git commit -m 'oops - removed large tarball'
  6. git gc
  7. git count-objects -v 可以看到差不多占用了5M

image.png

彻底删除

  1. git log --oneline --branches -- git.tgz

image.png

  1. 重写所有历史
git filter-branch --index-filter 'git rm --ignore-unmatch --cached git.tgz' --77a6667^..
  1. 移除任何包含指向那些旧提交的指针的文件
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc

如果不知道哪个文件怎么办?

  1. 从pack文件中找到那个最大的文件,查找已删除的大文件
git verify-pack -v .git/objects/pack/pack-*idx \
  | sort -k 3 -n \
  | tail -3

image.png 2. 查看文件名

git rev-list --objects --all | grep 82c99a3

image.png 3. 查看文件历史

git log --oneline --branches -- git.tgz
# 已删除的文件
git log --all --full-history  --  git.tgz

image.png 4. 从起始commit重写所有历史

git filter-branch --index-filter \
  'git rm --ignore-unmatch --cached git.tgz' -- 8dbebae^..

image.png

  1. 移除任何包含指向那些旧提交的指针的文件
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc

6. 查看文件大小

git count-objects -v

image.png 7. 完全移除对象

git prune --expire now

image.png

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提交说明

参考文档