Featured image of post github 工作流教程

github 工作流教程

字数: 2981

尽管当下,代码能力项目体系还不是很强,但是学会 github 的工作流还是很有用的。

前置

需要安装 git、ssh。一般来说这俩在 Linux 下都是自带的。如果没有按以下命令安装:

1
2
3
4
# debian/ubuntu
sudo apt install git ssh
# arch
sudo pacman -Sy git ssh

windows 可以去 https://git-scm.com/install/ 下载安装包。不过安装的时候记得将 git 添加到环境变量(path) 中。

将 ssh-key 添加到 github 账户

这里 windows 和 linux 大差不差。
笔者今天刚好要在 kali linux 添加 ssh-key,就以该系统为例:
首先生成新的 ssh-key 密钥:

1
ssh-keygen -t ed25519 -C "[email protected]"

[email protected] 改为你的 github 邮箱。

一路回车保持默认就好了,如果想加密码也可以。我是觉得没什么必要,而且繁琐……

然后我们复制生成的 ~/.ssh/id_ed25519.pub 内容。这里是 SSH 公钥文件。将文件内容一字不落的复制下来。
打开 github 点击头像-> setting -> SSH and GPG keys
点击 New SSH Key。
在这里,Title 自己取。将 id_ed25519.pub 的内容粘贴到 Key 框中。

点击 Add SSH key 就可以了。
最后在终端测试下是否添加成功:

输出如下即为成功:

1
2
3
PTY allocation request failed on channel 0
Hi storm-1614! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

git 的简单使用

当你添加上 ssh key,github 就存储了你当前设备的密钥,你进行上传下载操作 github 认出是你,而不需要输入密码,这给了我们很大的便利。

现在开始认识 git。
打开终端, cd 到一个空文件夹:

输入 git init 初始化存储库。
这时候你的目录就会出现 .git 文件夹,用于存储当前 repo 的各种信息。有些 shell 也会在提示符显示当前 git 仓库的信息,比如:

可以看到 master* 就是 git 信息。

注意,最开始你可能需要配置你的用户信息:

1
2
git config --global user.email "[email protected]"
git config --global user.name "your name"

请确保信息都和你 github 一致。

我们随便创建一个文本文件叫 1.txt 写入一些数据,保存。

这里介绍查看 git 当前状况的命令:

1
git status

当前信息为:

1
2
3
4
5
6
7
8
9
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	1.txt

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

这里可以知道我们当前的分支,还有文件的情况,比如这里有一个没有追踪的文件。
我们可以用 git add 命令把 1.txt 添加到暂存区。(记得善于运用 tab 补全)

1
git add 1.txt

此时的 git status 输出变成了:

1
2
3
4
5
6
7
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   1.txt

甚至有提示如何将文件从暂存区移除: 我们可以试试:

1
 git rm --cached 1.txt

这可不是直接删除了 1.txt,只是从暂存区移除而已,文件本身不变。
你再用 git status 看看会发现 1.txt 又变成 untracked files 了。

让我们重新添加上,然后进入到下一个命令。
当文件放到寄存区后,还没到分支,我们需要用 commit 命令将寄存区的内容推送到分支。一个分支就代表一个版本迭代。

1
2
3
4
5
git commit -m "add 1.txt"

[new-branch (root-commit) 8da1b89] add 1.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1.txt

在 linux 下 commit 内容可以用单引号或者是双引号,但是在 Windows 下只能用双引号。
总的来说就是 Windows 那一套终端体系和 unix 世界格格不入的,真的就是异端。

这算是 git 最基本的用法。 你还可以新建分支,切换分支,合并内容。

1
git checkout -b new-branch

创建并切换到新分支 new-branch

在这里可以修改下 1.txt 的内容,添加几行。
此时 git status 输出为:

1
2
3
4
5
6
7
On branch new-branch
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:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

它提示 1.txt 被修改,使用 git add 添加到暂存区,或者用 restoe 撤销修改。当然我们使用 add。
而后我们在提交一个 commit:

1
2
git add 1.txt
git commit -m 'modify 1.txt'

此时在 new-branch 这个分支,是干净的。

1
2
3
❯ git status
On branch new-branch
nothing to commit, working tree clean

此时我们切换回到 master:

1
git switch master

这里的 1.txt 还是最初 add 1.txt 时候的样子。
可以用 log 命令可视化当前的分支状态:

1
git log --graph --branches

可以看到新的更改在 new-branch 分支上。而 master 落后一个分支。确认代码无误后我们可以将其合并到 master 分支。

1
git merge new-branch

这就是最基本的本地分支操作,学会了这些就能自己进行代码的版本管理。

连接到远程仓库

本地的版本管理总差一点意思,git 真正的作用肯定是进行多人协作。我们可以选择在 github 上保存我们的源代码。在 github 上创建一个自己的 repo:
打开 https://github.com/new。
按照指示编辑仓库名,可见其实选 public 也 OK(反正没人看你的代码),或者 private。

