在课堂中使用 Git

还没有读者喜欢这个。
Open education and MIT OpenCourseWare

Opensource.com

在我的高级编程课程中,我发现中学生能够进行比我们通常认为的复杂得多的操作。在许多情况下,他们完全有能力使用行业标准工具来完成出色的工作。

在我们的课堂上,我们工作中的核心工具之一是 Git。它是一个版本控制系统,由 Linus Torvalds(Linux 内核的创建者)设计。看看 Git 网站的首页,您就可以了解它在行业中的地位。它在计算机科学课程中与我们可能使用的任何其他工具一样重要——即使是在中学水平。

我们将在后面的章节中更深入地讨论 Git 的功能,但最重要的是:同步到远程仓库并跟踪多个用户的代码更改。这项技术使 GitHub 成为令人难以置信的开源项目库。使 GitHub 成为 GitHub 的相同功能也使教师可以轻松管理多个学生的项目,甚至公平且清晰地处理协作工作。

Git 的 GUI 助手比比皆是(GitHub 甚至提供了 他们自己的),但我们发现纯命令行最容易使用。更重要的是,在中学阶段熟悉 Git 和命令行从长远来看是有好处的。

Git 入门

在 Mac 和 Windows 上,安装上面链接的桌面应用程序是入门的简单方法。 这也将安装支撑 Git 系统的命令行工具。 再次强调,我强烈建议使用命令行而不是 GUI 工具。 原因如下。

拥抱键盘

学生喜欢学习命令行。 像编程语言一样,命令行看起来像一种秘密力量,就像神秘的知识。 通过适当的引导,它可以像教授任何其他用户界面一样简单。

是的,命令提示符可能很吓人

$ 你可以在这里输入任何内容

它是计算机版本的凝视深渊——它也在凝视你。 但请考虑一下:界面语言是人类语言。 只是文字。 事实上,这比大多数用户界面使用的神秘图标熟悉。 稍加练习,我预测您和您的学生将始终打开终端窗口,并在可以的时候使用它们。 关于 GUI 有一句老话:它们使简单的事情变得简单,而使复杂的事情变得不可能。 一旦您学会了 touchmkdircd,看看 GUI 或 CLI 哪个花费更多时间来完成任务。

而且,掌握 CLI 可以为学生带来成就感。 他们为自己懂得它而自豪,这种自尊可以大有作为。

本文中的步骤都将使用 CLI 示例完成。

你的第一个仓库

是时候进行 Git 等效的你好,世界!了。 让我们创建一个新目录作为我们的 Git 仓库

mkdir gitdemo
cd gitdemo

现在我们在新的文件夹里面了。 是时候把它变成一个合适的 Git 仓库了

git init

您将看到在 /path/to/your/repo/.git/ 中初始化了空的 Git 仓库。 .git 是什么? 如果您列出目录中的所有文件 (ls -a),您将看到一个新的隐藏 .git/ 目录。 这就是 Git 存储有关此新仓库信息的地方。 是时候添加一些文件了。

touch new.txt
echo "你好,世界!" > new.txt

您将拥有一个新文件 new.txt,其中现在包含一行文本:你好,世界!。 从命令行执行此操作而无需打开文本编辑器,是不是很酷?

但这不仅仅是任何旧文件夹; 它是一个 Git 仓库! Git 已经跟踪到我们有一个新文件。 输入以下命令

git status

我们将返回以下内容

On branch master

Initial commit

Untracked files:
(use "git add ..." to include in what will be committed)

new.txt

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

这是逐点翻译

  • 我们可以拥有此文件夹的多个版本,您正在查看的版本名为 master
  • 尚未进行任何提交(保存)。
  • 我看到此文件夹中有一些文件您尚未告诉我需要关注。 它们在这里...

Git 中的提交比仅仅单击保存要细致得多。 Git 允许我们选择在仓库中跟踪哪些文件。 它还允许我们暂存要保存到其历史记录中的文件,而不是始终保存所有内容。 这似乎很麻烦,但随着时间的推移,这种控制的优势就会显现出来。

因此,在我们提交 test.txt 到历史记录之前,我们必须暂存它。

git add new.txt

之后没有输出,但再次运行 git status 会产生

On branch master

Initial commit

Changes to be committed:
(use "git rm --cached ..." to unstage)

new file: new.txt 

好的,太棒了。 Git 现在知道我们的文件了。 是时候将我们的更改提交到 Git 的历史记录了。

git commit -m "添加 new.txt"

-m 标志提供提交消息。 所有提交都需要这样的消息。 如果您没有使用 -m 标志提供消息,Git 会将您踢入命令行文本编辑器,当您不习惯它时,这可能会让人感到不安。 我建议现在使用 -m 标志。

提交命令后,您将看到如下输出

[master (root-commit) c6c1180]
Add new.txt 1 file changed, 1 insertion(+)
create mode 100644 new.txt 

