GitHub同步方法备忘

之前对 GitHub 仓库的使用一直不太了解,虽说用了一两次但总是马上遗忘了。想着下学期有门课可能会用到,而且这种东西还是了解一下比较好,所以记下来一些基本方法留作备忘。

SSH 免密设置

配置方法

用本地电脑连接 GitHub 账号总是会需要输入密码,当然这是为了保障账号安全,但如果在信任的设备上进行操作则完全可以设置 SSH 免密以实现更便捷的操作。

首先,我们需要生成本地 SSH 密钥用于标记自己的设备。在终端( PowerShell 或者 Git Bash 都可以,本文使用自带的 PowerShell 做演示,cmd 不太兼容 Linux 命令,所以会出问题)输入以下命令:

1
ssh-keygen -t ed25519 -C "你的邮箱@example.com"

其中,要将 你的邮箱@example.com 这一项换成自己的 GitHub 的注册邮箱。ed25519 是一个数字签名算法,用于生成密钥。

输入完毕后,一般会有一些诸如是否保存路径、是否设置密码之类的选项,没需求的话(一般保持默认就可以了,设置了反而影响免密的体验)就按大概3下回车跳过。

但是如果中途出现了 id_ed25519 already exists 提示,就代表你之前已经创建过一个密钥,此时会出现 Overwrite (y/n) 的选项,如果输入 y 就会覆盖之前创建的那个密钥,导致使用原密钥的连接出现问题,所以需要选择 n 或者直接回车跳过。

按照上述方法操作完毕后,输入以下命令以显示密钥(之前创建过密钥则显示原密钥):

1
cat ~/.ssh/id_ed25519.pub

这时屏幕上会出现一长串以 ssh-ed25519 开头的代码,我们把它 全部 选中并且复制(开头和含@符号的结尾也要),然后打开 GitHub -> (点击右上角头像)Settings -> SSH and GPG keys -> New SSH key ,然后把复制的密钥粘贴进去,Title 可以随便起(我用的是电脑型号),Key Type 保持默认的 Authentication Key 就可以。最后点击绿色的 Add SSh key 按键保存。

验证

完成以上操作后,在终端里输入:

1
ssh -T git@github.com

可能会显示 Are you sure you want to continue connecting (yes/no/[fingerprint])? ,我们输入 yes 并回车即可。

看到 Hi [你的用户名]! You've successfully authenticated... 的显示,就代表成功了。

仓库创建与文件增删改

仓库创建和本地克隆

点击 GitHub 右上角的加号,选择 New Repository 创建新的仓库。Repository NameDescription 按需要填就好了。Configuration 里的 Choose visibility 设置关乎别人是否可以看到你的仓库,演习用的仓库选择 Private 就好。README.gitignore 一般选择加上就可以( .gitignore 需要选择你使用的编程语言,用于避免把环境配置、缓存或数据等文件上传到GitHub)。不过如果是要备份网站内容,则需要全选不加以保证仓库干净。一切就绪后点击 Create repository 完成创建。

(这边插入一条:.gitignore 文件只会忽略一些基本配置和缓存文件,如果仓库用于机器学习之类的的项目,可以在 .gitignore 文件末尾加上如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# =========================
# 以下为机器学习与本地环境自定义屏蔽项
# =========================

# 机器学习数据与模型文件
*.csv
*.xlsx
*.h5
*.pth
*.pt
data/
dataset/
models/

# VS Code 配置文件
.vscode/

# Jupyter Notebook 检查点
.ipynb_checkpoints/

这样,我们就可以不把数据集等可能很大的文件上传到 GitHub 了。)

新仓库创建完毕后,在该仓库界面内找到右上角的 <> Code 按钮,点击并且选择 SSH 选项,复制以 git@github.com: 开头的链接。然后找到电脑内你希望存放代码的目录,右键后选择 在终端中打开 ,在开启的终端中输入:

1
git clone 刚刚复制的SSH链接

此时你选择的目录下会多出一个 你设置的仓库名 的文件夹,这就代表仓库已经创建成功了。