后面几个 add 项建议都不加,我们等下要将本地存储库上传 github 上,github 有文件很麻烦。

创建完成后在该 repo 页面会有指南辅助你。我们选择下面的 …or push an existing repository from the command line

1
git remote add origin [email protected]:storm-1614/git.git

第二行切换分支其实没必要,我们直接用 master 也可以:

1
git push -u origin master  #直接 push master 分支到远程仓库

这样我们当前文件夹就被上传到了 github ,我们可以使用 github 进行在线代码版本管理,当然,核心还是在命令行(或者 vscode 等 GUI 辅助工具)下进行操作。
我们 commit 完成后就用 git push 命令推送到远程仓库。之后的 push 就可以不用加上 -u origin master 了。

1
git push

如果本地代码比远程代码旧就需要进行拉去。

1
git pull

也很简单。

PR(pull requests)

到了正式的 pr 操作了。pr 一般用于合并分支或者代码协作。这其中还是略有点复杂,但当你学会了整个流程,你才真正可以进行代码协同。

在对方的仓库点击 Fork:
实际就是创建一个自己的带 fork 标签的 repo ,该 repo 的内容和被 fork 仓库的内容一样。

在我们 fork 的 repo 下点击 Code 使用 ssh 的链接 clone 该仓库下来。

clone 命令就是克隆,从远程仓库克隆代码下来。其格式为: git clone 链接 比如:

1
git clone [email protected]:storm-1614/GDP_Home.git

我们可以和之前一样编写我们的代码,add、commit 做出一些版本管理操作。当然,最好是开一个新的分支进行操作。使用 git checkout -b 。
比如我们新建一个 dev 分支进行开发。

1
git checkout -b dev

进行完更改并 commit 后,不要着急合并到 master/main。我们用 push 命令将该分支上传到 github 上。

1
git push -u origin dev 

再回到 github 可以看到多了一个分支:

以及一个 compare& pull request 的建议。

我们可以先试试在自己的 repo 进行 pr。也就是合并分支。

点击 Pull requests 项:

为了普遍性我们选择 New pull request。

当然 compare & pull request 也是差不多的。

选择好合并分支,点击 Create pull request 即可。
你自己在最后可以点击 Merge pull request 直接把分支合并到 main 下。
当然保险起见,每次 pr 都是需要进行 code review 的。要严格审查每一个 commit 或者看 File changed 查看合并修改的内容。确认无误后就进行 Merge。

每一次 Merge 都会对被合并分支写入一个 commit ,你还是要像往常一样写好 commit message,确认无误后提交。
之后代码合并,该 pr 被关闭。

需要注意,此时你本地仓库 main 分支是落后于远程仓库的,你需要进行 pull。
有时候 pull 会于当前代码出现冲突,此时你就需要处理冲突,保留需要的代码。

可以在本地再创建一个远程,用于拉取对方(上游)的远程仓库。

比如我 fork 的仓库:GDPLL/GDP_Home 我可以创建一个 upstream。

1
git remote set-url upstream https://github.com/GDPLL/GDP_Home.git

该仓库是我的上游,得名。
如果要拉取该仓库就直接用:

1
git fetch upstream

你可以 checkout upstream/分支名 切换到该分支。同时可以 merge 合并分支。

每一次进行代码改动都应该 fetch upstream 进行合并再修改。不然当代码版本差异过大就很容易出现冲突(一行被同时修改),这样非常棘手。

更改代码前:和上游仓库同步
git fetch upstream
git merge upstream
提交更改
然后开始写代码

后记

github 工作流有趣的地方就在于 pr,大抵学校是不会教如何 pr 的。而掌握这种方式又非常重要。 git 好像很多都要在命令行下操作,尽管有很多 gui 前端可以辅助修改,但总归是没有命令行下如此之细的颗粒度。我也不是拒绝图形化界面,有时候 vscode 的分支图表是非常清楚的。
当然,单用传统的 bash/powershell 甚至是纯粹的 cmd 是极其难用的。本文的终端使用的 shell 都是 zsh,可以看到在提示符可以表示当前分支和修改情况。windows 下的 powershell 通过添加插件的方式也可以实现显示 git 情况。除此之外,好用的 shell 肯定带有好用的 tab 不全。这点就连默认的 git bash 都能做到,可是默认的 cmd/powershell 完全丢失了这个最基本的功能。所以在 windows 上,就会觉得 cli 是何等的难用,可是在 linux 下,终端是好用且高效的!
AI 时代,token 成金。纯文本的命令行对 AI 尤其友好,为了更好的和 AI 交互、debug 学点命令行知识何尝不好?更何况使用 cli 不止得到了效率,还有些许极客的风味。