Shortcuts

Git 使用

在本节中,我们将介绍实际开发中常用的一些知识。

1. 基本概念和命令

概念 原始代码、工作区、暂存区、本地仓库、远程仓库以及它们之间相互转换的命令

../_images/git_command1.png

以下是一些未在上图中显示但也很常用的命令:

git stash 命令: 如果你正在开发分支 A,突然有一个任务需要切换到分支 B,而分支 A 还没有达到可以提交的程度。这时你可以使用 git stash 来首先保存分支 A 的更改(如果你想留下一些类似提交的信息,可以使用 git stash save "STASH-MESSAGE")。

然后你可以通过git checkout xxx命令切换到分支B(如果未执行git stashgit commit,则会报错)。在分支B上的开发完成后,你可以切换回分支A,然后使用git stash pop来恢复临时内容。

Stash 是一个堆栈。如果你需要弹出一个非顶部的元素,你可以使用 git stash list 来查看所有的 stash 记录,然后使用命令 git stash pop stash@{0},其中 0 可以替换为任何已存在的 stash 记录编号。

../_images/git_command2_stash.png

git log 命令: 可以显示提交信息,请参考 教程

git cherry-pick 命令: 你可以将一个提交应用到另一个分支。与 git merge 的区别在于,git merge 会将整个分支合并到其他分支。而 git cherry-pick 只会将一个提交应用到其他分支,请参考 教程

2. Git提交规范

我们有一些关于git提交的规则:

  1. 尽可能的,每个独立的功能对应一个提交

  2. Template: feature/fix/polish/test/style(commiter_name or project_name): commit message
    Example: fix(zlx): add tb logger in naive buffer

3. 以实际开发为例

让我们以一个实际的开发过程为例,来解释需要使用的git命令。

  1. 克隆仓库:git clone REPO-URL;

  2. 切换到您自己的开发分支:git checkout -b YOUR-BRANCH-NAME

  3. 开发你的分支。完成一部分后,使用命令git add包含你想要提交的内容(这里你可以使用git status查看所有更改,如果你想包含所有更改的文件,可以使用git add -u命令);然后使用git commit -m COMMIT-MESSAGE提交一个提交。

  4. 将本地仓库推送到远程仓库:git push origin YOUR-BRANCH-NAME。如果是第一次推送,它会显示远程仓库没有与之关联的分支,你可以根据提示修改命令,通常是git push --set-upstream origin YOUR-BRANCH-NAME。如果在你提交此修改之前,其他人已经修改了代码并推送到远程仓库,它会提示存在冲突。你需要使用git pull origin YOUR-BRANCH-NAME --rebase命令拉取最新代码。并在推送之前解决最新代码和你自己的代码之间的冲突(如果有的话)。

  5. 分支变基命令:git rebase BRANCH-NAME。在我们的开发过程中,必须确保分支可以无冲突地合并到主分支(或源分支)。因此,变基命令常用于以下场景:提交者A和B分别从主分支检出分支C和D进行开发,然后提交者A完成了C分支并将其合并到主分支。在开发结束时,提交者B必须确保将最新的主分支拉取到本地,然后使用git rebase main并在该分支开发结束前解决所有冲突。

4. .gitignore 文件

在我们的本地开发路径中,有许多文件我们不想提交到远程仓库,例如项目的本地配置信息、pycache、日志文件、检查点等。此时,使用.gitignore文件可以通过字符串匹配忽略这些文件。

.gitignore 文件通常如下所示:

# Ignore the specified file
HelloWrold.class
# Ignore the specified folder
pkg/
__pycache__/
# * is a wildcard and can match any string
# Ignore all .jpg files
*.jpg
# Ignore folders with 'ignore' at the end of the name
*ignore/
# Ignore folders with 'ignore' in the name
*ignore*/

如果你真的想提交一些被.gitignore规则阻止的文件(如图片),你可以使用git push -f PATH来上传。但请确保这个文件是必要的。