本文翻译自 Eric Douglas 的文章,旨在作为我自己遵循这些指南的备忘录。

本文旨在为那些使用 Git 管理项目的人提供有益的提醒。

如果您是 Git 新手,请先阅读 参考资料 部分中列出的一些内容,然后再回来将本文用作速查表。

在 Git 命令前面,您会看到一些来自 oh-my-zsh 速查表 的别名。

让我们开始吧!

基础命令

  • git config --global user.name "您的名字"
  • git config --global user.email "您的邮箱@example.com"
  • git config --global core.editor <您喜欢的编辑器>
    • 例如:git config --global core.editor vim
  • git init: 初始化一个新的 Git 仓库。

提交结构

  • git status (gst): 查看项目状态。
  • 工作区域:
    • .git 目录 (.git Directory)
    • 暂存区 (Staging Area)
    • 工作目录 (Working Directory)
      工作区域图解
  • git add <文件名> (ga): 将文件添加到暂存区。
  • git add . (gaa): 将所有文件添加到暂存区。
  • git add *.js: 将所有 .js 文件添加到暂存区。
  • git rm --cached <文件>: 从暂存区中移除一个新文件
  • git commit -m "我的第一次提交" (gcmsg): 创建一个带有消息的提交。
  • git commit -v -a (gca):
    • -v: 冗余模式,在底部显示差异(diff)和更多有意义的信息。
    • -a: 类似于 git add .,它会添加所有已被修改和删除的文件,但不包括那些 Git 尚未知晓的新文件。
  • git help <命令>: 打开相应命令的手册。
  • git log (glg, glgg, glo, glog): 显示项目的所有提交/历史记录。

管理暂存区

  • git reset HEAD <文件名> (grh): 从暂存区中移除一个已被修改的文件。
  • git reset HEAD (grh): 从暂存区中移除所有已被修改的文件。
  • git checkout <文件名> (gco): 从暂存区中移除一个已被修改的文件,并撤销其所有更改。
  • git commit -m "我的第一次提交" --amend: 将暂存区中的文件/修改合并到最后一次提交中。
  • git commit -v -a --amend (gca!): 将暂存区中的文件/修改合并到最后一次提交中
  • 专业提示 (PROTIP): 不要将修改发送到远程仓库后使用 --amend。此命令仅用于本地开发。
  • .gitignore: 告诉 Git 哪些文件不应被追踪的文件。
    • 您可以使用 git add <文件名> -f 强制添加一个被忽略的文件。
  • git diff <文件名> (gd): 显示当前文件相对于其最后一次提交的修改。
  • git diff (gd): 显示所有文件相对于其最后一次提交的修改。
  • git reset HEAD~2 --soft: 从项目历史记录中移除最后两个提交,但不丢弃其中的修改。
  • git reset HEAD~2 --hard: 从项目历史记录中移除最后两个提交,并且丢弃这些提交中的所有修改以及创建的新文件。
  • git reset <提交> (--soft | --hard):
    • --soft: 将所有更改的文件保留为“待提交的更改”。
    • --hard: 丢弃自 <提交> 以来工作区中对已追踪文件的任何更改。
  • git reflog: 显示所有被“删除”的提交。
  • git merge <提交哈希>: 还原提交。
  • git add -i (ga -i): 打开交互模式。非常有用!
    • 注意: 配合选项 4: add untracked 可以快速添加新文件到 git add
    • 1 <回车>: 选择文件 1 添加到暂存区。
    • 1,3 <回车>: 选择文件 1 和 3 添加到暂存区。
    • 1-5 <回车>: 选择文件 1 到 5 添加到暂存区。
    • -2 <回车>: 取消选择文件 2,不将其添加到暂存区。
    • -2-4 <回车>: 取消选择文件 2 到 4,不将其添加到暂存区。
  • git clean -f: 从工作区中移除(删除)未追踪的文件。

暂存与分支

暂存 (Stash)

  • git stash (gsta): 将暂存区中的所有文件移动到 *”Stash Area”,它充当另一种类型的 *Working Area
  • git stash list: 显示所有 Stash 的列表。
  • git stash apply: 将最后创建的 Stash 中的所有文件恢复到暂存区。
  • git stash apply stash@{2}: 将名为 stash@{2} 的 Stash 中的所有文件恢复到暂存区。
    • 注意: stash@{0} 永远是最新的 Stash。
  • git stash clear: 清除所有 Stash。
  • git stash save "Stash名称": 保存一个新的 Stash 并赋予特定名称。
  • git stash pop (gstp): 将最后创建的 Stash 中的所有文件恢复到暂存区,并将其从 Stash 列表中移除。
  • git stash drop (gstd): 从 Stash 列表中移除最后创建的 Stash (stash@{0})。慎用!
  • git stash drop stash@{2}: 从 Stash 列表中移除名为 stash@{2} 的 Stash。慎用!

