在课堂上使用 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 工具。原因如下。

拥抱键盘

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

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

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

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

而且,掌握 CLI 会给学生带来成就感。他们为自己掌握它而自豪,这种自尊心可能会大有裨益。

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

你的第一个仓库

现在是 Git 版本的Hello, world! 让我们创建一个新目录作为我们的 Git 仓库

mkdir gitdemo
cd gitdemo

现在我们在新的文件夹中了。是时候把它变成一个真正的 Git 仓库了

git init

您将看到在 /path/to/your/repo/.git/ 中初始化了空的 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 岁)在 8 年级(约 2005 年 - 在 git 出现之前)编写了 Tuxblocks(SF 项目)。他甚至编写了自己的 SCM 工具,其功能类似于 git(尽管不如今天的 git 功能完整)。

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

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

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

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

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

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

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

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

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

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.