在课堂中使用 Git

还没有读者喜欢这篇文章。
Open education and MIT OpenCourseWare

Opensource.com

在我的高级编程课程中,我发现中学生的能力远远超过我们通常的预期。在许多情况下,他们完全有能力使用行业标准工具来完成出色的作品。

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

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

Git 的 GUI 助手很多(GitHub 甚至提供了他们自己的助手),但我们发现纯命令行是最容易使用的。更重要的是,在中学的学习中,熟悉 Git 和命令行将在未来获得回报。

Git 入门

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

拥抱键盘

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

是的,命令提示符可能很可怕

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

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

而且,掌握 CLI 为学生提供了成就感。 他们为自己掌握它而自豪,这种自尊可以产生很大的作用。

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

您的第一个仓库

现在是 Git 等效的Hello, world! 的时候了。让我们创建一个新目录作为我们的 Git 仓库

mkdir gitdemo
cd gitdemo

现在我们在新的文件夹中。 是时候将其设为正确的 Git 仓库了

git init

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

touch new.txt
echo "Hello, World!" > new.txt

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

但这不仅仅是一个普通的文件夹; 它是一个 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 log 查看 Git 为您跟踪的内容。

有帮助,不是吗? 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. 创建上游仓库

上游 是您提交存根或起始代码的仓库,供您的学生在此基础上进行工作。 我还将 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 岁)在八年级(约 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.