分支 (Branch)

  • git checkout -b develop (gco): 创建一个名为 develop 的新分支,并从当前分支切换到该分支。

  • git branch (gb): 列出所有分支。

  • git checkout master (gcm): 切换到 master 分支。

  • git merge <分支> (gm): 将一个分支合并到另一个分支。

  • gitk --all &: 打开一个 GUI 来可视化您的分支和提交。

  • git rebase master: 将 master 分支的修改合并到当前分支,并将当前分支的修改移动到这些新增内容之上。 ”…回溯 Head 以在其上重放您的工作”

    • git rebase --continue: 在解决冲突后继续变基。
  • git branch -d <分支>: 删除一个分支。

    • -D: 强制删除一个分支。
  • 专业提示: 每个功能或缺陷修复都使用一个单独的分支。创建大量的分支没有问题!

  • git merge <分支> --squash: 将多个提交压缩为一个。

    • --squash 工作流:
1
2
3
4
5
6
7
8
9
10
11
12
# 切换到 `master` 分支
git checkout master
# 创建一个 temp 分支
git checkout -b temp
# 使用 --squash 将 feature/x 分支合并到 temp 分支
git merge feature/x --squash
# 查看暂存区中的新修改/文件
git status
# 创建统一的提交
git commit -m "添加 feature/x"
# 删除 feature/x 分支
git branch -D feature/x
  • rebasemerge 的区别:

    • rebase:
      • 保持历史记录是线性的;
      • 破坏性: 移除最后一次提交并创建一个新的;
      • 如果提交已经存在于远程服务器上,请不要使用此方法。
    • merge:
      • 适用于保留分支派生历史;
      • 创建一个新的提交来统一两个分支。

管理远程仓库

  • git remote add <名称> <URL>: 添加一个新的将被追踪的远程仓库。
  • git remote rm <名称>: 移除一个远程仓库。
  • git push <远程> <远程分支> (gp, ggp): 将本地提交推送(Push)到指定分支的远程仓库。
  • git fetch <远程> <远程分支> (gfa): 从远程仓库拉取(Fetch)新提交到特殊分支 <远程>/<分支>
  • git pull <远程> <远程分支> (gl, ggl): 将远程仓库的更改合并到当前分支。在其默认模式下,git pullgit fetch 后跟 git merge 的缩写。
    • git pull --rebase (gup): 运行 git rebase 而不是 git merge

更多有用命令

  • git tag <名称>: 创建一个新标签 (例如 v1.3)。
  • git push --tags: 将所有标签推送到远程仓库。
  • git push <标签>: 将特定标签推送到远程仓库。

Git 工作流

git工作流

  • 分支类型:masterdevelopfeaturereleasehotfix

  • 主要分支

    • master 分支:
      • origin/master: 始终反映 生产就绪 状态。
    • develop 分支:
      • origin/develop: 始终反映包含下一版本最新已交付开发更改的状态。
  • 支持分支

    • feature 分支:

      • 派生自: develop

      • 合并回: develop

      • 命名规范: feature/功能名称

      • 创建分支:

      1
      git checkout -b feature/my-feature develop

      合并分支(完成 feature 分支):

      1
      2
      3
      4
      git checkout develop
      git merge --no-ff feature/my-feature
      git branch -d feature/my-feature
      git push origin develop
      • --no-ff 标记会导致合并始终创建一个新的提交对象。这避免了丢失有关功能分支历史存在的信息,并将共同添加该功能的所有提交组合在一起。
    • release 分支:

      • 派生自: develop

      • 合并回: develop master

      • 命名规范: release/release-v1.3

      • 创建分支:

      1
      2
      3
      git checkout -b release/release-v1.3 develop
      # 升级您的软件版本到 v1.3
      git commit -a -m "将版本号升级到 v1.3"
      • 合并分支(完成 release 分支):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 合并到 master
      git checkout master
      git merge --no-ff release/release-v1.3
      git tag -a v1.3
      git push origin master && git push --tags

      # 合并到 develop
      git checkout develop
      git merge --no-ff release/release-v1.3

      git branch -d release/release-v1.3
    • hotfix 分支:

      • 派生自: master

      • 合并回: develop master

      • 命名规范: hotfix/hotfix-v1.3.1

      • 创建分支:

      1
      2
      3
      4
      5
      git checkout -b hotfix/hotfix-v1.3.1 develop
      # 升级您的软件版本到 v1.3.1
      git commit -a -m "将版本号升级到 v1.3.1"
      # 修复缺陷后
      git commit -m "修复严重的生产问题"
      • 合并分支(完成 hotfix 分支):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 合并到 master
      git checkout master
      git merge --no-ff hotfix/hotfix-v1.3.1
      git tag -a v1.3.1
      git push origin master && git push --tags

      # 合并到 develop
      git checkout develop
      git merge --no-ff hotfix/hotfix-v1.3.1

      git branch -d hotfix/hotfix-v1.3.1

参考资料