总结/cheatsheet
操纵repo(第0章)
Lv3
git init --bare <repo>git init [--separate-git-dir <repo>] <worktree>git worktree list|add|prune
操纵对象(第1章)
Lv1
git hash-object -t <type> [--stdin|<file>] -w
Lv2
git mktree --missinggit commit-tree <tree> -m <message> [-p <parent>]*git mktaggit cat-file <type> <SHA1>git ls-tree <SHA1> -- [<path>]git count-objectsgit fsck [--unreachable] [--connectivity-only]git prune- 有一定危险,可能会删掉有用的东西git replace -f <original> <replacement>
Lv3
git tag -a -m <message> <name> <object>- 同时创建新引用在refs/tags/<name>git show <commit>git show <tree>- 如HEAD^{tree}git show <blob>- 如HEAD:index.jsgit replace --edit <original>git replace -l --format=longgit replace --delete <original>git notes add | list | show <object> | remove <object>
操纵引用(第2章)
添加/修改/删除
Lv2
git rev-parse <object>git update-ref --no-deref <ref> [-d|<new>]- 修改<ref>git update-ref <ref> [-d|<new>]- 修改<ref>或者其引用的引用git symbolic-ref --delete <ref>git symbolic-ref <from> <to>
Lv3
git branch -f <branch> <commit-ish>- 只能操纵refs/heads/git branch -D <branch>- 只能操纵refs/heads/git tag -f <tag> <commit-ish>- 只能操纵refs/tags/git tag -d <tag>- 只能操纵refs/tags/
查看历史记录
Lv3
git reflog
单独查看
Lv2
git rev-parse <ref>- 可以接多个但是不如git show-ref好用git symbolic-ref <ref>
批量查看
Lv2
git show-ref [--head] [<ref>...]git for-each-ref [<ref-pattern>...]
Lv3
git branch -avgit branch -avl <branch-pattern>git tag -l <tag-pattern>
给定commit-ish,逆向查找引用
Lv2
git name-rev [--tags] --all|<commit-ish>
Lv3
git describe [--all] [--always] [<commit-ish>]- 留空表示HEADgit describe [--all] [--always] --dirty
操纵索引(第3章)
Lv1
git update-index --add --cacheinfo <mode>,<SHA1>,<path>
不常用Lv2
git update-index --add [--info-only] -- <path>git update-index --force-remove -- <path>git checkout-index -fu [--prefix=<pf>] -agit checkout-index -fu [--prefix=<pf>] -- <path>
常用Lv2
git update-index --chmod +x -- <path>git ls-files -sgit ls-files -s -- <path>git read-tree [--prefix=<pf>] <tree-ish>git write-tree [--prefix=<pf>]
Lv3
git add -f -- <path>git rm --cached -- <path>git mvgit restore [--source <tree-ish>] [--staged] [--worktree] -- <path>git checkout -f -- <path>git commitgit stash [pop]git clean -nd [-x|-X] [-- <path>](把-n换成-f就会真的删除,非常危险)git add -pgit restore -p
操纵HEAD(第4章)
Lv3
git switch --detach <commit-ish>git switch -c <branch> <commit-ish>git switch <ref>git reset --soft [<commit-ish>] --git reset [--mixed] [<commit-ish>] --git reset --hard [<commit-ish>] --
Lv3(旧语法)
git checkout -- <path>- 根据index更新worktree,见第3章请使用新语法:
git restore [--worktree] -- <path>
git checkout [--detach] [<commit-ish>] --- 修改HEAD、index、worktree,见上面(留空<tree-ish>表示HEAD)请使用新语法:
git switch <commit-ish>
git checkout <commit-ish> -- <path>- 根据tree更新index和worktree,见第3章请使用新语法:
git restore --source <commit-ish> --stage --worktree -- <path>
git reset [<tree-ish>] -- <path>- 根据<commit-ish>修改index,见第3章请使用新语法:
git restore [--source <commit-ish>] --stage -- <path>
git reset --soft [<commit-ish>]- 相当于依次执行以下命令:(留空<tree-ish>表示HEAD)git update-ref HEAD <commit-ish>- 修改HEAD或者HEAD指向的引用
git reset [--mixed] [<commit-ish>]- 相当于依次执行以下命令:(留空<tree-ish>表示HEAD)git update-ref HEAD <commit-ish>- 修改HEAD或者HEAD指向的引用git restore --staged -- :/- 根据HEAD修改index,见第3章
git reset --hard [<commit-ish>]- 相当于依次执行以下命令:(留空<tree-ish>表示HEAD)git update-ref HEAD <commit-ish>- 修改HEAD或者HEAD指向的引用git restore --staged --worktree -- :/- 根据HEAD修改index,见第3章
操纵远程(第5章)
Lv2
git ls-remote <url>
Lv3
git remote add <remote> [--mirror=push|fetch] <url>git push [-u] <remote> <local-ref>:<remote-ref>git fetch <remote> <remote-ref>:<local-ref>git pull --ff-onlygit clone --mirror|--bare <url> <repo>git clone [--no-checkout] [--branch <ref>] [--separate-git-dir <repo>] <url> <worktree>
Lv3(不推荐使用的邪恶命令)
git pull [--rebase]
操纵merge(第6章)
查看和处理修改
Lv2
git diff-tree [-p] <tree-ish> <tree-ish> -- <path>git diff-tree [-p] <commit-ish> -- <path>git diff-index [-p] [--cached] <tree-ish> -- <path>git diff-files [-p] <path>git apply [--cached] <patch> -- <path>
Lv3
git diff <tree-ish> <tree-ish> -- <path>git show <commit-ish> -- <path>git diff [--cached] <tree-ish> -- <path>git diff -- <path>git status
Lv4
git st
合并修改
Lv2
git merge-file [--ours|--theirs|--union] C A Bgit merge-tree C A Bgit read-tree -m H Mgit read-tree -m A C Bgit merge-index -o git-merge-one-file -a
Lv3
git merge -s resolve [--no-ff] [--no-commit] Bgit merge -s octopus [--no-ff] [--no-commit] B*git merge -s ours [--no-ff] [--no-commit] B*git merge -s recursive [--no-ff] [--no-commit] Bgit merge -s subtree [--no-ff] [--no-commit] B
Lv4
git mfgit mnfgit mnfnc
Lv5
git-mnfss
操纵commit(第7章)
Lv2
git cherry-pick --keep-redundant-commits <commit-ish>...
Lv3
git revert <commit-ish>...git rebase --keep-empty [-i] [--onto <newbase>] [(<upstream>|--root) [<branch>]][--no-ff][--rebase-merges[=[no-]rebase-cousins]]
检索与查看历史(第8章)
列出commit
Lv2
git rev-list [-v] <commit-ish>
Lv3
git log/git whatchangedgit show-branch- 另一种方式查看整个repo的历史
Lv4
git lg- HEAD的简要历史git la- 整个repo的简要历史git ls- HEAD的文件修改摘要git lf- HEAD的文件修改详情
检查文件的历史
Lv3
git blame -n -- <path>- 对每一行找出最近一次修改它的commitgit annotate -- <path>- 同上,换一种输出格式
Lv4
git lf [--follow] -- <path>- 列出相关commit
寻找文件
Lv4
git findgit finds
搜索关键词
Lv3
git grep [-i] [-w] [-P] <regex> -- <path>- 在worktree中搜索git grep --cached [-i] [-w] [-P] <regex> -- <path>- 在index中搜索git grep [-i] [-w] [-P] <regex> <tree-ish> -- <path>- 在tree中搜索git log -G <regex>- 在HEAD的历史中搜索git grep <regex> $(git rev-list --all)- 在整个repo中搜索
Lv4
git greps [-i] [-w] [-P] <regex>
邪恶的submodule(第9章)
一次性添加submodule的五个部分:
git submodule add [-b <branch>] [--name <name>] -- <url> <path>
分别修改submodule的五个部分:
.gitmodulesLv0:
vim .gitmodulesLv2:
git config --file=.gitmodules submodule.<name>.<key> <value>
$GIT_DIR/configLv0:
vim .git/configLv2:
git config submodule.<name>.<key> <value>
index
Lv2:
git update-index [--add|--force-remove] --cacheinfo 160000,<sha1>,<path>
repo (
$GIT_DIR/modules/<name>)git -C <path> ...
worktree (
$GIT_WORK_TREE/<path>)git -C <path> ...
用静态更新动态:
git submodule init -- <path>用
.gitmodules来更新.git/config
git submodule update --init [--recursive] --checkout -- <path>用
.gitmodules和index来创建repo和worktree
git submodule sync -- <path>用
.gitmodules来更新.git/config和repo的URL
git gets -- <path>快速下载指定commit
用静态和动态更新动态:
git submodule update [--recursive] [--checkout|--rebase|--merge] -- <path>用
.git/config和index来更新repo和worktree,共5种选项
用动态更新静态:
git update-index -- <path>- 用repo来更新indexgit add <path>- 用repo来更新indexgit submodule absorbgitdirs -- <path>有repo、worktree、
.gitmodules和index之后,用该命令创建.git/config并将repo移动到正确位置
删除:
git submodule deinit -f -- <path>删除
.git/config和worktree
其他部分需要逐一删除
批处理与自动化(第10章)
git for-each-ref- 对每个引用进行处理(比git show-ref更灵活)git filter-branch- 对每个commit进行处理(比git rebase更灵活)git submodule foreach --recursive- 对每个submodule进行处理git bisect- 二分查找法定位bug位于哪个commitvim .git/hooks/pre-commit- 在commit前做检查vim .git/hooks/commit-msg- 自动撰写commit messagevim .git/hooks/pre-push- 在push前做检查vim .git/hooks/...git config --global core.autocrlf true|false|inputgit stripspacegit config --global core.whitespace ...
GPG签名(第13章)
创建签名
Lv2
git commit-tree -S[<keyid>] ...
Lv3
git commit -S[<keyid>] ...git tag -a -s [-u <keyid>]
验证签名
Lv2
git verify-commit <commit-ish>git verify-tag <tag-ish>
Lv3
git show -s --show-signature <commit-ish>git tag --verify <tag-ish>git log --show-signature ...
数据的导入和导出(第14章)
常用Lv3
git archive [--prefix=<prefix>] [-o <output>] <tree-ish> -- <path>...
不常用
git bundle create/git bundle unbundle- 参见第5章git fast-export/git fast-importgit format-patch/git am/git request-pull/git send-email/git imap-send
最后更新于
这有帮助吗?