我的个人博客

使用 git 时的关键笔记

A close up of a text description on a computer screen
Published on
/11 mins read/---

这篇文章是为那些像我一样喜欢通过命令行使用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 标志或 -sgit 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 rebaseforce 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

    为什么不用 --force

    TL;DR

    --force 标志会使 git 用本地更改覆盖远程仓库,而不比较变基后远程可能的更新,如果两个开发者在同一个分支上工作,这可能很危险。
    相反,--force-with-lease 确保只有在上游不存在更新时才能推送。

    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

在提交前检查更改(通常,我用这个来确保我的代码中没有留下 debughardcodeconsole.log)。

git config --global alias.d 'diff'
 
# 例如
git d style.css

注意

所有你的别名都可以在 ~/.gitconfig 文件(MacOS)中找到。你可以直接打开这个文件并编辑任何你想要的别名。

vim ~/.gitconfig
.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 的一些关键笔记。希望它们对你有所帮助!

如果你有任何问题或建议,请在下面的评论中告诉我。

编码愉快!

References