翻译

  • 我们的第一次提交! 而且我们也在 master 分支上。 我为此提交创建了一个唯一的 ID。
  • 这是此提交中更改的内容。
  • 我创建了一个文件。

我们快完成了! 但是您的大多数提交都不会是初始提交,对吧? 它们将是您已经使用过的仓库的更新。 因此,让我们进行一些更改。

echo "Foobar!" >> new.txt

这会在我们的 new.txt 中添加一个新行(同样,不需要文本编辑器)。 快速运行 git status 显示

On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

modified: new.txt 

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

看看那个! modified: new.txt。 Git 看到我们文件的更改。 如果您好奇究竟什么发生了变化,您可以运行 git diff new.txt。 这会产生类似的结果

diff --git a/new.txt b/new.txt
index 8ab686e..d8eeaac 100644
--- a/new.txt
+++ b/new.txt @@ -1 +1,2 @@
Hello, World!
+Foobar! 

注意添加行周围的 +。 这似乎是一个合理的更改,因此我们将提交它。 不要忘记 git add new.txtgit add -A 分别添加该文件或所有文件到暂存区。 再次调用 git commit 并提供适当的提交消息,我们在历史记录中总共获得两个提交。 继续看看 Git 正在使用 git log 为您跟踪什么。

有帮助,不是吗? Git 的功能要深入得多,但您刚刚完成了开发人员相当标准的 Git 工作流程。

走向远程

使用 Git 管理本地项目非常有用,但当与 GitHub 或 Bitbucket 等远程仓库配对时,该技术真正大放异彩。 因此,让我们继续这样做。 本文我选择使用 GitHub,因为它是目前最重要的远程仓库服务。 我个人项目更喜欢 Bitbucket,但在与其他开发人员相同的平台上有一个很大的好处。 可以将其视为程序员的社交媒体。

如果您愿意,可以为此设置一个 GitHub 帐户,但您不需要它,因为我已经为您创建了一个仓库。 您将连接到我的远程在线版本的 gitdemo 仓库并下载我的更改,然后将其与您的更改合并。

安全提示:我们都是 FOSS 社区的朋友。 而且我们一直从其他计算机下载代码。 但是我即将要求您执行的操作需要一定程度的信任,并且我不认为您应该盲目地这样做。 请随时查看这个小型仓库,以确保我没有试图用恶意代码感染您的机器。 或者任何代码,就此而言。

说完这些,让我们设置您的本地仓库以查看我的仓库是否有上游更改,方法是输入

git remote add upstream https://github.com/mttaggart/gitdemo

没有输出意味着它工作了。 我们现在准备好下载(fetch)和合并 GitHub 上的文件与您的本地仓库。 我们可以使用 git pull 同时执行这两个步骤,或者使用 git fetchgit merge 分别执行这两个步骤。 为了简单起见,让我们拉取

git pull upstream master

嘿,master 是什么东西? 不用担心; 这只是意味着我们位于仓库的 master 分支上,主分支。

我想那应该是主干。 无论如何,您会看到此输出

Merge made by the 'recursive' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 README.md 

看起来你那里有一个新文件! 去看看 README.md,看看发生了什么。 如果您想要刚刚发生的事情的漂亮可视化效果,请继续运行以下命令

git log --graph # q 退出,j 和 k 滚动

您可以看到合并了两个分支——远程和本地,从而产生了当前的状况。

如果我和您在这个仓库上一起工作,然后您进行了一些更改,您需要将其提交到我们的共享 GitHub 仓库,您只需 git push 上传您的更改到 GitHub,将其与之前的内容合并。

“太棒了 Taggart,现在我会用 Git 了。 这如何让我成为一名更好的老师?” 秘诀在于跳出代码思维。

Git 文件夹

很多教育工作者都在谈论为学生创建有意义的数字文件夹,但实际上很少有人能成功。 这很困难——你如何表示如此多的不同文档? 你如何跟踪应该包含和不应该包含的内容? 你如何确保文件夹是建立在一个学生即使毕业或离开学校后也能访问的平台上?

Git、Git、Git、HTML 和 Git。

想象一下,让学生维护一个文档目录(最好是开放文档格式,甚至更好的是 HTML),他们在整个学业生涯中进行管理。 也许每个季度,他们都会决定对哪些作品感到最自豪。 他们将这些文件添加到 Git 仓库,提交并推送到远程仓库。 如果担心隐私,则不必是 GitHub。 像 GitLab 这样的项目允许学校创建自己的 Git 远程仓库,而无需依赖第三方。

借助开发人员依赖的跟踪和版本控制功能来获得干净的代码,学生可以获得他们工作历史的良好时间线。 他们甚至可以在学业生涯的不同阶段创建其文件夹的发布版本,以展示成长。 我意识到 Git 从未打算用于此目的,但我认为它是文件夹问题的一个可能的解决方案。

使用 Git 进行计算机科学教学

