这篇文章是为那些像我一样喜欢通过命令行
使用git
的开发者编写的。如果你喜欢 GUI,希望你仍然能在这里找到一些有用的东西
Git 别名
Git 别名是一种强大的工作流工具,可以为常用的 Git 命令创建快捷方式
最简单来说,git alias
就是为长命令创建一个快捷方式(短命令
),使它们更容易记忆,你可以更快地输入。
语法
git config --global alias.<shortcut> <original-command>
使用 --global
标志告诉 git 该别名将在所有项目中使用(否则,它只会在你当前工作的项目中有效!)
如果 original-command
包含空格,请使用引号(''
)。
对我来说,我几乎为所有日常工作的命令创建了别名。
Git status
在提交前检查更改:
git config --global alias.st status
# 现在使用 `git st` 代替 `git status`
git st
On branch v2
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: components/ui/twemoji
modified: css/tailwind.css
modified: data/blog/git-notes.mdx
no changes added to commit (use "git add" and/or "git commit -a")
提示:使用带有
--short
标志或-s
的git st
来查看更改的简短格式,并且...你知道的 - 也为这个命令创建一个别名
git config --global alias.s 'status --short'
# 现在使用 `git s` 代替 `git st`
git s
M components/Image.js
M data/blog/git-notes.mdx
?? public/static/images/force-with-lease.jpg
结果更清晰,输入更快,对吧?
Git commit
git config --global alias.cm 'commit -m'
提交更改(先 add/stage
更改):
git cm "Initial commit"
TIP
如果更改仅针对现有文件(既不是新文件也不是已删除文件),请使用 --all
或 -a
标志,这样你就不必在提交前添加或暂存更改
git config --global alias.cam 'commit -am'
# 现在不用使用 2 个 git 命令
git add style.css # `style.css` 已经存在,不是新文件!
git cm "Update style"
# 只使用 1 个命令
git cam "Update style"
Git stash
将脏工作目录中的更改暂存起来
正如定义所说,当你需要在从远程仓库拉取新内容之前**"暂存"**更改时,使用 git stash
:
# 太短了,不需要创建别名
git stash
拉取后应用暂存的更改:
git stash pop
为它创建一个别名:
git config --global alias.sp 'stash pop'
# 现在
git sp
# 等同于
git stash pop
Git pull/push
始终使用 pull rebase
和 force push
来保持干净的提交树!
pull rebase
git config --global alias.prb 'pull origin --rebase'
# 现在 git pull origin --rebase main # 等同于 git prb main # 或 git prb master
如果在变基后发生冲突怎么办?
使用
git diff
列出所有冲突,并为此命令创建一个别名:git config --global alias.cf 'diff --name-only --diff-filter=U'
# 列出所有冲突 git cf # 解决所有冲突然后暂存更改 git add . # 完成变基 git rebase --continue
force push
当你完成解决变基后发生的冲突时,我们需要强制推送更改到远程仓库:
git config --global alias.pf 'push --force-with-lease' # 现在变基后 git pf
TL;DR
--force
标志会使 git 用本地更改覆盖远程仓库,而不比较变基后远程可能的更新,如果两个开发者在同一个分支上工作,这可能很危险。
相反,--force-with-lease
确保只有在上游不存在更新时才能推送。
Git checkout
git config --global alias.co 'checkout'
# 例如
git co main
创建一个新分支:
git config --global alias.cob 'checkout -b'
# 例如
git cob feature-x
TIP
使用 git co -
切换到上一个分支。
例如:
git branch
dev
* feature-x-y-z__ISSUE_ID
main
# 当前分支是 `feature-x-y-z__ISSUE_ID`
# 切换到 `dev`
git co dev
# 做一些事情
# 提交 ...
# 现在要回到 `feature-x-y-z__ISSUE_ID` 使用
git co -
# 而不是
git checkout feature-x-y-z__ISSUE_ID
Git diff
在提交前检查更改(通常,我用这个来确保我的代码中没有留下 debug
、hardcode
或 console.log
)。
git config --global alias.d 'diff'
# 例如
git d style.css
注意
所有你的别名都可以在 ~/.gitconfig
文件(MacOS)中找到。你可以直接打开这个文件并编辑任何你想要的别名。
vim ~/.gitconfig
# 在配置文件中找到别名部分
[alias]
s = status --short
分支命名约定
分支命名约定是一种命名分支的标准方式,使团队成员更容易理解分支的目的和状态
在团队中工作时,遵循一致的分支命名约定是很重要的。这里有一些常见的约定:
功能分支
feature/feature-name
# 或
feature/feature-name__ISSUE_ID
修复分支
fix/bug-name
# 或
fix/bug-name__ISSUE_ID
热修复分支
hotfix/bug-name
# 或
hotfix/bug-name__ISSUE_ID
发布分支
release/version-number
# 或
release/version-number__ISSUE_ID
Git 工作流
Git 工作流是一种使用 Git 的标准方式,使团队成员更容易协作
有几种常见的 Git 工作流:
Git Flow
Git Flow 是一种基于分支的工作流,围绕项目发布构建。它定义了几种类型的分支:
master
:生产就绪代码develop
:下一个发布的开发feature/*
:新功能release/*
:发布准备hotfix/*
:生产修复
GitHub Flow
GitHub Flow 是一种更简单的工作流,只有一个主分支(main
)和功能分支。
- 从
main
创建一个分支 - 添加提交
- 打开一个拉取请求
- 讨论和审查代码
- 部署和测试
- 合并到
main
GitLab Flow
GitLab Flow 是 Git Flow 和 GitHub Flow 的混合,增加了环境分支。
main
:预生产代码production
:生产代码feature/*
:新功能
Git 钩子
Git 钩子是在特定 Git 事件发生时运行的脚本
Git 钩子可以用来自动化任务,如:
- 在提交前运行测试
- 在推送前检查代码风格
- 在合并前运行构建
常见的 Git 钩子
pre-commit
:在提交前运行pre-push
:在推送前运行pre-receive
:在接收推送前运行post-receive
:在接收推送后运行
使用 Husky 设置 Git 钩子
Husky 是一个使 Git 钩子更容易使用的工具。
# 安装 husky
npm install husky --save-dev
# 启用 git 钩子
npx husky install
# 添加一个钩子
npx husky add .husky/pre-commit "npm test"
Git 提交消息
Git 提交消息是描述更改的短消息
好的提交消息应该:
- 简短(不超过 50 个字符)
- 使用祈使语气("添加功能"而不是"添加了功能")
- 解释为什么而不是如何
常规提交
常规提交 是一种提交消息的格式约定,使自动化工具更容易处理。
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
常见的类型:
feat
:新功能fix
:错误修复docs
:文档更改style
:不影响代码含义的更改(空格、格式等)refactor
:既不修复错误也不添加功能的代码更改test
:添加或修正测试chore
:对构建过程或辅助工具的更改
例如:
feat(auth): add login page
Add a login page with email and password fields.
Closes #123
Git 忽略文件
Git 忽略文件是一个告诉 Git 忽略哪些文件的文件
.gitignore
文件用于指定 Git 应该忽略的文件和目录。
常见的忽略模式
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略所有 .env 文件
.env*
# 但不忽略 .env.example
!.env.example
全局忽略文件
你可以创建一个全局忽略文件,适用于所有 Git 仓库:
git config --global core.excludesfile ~/.gitignore_global
Git 别名(高级)
除了基本的别名,你还可以创建更高级的别名来自动化复杂的任务
使用 Shell 命令
你可以在别名中使用 Shell 命令:
git config --global alias.last '!git log -1 HEAD'
创建自定义命令
你可以创建自定义命令来自动化复杂的任务:
git config --global alias.unstage 'reset HEAD --'
# 现在
git unstage file.txt
# 等同于
git reset HEAD -- file.txt
结论
这些是我在日常工作中使用 Git 的一些关键笔记。希望它们对你有所帮助!
如果你有任何问题或建议,请在下面的评论中告诉我。
编码愉快!