如果你觉得 Git 很迷惑人, 那么这份小抄正是为你准备的!
请注意我有意跳过了 Git commit,Git pull/push 之类的基本命令, 这份小抄的主题是 Git 的一些「高级」用法.
导航 -- 跳到之前的分支
Git checkout -
查看历史
- # 每个提交在一行内显示
- Git log --oneline
- # 在所有提交日志中搜索包含「homepage」的提交
- Git log --all --grep='homepage'
- # 获取某人的提交日志
- Git log --author="Maxence"
哎呀: 之前重置了一个不想保留的提交, 但是现在又想要回滚?
# 获取所有操作历史 Git reflog # 重置到相应提交 Git reset HEAD@{ 4 } # ...... 或者......
Git reset --hard <提交的哈希值>
哎哟: 我把本地仓库搞得一团糟, 应该怎么清理?
Git fetch origin Git checkout master Git reset --hard origin/master
查看我的分支和 master 的不同
Git diff master..my-branch
定制提交
# 编辑上次提交 Git commit --amend -m "更好的提交日志" # 在上次提交中附加一些内容, 保持提交日志不变 Git add . && Git commit --amend --no-edit # 空提交 -- 可以用来重新触发 CI 构建 Git commit --allow-empty -m "chore: re-trigger build"
squash 提交
比方说我想要 rebase 最近 3 个提交:
- Git rebase -i HEAD~3
- 保留第一行的 pick, 剩余提交替换为 squash 或 s
- 清理提交日志并保存(vi 编辑器中键入 :wq 即可保存)
pick 64d26a1 feat: add index.JS
s 45f0259 fix: update index.JS
s 8b15b0a fix: typo in index.JS
修正
比方说想在提交 fed14a4c 加上一些内容.
Git 提交分支
Git add . Git commit --fixup HEAD~1 # 或者也可以用提交的哈希值 (fed14a4c) 替换 HEAD~1 Git rebase -i HEAD~3 --autosquash # 保存并退出文件(VI 中输入 `:wq`)
rebase 的时候在每个提交上执行命令
如果特性很多, 一个分支里可能有多个提交. 如果测试失败了, 你希望能找到导致测试失败的提交. 这时候你可以使用 rebase --exec 命令在每个提交上执行命令.
# 在最近 3 个提交上运行 `npm test` 命令 Git rebase HEAD~3 --exec "npm test"
暂存
暂存不止是 Git stash 和 Git stash pop ;)
# 保存所有正在追踪的文件 Git stash save "日志信息" # 列出所有的暂存项 Git stash list # 获取并删除暂存项 Git stash apply stash@{ 1 } Git stash drop stash@{ 1 } # ...... 或使用一条命令...... Git stash pop stash@{ 1 }
清理
# 移除远程仓库上不存在的分支 Git fetch -p # 移除所有包含 `greenkeeper` 的分支 Git fetch -p && Git branch --remote | fgrep greenkeeper | sed 's/^.\{9\}//' | xargs Git push origin --delete GitHub = Git + Hub
我把 Hub 当成 Git 的一个封装来用. 你如果也想这么做, 可以设置一个别名: alias Git='hub'
# 打开浏览器访问仓库 url(仅限 GitHub 仓库)Git browse
额外福利: 我最喜爱的 Git 别名
alias g='git' alias glog='git log --oneline --decorate --graph' alias gst='git status' alias gp='git push' alias ga='git add'alias gc='git commit -v' # alias yolo='git push --force' # 每周站会汇报工作时用 Git-standup() { AUTHOR=${AUTHOR:="`git config user.name`"} since=yesterday if [[ $(date +%u) == 1 ]] ; then since="2 days ago" fi Git log --all --since "$since" --oneline --author="$AUTHOR" }
来源: http://www.tuicool.com/articles/NniQF3m