我使用 Git/GitHub 运行我的中学编程课程。 我意识到 GitHub 有一个 相当不错的解决方案 用于管理多个学生仓库,但我决定自己动手——部分原因是学校已经使用可以跟踪作业的学习管理系统,部分原因是为了强迫自己充分学习 Git,以便我有信心使用它来运行课程。

这是我的做法

1. 创建上游仓库

上游 是您提交 stub 或起始代码的仓库,供您的学生使用。 我还将 Markdown 格式的课程目标放在这个仓库中。 每节课都有自己的文件夹。 每周,新的提交都会带来新的项目。

2. 设置学生帐户

GitHub 的 Classroom 解决方案允许教育工作者为学生作业创建私有仓库——如果担心隐私,这是一个主要优势。 或者,您可以只允许学生在 GitHub 或 Bitbucket 上创建个人公共帐户。 如果学生从一开始就拥有该帐户,那么他们就提前开始了作为开发人员的职业生涯。 更重要的是,创建帐户可能是讨论在线安全、数字公民身份和知识产权的机会。

3. Fork 上游

学生创建帐户后,他们应该 fork 您的上游仓库。

Forking 创建了您的代码的个人副本(开源很棒,不是吗?),学生可以自行更改和扩展。 您可以在上游添加任意数量的内容; 学生将接受它并从那里开始运行。

4. 克隆/拉取学生仓库

git clone 获取远程仓库并将本地副本下载到您的计算机,包括仓库的提交历史记录。 我有一个文件夹,我在其中 git clone 了所有学生的仓库。 然后,使用我编写的一个小的 Bash 脚本,我一次拉取所有仓库,创建每个学生最近两次提交的组合日志文件。 他们的提交告诉我他们自上次检查以来一直在做什么,因此我知道如果他们改进了解决方案,则需要回头查看旧课程。

Git:许多问题,一个解决方案

亲爱的教育工作者,当然,在课堂中实施 Git 这样的东西存在巨大的学习曲线——如果您将 Git 视为文件夹工具,则学习曲线会更大。 尽管如此,情况总是如此。 教育实践的重大变革,即使是教育技术实践的变革,也并非没有相当大的困难。 作为开源倡导者教育倡导者,我们应该努力寻求有效、公平和可访问的解决方案。 虽然非程序员不熟悉 Git,但作为一种技术,它满足所有三个标准。 它的未来肯定光明,我希望您考虑探索其在教育中的潜在用途。

User profile image.
Taggart 是一位教育技术专家、作家,有时也是程序员。 在费城地区度过了他的一生之后,他收拾行装搬到了洛杉矶,目前与妻子和几台可爱的基于 Linux 的计算机住在一起。

6 条评论

我喜欢这个主意,只是很遗憾 git 在远程使用方面对 txt 文件以外的任何文件都不友好。

永远不要低估他们的潜力。 我最小的儿子(现在 24 岁)在 8 年级(约 2005 年 - 在 git 出现之前)编写了 Tuxblocks(SF 项目)。 他甚至编写了自己的 SCM 工具,其功能类似于 git(尽管不如今天的 git 功能完整)。

我希望 Taggart 先生能更多地解释如何在课堂上使用 git。 对于我来说(我已经对 Git 有所了解),我真的很想知道如何在课堂上使用它进行案例研究。

谢谢 Michael,您的博客的最后 4 个步骤正是我为即将到来的软件开发课程所想的。

一两个问题:“GitHub Classroom”教程建议首先创建一个“组织”,并在其中创建主作业仓库。 然后,他们没有向像我这样的初学者解释这如何有益于课堂的运行。

学生可以 fork 我的(公共)仓库,无论它是否位于组织中。 我意识到我可以邀请人们加入组织(如果我必须手动为所有学生执行此操作,我会认为这是一个麻烦,但如果我看到了好处,我会这样做)。 我也可以设置“团队”,但同样,不确定如何利用所有这些权力。

换句话说,我的组织的成员(使用我的公共作业仓库)可以做什么,而组织外的人不能做什么?

问题二:版本控制是关于冲突解决,即当本地和远程仓库同步或分支合并/拉取时,如何解决问题。 在上面的场景(步骤 1-4)中,这种情况永远不会发生,因为学生只针对他们自己的仓库进行同步(pull push)。

我想提出一些本地和远程仓库不同的场景,但不要让所有学生都合并回同一个地方,这会变得太混乱而无法处理。 请参阅某人在此处的经验:https://mdnahas.github.io/doc/Git_in_the_Classroom.html

我可以引入由 2 名学生组成的小组,让他们在同一个远程仓库上工作,但是像这样的分组工作在教育中总是存在问题(例如,小组变得功能失调,成员不尽力,尽管这将在历史记录中变得明显,我想)。

或者,我考虑在我的学生的代码卡住时远程“帮助”他们,并将我的克隆推送回他们的仓库。 这有点“轻量级”,但总比没有好? 对您的想法感兴趣。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.