说说 git 那些不常用,但是很实用的功能。

精确操作

  • git add -p 会逐个显示文件中的每组改动,并询问是否要加入 index
    • y: 放入 index
    • n: 不要放入 index
    • e: 手动编辑需要加入 index 的部分,常用来拆分一个改动块

使用这个命令可以在命令行中操作将一个文件的部分修改提交到暂存区。在想拆分 commit 的时候非常方便。

修改作者

修改提交时间

git 可以通过环境变量更改提交时间哦

  • export GIT_COMMITTER_DATE=”Jan 11 17:11:18 2018 +0800”
  • export GIT_AUTHOR_DATE=”Jan 11 17:11:18 2018 +0800”

或者更直接一点

  • git commit –amend –date=`date -R`

fork 的项目与原作者同步

看到很多人 fork 项目之后同步时都是手动打 merge 同步的,会平白无故多很多 merge 节点出来,正确的做法应该是增加一个 upstream 远端,在本地同步合并后推到自己的仓库。

1
2
3
4
5
git remote add upstream [email protected]:AUTHOR/PROJ.git
git fetch upstream
git rebase FETCH_HEAD
git merge --ff-only upstream/master
git push origin master

二分 debug

这个命令不是很常用,但是知道有这个命令的存在能在 debug 时节省很多时间

给定两个提交记录 git 辅助你二分查找 bug 的引入时间,同时支持运行脚本

1
2
3
4
5
6
git bisect start
git bisect bad
git bisect good v1.0.0
git bisect reset
git bisect start bad_commit good_commit
git bisect run test-error.sh

git blame

配合上一个命令,找到 bug 之后可以按行定位 bug 的生产者

同步其他分支

在远端 PR 被合并之后往往需要切换到主分支然后重现拉取代码,这会无意义地去重新触发一次旧版本的索引,使用下面这条命令可以在不切换分支的情况下更新 master 到最新

git fetch origin master:master

来源

邮件协作

当你的项目在内网,而你又已经离职了的时候,只能把 commit 打出来然后发给维护者了

  • git format-patch -1 HEAD 从 HEAD 开始,往前生成 1 个补丁
  • git am *.patch 应用补丁

使用 git hooks

如果你使用 node 项目,可以借助 husky 帮你配置 git hooks ,然后配合 lint-stagedcommitlint 帮助规范项目

1
2
3
4
5
6
7
8
9
// package.json
{
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
"pre-commit": "lint-staged"
}
}
}
1
2
3
4
5
6
// lint-staged.config.js
module.exports = {
"*.{js,jsx}": ["eslint --fix", "git add"],
"*.css": ["stylelint --config .stylelintrc.css.js"],
"*.md": ["prettier --write", "git add"],
};

commit 规范

参考 commitlint ,主要包括以下几种

  • feat: 新功能
  • fix: 修复问题
  • docs: 修改文档
  • style: 修改代码格式,不影响代码逻辑
  • refactor: 重构代码,理论上不影响现有功能
  • test: 增加修改测试用例
  • chore: 修改工具相关(包括但不限于文档、代码生成等)

附赠 Git 常见黑话

  • PR: Pull Request. 拉取请求,给其他项目提交代码
  • LGTM: Looks Good To Me. 没问题OJBK,可以合并
  • SGTM: Sounds Good To Me. 和上面那句意思差不多
  • TL;DR: Too Long; Didn’t Read. 太长懒得看
  • ACK:  Acknowledgement. 确认,同意/接受变更
  • PTAL: Please Take A Look. 你来瞅瞅?用来提示别人来看一下
  • WIP: Work In Progress. 开发中,这个词在使用git stash的时候也见看到
  • TBR: To Be Reviewed. 提示维护者进行 review
  • CC: Carbon Copy 抄送

参考文献