以后如果在另一台设备上对仓库里的文件进行了修改(具体方法会在下面提到),我们在 VS Code(假设你也使用 VS Code)中选择 打开文件夹 ,然后打开 你设置的仓库名 这个文件夹,在终端(这里指VS Code的终端,快捷键是 Ctrl + ` ,后面内容的“终端”一般也指 VS Code 的终端。)里输入指令:

1
git pull

就可以拉取存储在 GitHub 上的更新了。需要注意的是,我们应该尽量打开整个仓库文件夹,而不是只打开一个文件,否则指令可能无法被识别。

文件修改

在本地的仓库内,我们可以新建、删除和修改任意我们希望进行操作的文件。比如,我们在本地新建了一个名为 hello_world.py 的文件,里面只有 print("Hello World!") 这一行代码。

如果我们想把这个文件上传到 GitHub 的仓库里,只需要在终端先后输入:

1
git add .
1
git commit -m "feat: 增加 hello_world.py 测试脚本"
1
git push

即可(当然,以上命令输完之后分别需要跟一个回车)。

如果顺利的话,我们会看到 Writing objects: 100%... 这样的字样,这就说明我们成功了。此时打开网页端的 GitHub 仓库界面,应该可以看到我们新建的 hello_world.py 已经在其中了。

git add . 命令指把当前目录下的所有变动放到 Git 的暂存区里,其中符号 . 就代表目录下的所有内容。如果输入完后悔了,可以使用 git resetgit restore --staged 命令反悔,这两个命令会退回暂存区里的内容,不会影响本地的代码。

git commit -m "feat: 增加 hello_world.py 测试脚本" 会将暂存区里的变动生成快照,并放到本地仓库的历史中。其中 -m 后面是对变动的说明,冒号前的 feat 等,由 约定式提交 的标准决定,具体来说有如下几种:

  • feat: (Feature):新增了一个功能。比如你用 Python 写好了一个完整的决策树算法。(git commit -m "feat: 完成决策树算法复现")
  • fix: (Bug Fix):修复了一个代码错误。比如你发现昨天的代码在处理除数为 0 时会报错并修复了它。
  • docs: (Documentation):仅仅修改了文档。比如更新了 README.md 或者代码里的注释。
  • chore: (Chore):日常的杂项工作。比如修改了 .gitignore、更新了依赖包版本、调整了构建工具的配置等,这些不涉及核心业务代码的改动。
  • refactor: (Refactor):代码重构。功能没变,但是你把代码写得更优雅、运行速度更快了。

如果输入完 commit 这一行代码后后悔了,可以使用 git reset HEAD~1 撤销本次 commit 并退回暂存区内容,同样不影响本地代码,但之后需要重新进行 git add . 操作。

git push 代表将本地仓库生成的 commit 记录提交到云端,实现 GitHub 仓库的更新。完成这一步后,文件的提交就算成功了,我们之后可以在另一台设备上执行 git pull 将云端仓库同步到本地。

分支创建与处理

一开始我们的仓库里只有 main 一条分支。但是如果我们希望在保留原来文件的基础上修改某些文件(比如修改一个机器学习模型看看效果会不会有提升),就需要创建一个新的分支。这样,我们既没有覆盖原来的文件,又可以在新建分支里进行试验性探索。

首先,我们需要确保在主分支上起步,在终端执行:

1
git checkout main

来到主分支(当然,如果你之前没创建过分支,默认就在主分支上)。

然后,我们使用如下命令创建一个名叫 branch-1 的分支,并且切换到这个分支上:

1
git checkout -b branch-1

此时,这个名叫 branch-1 的新分支下应该有和主分支一模一样的所有文件。如果你使用的是 VS Code,应该可以发现左下角的 main 变成了 branch-1

如果我们打算修改某个文件,就拿之前那个 hello_world.py 举例子好了,现在我们把它的内容加上一行:

1
2
print("Hello World!")
print("在 branch-1 里向你问好!")

并使用 Ctrl + S 保存。

此时本地的 branch-1 分支已经和 main 分支不一样了,接着我们把这个更改提交到云端,使用和之前相似的代码:

1
git add .
1
git commit -m "feat: 添加了一个问好语"

然后,由于新的分支是第一次上云,我们的 push 命令稍有些不同:

1
git push -u origin branch-1

完成后,去网页端的 GitHub 仓库,就可以发现点击左上角 main 后的下拉栏里出现了 branch-1 分支。

我们一般只保留 main 一条分支,否则大量的失效分支会导致仓库十分混乱,这就需要我们执行分支的合并和删除操作。

在合并前,我们仍需确保自己处于主分支,可以使用 git checkout main 来转回主分支。然后输入:

1
git merge branch-1

来合并 branch-1 分支。

此时,如果有文件进行了更改,会出现选择保留主分支或是新分支的选项,有三个选项:

  • 采用当前更改 (Accept Current Change):保留 main 里的代码。
  • 采用传入更改 (Accept Incoming Change):保留 branch-1 里的代码。
  • 保留双方更改 (Accept Both Changes):把两行都留下来。

选择完成后,代码会变成你选的那一版,这时我们可以 Ctrl + S 保存。

最后,依旧执行:

1
git add .
1
git commit -m "fix: 合并 branch-1 分支"
1
git push

来提交新文件。

一个分支的作用结束后,我们用:

1
git branch -d branch-1

来删除本地分支,用:

1
git push origin --delete branch-1

来删除云端分支。

执行完毕后,无论是本地的 VS Code 还是网页端的 GitHub 仓库页面,你都会发现分支 branch-1 消失了。