git 是一个免费开源的版本控制系统,通常用于跟踪代码更变、更变人和团队协作。

git-logo

术语

什么是 git?

git是一个开源且免费的版本控制系统

什么是版本控制?

版本控制是对文档、计算机、程序、大型网站和其他信息集合的更改(代码更改跟踪)的管理

专有名词

简写解释
Directory文件夹
Terminal or Command Line命令行
CLI命令行界面
cd更改目录
Code Editor写代码用的文本编辑器
Repository/repo项目仓库
GitHub一个存代码用的平台
git一种版本控制系统
注意: 不要混淆git与GitHub。 git是一个版本控制系统,它可以跟踪你的代码更改记录。你可以离线使用git。GitHub是一个可以托管项目代码的在线平台,可以与其他人协同工作。

git 命令

简写解释
clone将远程仓库(比如GitHub, Gitee)的内容复制一份到本地
add在git中跟踪文件的变化和更改
commit将文件保存在Git中
push将提交上传(git commit)到远程仓库,比如GitHub
pull实现本地仓库与远程仓库的同步,与 push 相反

git和GitHub使用入门

安装 git

检查是否已经安装Git:

git --version

如果Git被正确安装,你应该会看到一个Git的版本号。如果未安装,参考如下安装方法:

  • Mac: 使用 homebrew (一个包管理器) 安装git
  • Debian/Ubuntu Linux: apt-get install git
  • Windows: 使用 setup program 安装

设置密钥对

GitHub 使用密钥对用于验证用户,此外在使用很多功能前必须设置好密钥对。(比如git clone)

生成一组密钥对(将邮箱地址替换为你GitHub的邮箱):

ssh-keygen -t ed25519 -C "your_email@example.com"

默认情况下,会生成两个文件:

  • id-rsa
  • id-rsa.pub
id-rsa 是你的私钥, id-rsa.pub 是你的公钥。 请勿将私钥上传到其他地方,将会导致严重的安全风险。

general-flowchart

你需要将id-rsa.pub 文件的内容复制到GitHub -> Settings -> SSH and GPC keys

cat id-rsa.pub

git常见使用流程

以下是在本地设置 git 存储库并推送到远程的常见流程。

general-flowchart

git init

git init 命令可以将当前普通文件夹转为git文件夹。

git init

所有的git文件夹应该会有一个隐藏的.git目录。

.
├── .git
├── .gitignore
├── Chinese
├── English
└── Readme.md

git status

git status 命令可以打印当前 git 仓库的信息, 比如任何修改过的文件或新的文件。

# user @ machineName in ~/your/dir/path on git:main x [16:19:43]
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    English/post/2023/04.08.2023.Fundamental of Git and GitHub.md

nothing added to commit but untracked files present (use "git add" to track)

git add

可以使用 git add 命令跟踪文件的变化。

要跟踪所有已更改/新的文件:

git add .

要跟踪指定的文件:

git add [Your File Name]

git commit

git commit 将提交所有跟踪的文件更改。

git commit -m "Initial Commit" -m "Some more detailed desc."
  • 第1个 -m 后是commit信息的标题
  • 第2个 -m 后是commit信息的描述
注意: commit信息的标题为必填项,描述为可选项。

提交信息推荐规范

<type>(<scope>): <subject>
<commit类型>(影响范围): 具体描述

举例

fix(DAO): fixed invalid user table indexes.

type

type指明git commit的类别,应该使用以下类型,也可根据团队自行增减

  • feat : 新增功能
  • fix : 修复 bug
  • docs : 仅仅修改了文档,比如 README, CHANGELOG等等
  • test : 增加/修改测试用例,包括单元测试、集成测试等
  • style : 修改了空行、缩进格式、引用包排序等等(不改变代码逻辑)
  • perf : 优化相关内容,比如提升性能、体验、算法等
  • refactor : 代码重构,「没有新功能或者bug修复」
  • chore : 改变构建流程、或者增加依赖库、工具等
  • revert : 回滚到上一个版本
  • merge : 代码合并

scope(可选)

scope用于说明 commit 影响的范围,根据不同项目有不同层次描述。若没有特殊规定,也可以描述影响的哪些功能等。

subject

subject是commit目的的简短描述,不超过50/80个字符,一般git提交的时候会有颜色提示。

  • 若英文用不惯,那么推荐使用中文
  • 若是开源代码,一律推荐统一英文,英文不行可以翻译软件用起来
  • 若是开源代码,可以再附加对应的issue地址
  • 结尾不加标点符号

git push / git remote

git push 会将更改推送到远程仓库。

注意: 如果您将远程仓库克隆到本地,则远程仓库源已自动设置。 但是如果你在本地创建一个git仓库,你需要在推送前先设置远程仓库源

设置远程仓库源:

git remote add origin [Repository Address]

查看远程仓库源:

git remote -v

将更改推送的远程仓库:

git push origin [branch name]

例如 (推送主分支):

git push origin main

git clone

提示: 强烈建议使用一些代码编辑器,例如 VS Code,并与 Git 一起使用。
git clone [Repository Address]

例如:

git clone git@github.com:NianwenDan/DSTScripts.git

git log

git log 可以显示历史的提交记录。

commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (HEAD -> main, origin/main)
Author: Tom <machine@machine.localdomain>
Date:   Sat Apr 8 15:05:30 2023 -0700

    Add 11.20.2022 to Chinese Post

commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: Tom <machine@machine.localdomain>
Date:   Sat Apr 8 14:58:03 2023 -0700

    .DS_Store banished!

commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: Tom <machine@machine.localdomain>
Date:   Sat Apr 8 14:56:52 2023 -0700

git reset

git reset 可以撤消提交或预存区(stage)。

撤销一个预存区(stage):

git reset [File Name]

撤销上一次提交:

git reste HEAD~1

撤销指定的预存区(stage):

git reset [Hash Number]

撤消到特定阶段并删除之前的提交:

git reset --hard [Hash Number]

常见工作流

general-workflow

一些稍微更高级的使用方法

git 的分支

git-branching

优势:

  • 在不破坏主分支的情况下开发新功能
  • 团队合作更加方便

可能产生的问题:

  • 合并冲突

git branch

列举所有分支:

git branch
* main
(END)

删除 本地 feature 的分支:

git branch -d feature

删除 远程仓库 feature 的分支:

git push origin --delete feature

git checkout

git checkout 可以在不同的分支之间切换,或者创建一个新的分支。

新建一个分支:

git checkout -b feature

切换至 main 分支:

git checkout main

git diff

git diff 可以输出工作区和暂存区的(不同)。

git merge

git merge 可以合并分支。

Pull Request (PR)

合并请求 (Pull Request) 用于请求仓库的作者检查提交的代码。作者可以选择将代码并合并到其他分支。

Merge Conflicts

在文本编辑器或 GitHub 上解决冲突更容易。

参考

Git and GitHub Introduction

Git and GitHub for Beginners - Crash Course

你的git commit规范吗?看完从此commit不迷茫,带领团队更规范