0 写在前面

在暑假结束之际,再开新坑(
这种多门课并行的做法……其实我也不知道怎么样,毕竟暑假其实只有在学61B和CSAPP,总之,今天既然配好环境了,开学后就学起来吧,说太多倒是不如勤奋些了

课程网站是用的csdiy上的24fall的备份网站

Lab 0主要是配置一些东西,这次以Windows为例,由于61C好像用不了auto grader,其实配起来挺简单的,但我还是搞了比较久(

文章没有提到的地方,建议查看61C的Lab 0文档,本篇文章只作为配置的辅助,除了GitHub Setup部分跟官方课程文档略有区别外,其他内容和课程文档一致,也可以向ai提问尝试解决,

1 Installing Software

1
java -version
1
python --version # 也可能是python 3
名称 是什么
Java 编程语言,也指运行 Java 程序的软件平台
JDK Java 开发工具包,包含编译器、运行环境等工具
OpenJDK Java 平台的开源实现项目,提供 JDK 的源代码
Eclipse Adoptium 将 OpenJDK 源码构建、测试并提供下载的项目
Eclipse Temurin Adoptium 提供的 JDK 发行版名称,也就是你下载的产品
1
2
3
4
5
OpenJDK 源代码
↓ Adoptium 构建、测试、打包
Temurin JDK 安装包
↓ 安装到 Windows
提供 java (运行Java程序)、javac (把Java源代码编译成字节码) 等命令

2 GitHub Setup

先查看已有的git配置

1
2
git config --global user.name
git config --global user.email

如果没有配置,可以设置

1
2
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
  • user.name、user.email:记录每次提交的作者身份。
  • --global:作为当前操作系统用户的默认配置,应用于其各个仓库。
  • 名字不必与 GitHub 用户名相同;邮箱可以使用 GitHub 已验证邮箱或隐私邮箱

2.1 配置 GitHub SSH 认证

设置GitHub的流程跟61B其实相似,这里用SSH密钥向GitHub证明身份,以便访问私有仓库、推送代码

先测试已有认证

1
ssh -T git@github.com

如果认证没成功,先检查

1
ls -al ~/.ssh

如果没有可用的现成密钥,再生成

1
ssh-keygen -t ed25519 -C "你的邮箱"
  • ssh-keygen:生成密钥。
  • -t ed25519:选择密钥算法。
  • -C:添加备注,邮箱只是便于辨认的标签。

查看公钥

1
cat ~/.ssh/id_ed25519.pub

将完整输出添加到 GitHub 的 Settings → SSH and GPG keys → New SSH key,类型选择 Authentication Key

再测试

1
ssh -T git@github.com

结果类似

1
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.

这里一共有两次身份确认

  1. 你的电脑确认对方是GitHub
  2. GitHub根据密钥确认你的账号

How It Works

Git 用户名和邮箱用于提交署名,不负责 GitHub 登录。Git 访问 GitHub 常用 HTTPS 和 SSH 两种方式,它们都是支持加密通信的协议,在 GitHub 场景中,最直观的区别是仓库地址

1
2
3
4
5
HTTPS:
https://github.com/用户名/仓库.git

SSH:
git@github.com:用户名/仓库.git

HTTPS 可以匿名下载公开仓库,访问私有仓库或推送时需要认证,可通过 GitHub CLI、凭据管理器或个人访问令牌完成;SSH 则需要配置密钥,至于GitHub CLI、凭据管理器什么的,作者也不知道,事实上,作者为了写这篇文章才去向ai了解了一下这些之前就感到混乱的东西(

令牌 (token) 是一串由 GitHub 签发的凭据,程序可以用它代表你访问 GitHub。不同令牌可以有不同权限,有些还能设置到期时间、限制可访问的仓库。
你可能听到的 PAT(Personal Access Token),就是个人访问令牌,需要你在 GitHub 上创建。但不是所有令牌都需要手动创建,某些登录工具能通过浏览器授权获取令牌。
SSH 密钥则是一对文件:

  • 公钥添加到 GitHub。
  • 私钥保存在电脑上。
  • 连接时通过密码学验证证明你持有私钥,不把私钥上传给 GitHub。

如果读者除了署名什么都没配置,使用两种地址会遇到不同情况

操作 HTTPS 地址 SSH 地址
克隆公开仓库 通常直接成功,无须登录 需要 SSH 认证;没配密钥通常会失败
克隆私有仓库 需要登录凭据和访问权限 需要 SSH 密钥认证和访问权限
推送到自己的仓库 需要登录凭据和写入权限 需要 SSH 密钥认证和写入权限
本地 add、commit 不需要 GitHub 登录 不需要 GitHub 登录

2.2 建立自己的仓库

在GitHub上创建一个空仓库,在本地创建一个文件夹,假设路径是/e/code/cs61c

1
2
3
cd /e/code/cs61c
git clone https://github.com/61c-teach/fa24-lab-starter.git labs
cd labs

这几条命令创建课程目录、克隆官方实验仓库并进入它。clone 下载的不只是文件,还包括提交历史

下面我们设置两个远程别名

1
2
3
git remote rename origin starter
git remote add origin git@github.com:YOUR_USERNAME/YOUR_REPONAME.git
git push -u origin main
  • clone 默认把下载来源叫作 origin。
  • rename 把61C官方仓库的本地别名改为 starter。
  • remote add 将自己的仓库地址记为 origin,此时尚未上传。
  • push -u 上传本地 main,并设置它跟踪自己的 origin/main (详细原理见61B的Lab/HW文章)

3 Fizzing and Buzzing

接着跟着课程文档做练习,这个练习就是模拟了这么个过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
你的电脑:版本 A
伙伴电脑:版本 A
GitHub: 版本 A

你们各自在电脑上修改文件
你的电脑:A → B
伙伴电脑:A → C
GitHub: A

你们看不到对方的实时修改,这是伙伴先push上去
你的电脑:A → B
GitHub: A → C

GitHub 已经有 C,但你的电脑不会自动下载它,所以你还在自己的 B 上

这时如果提交修改并push,就会

1
2
3
4
5
6
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'github.com:61c-student/fa24-lab-username.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

意思是push失败,远程已经有别人提交的新版本了,但是你本地仓库并没有这个提交的新版本。你要先把它整合进来,再上传,避免丢掉对方的工作

所以我们先拉取最新的远程仓库

1
git pull --no-rebase origin main

--no-rebase 明确使用 merge

这时又会出现错误

1
2
3
Auto-merging lab00/code.py
CONFLICT (content): Merge conflict in lab00/code.py
Automatic merge failed; fix conflicts and then commit the result.

意思是远程仓库和本地仓库的提交都对code.py做了改变,而且可能改了同一个地方,导致Git不能自动地合并提交,可以检查下git status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git status
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" if you want to integrate the remote branch with yours)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
&#x20; (use "git add \<file>..." to mark resolution)
&#x20; both modified: code.py

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

解释如下

输出 意思
On branch main 你当前在本地 main 分支
have diverged 本地和远程的历史分叉了
have 1 and 1 different commits each 你有 1 个远程没有的提交,远程也有 1 个你没有的提交
You have unmerged paths 有文件尚未完成合并
both modified: code.py 双方都修改了 code.py,其中的冲突需要你决定如何处理
no changes added to commit 目前还没有暂存可以提交的改动;不代表你的修改消失了

打开文件,处理冲突,并删除冲突标记

1
2
3
4
5
<<<<<<< HEAD
本地版本
=======
另一侧版本
>>>>>>> 提交或分支

背景图可以直接搜到,wallpaper好像也有

不过这个练习会把之前clone进来的其他lab文件夹给弄没,所以这次提交、push后还需要

1
2
3
git status
git fetch starter
git merge starter/main
  • fetch:获取老师的最新提交,更新本地记录。
  • merge:把老师最新代码整合进自己的分支。

如果 lab00/code.py 再次冲突,保留正确的实验成果,整合必要内容、删除标记、测试,再 add 和 commit, push