如何让Git对初学者尽可能安全?

时间:2014-02-11 21:37:08

标签: git

我目前正在为Git和版本控制的编程科学家编写课程模块。我试图传达的一个好处是(使用VC)可以保护您免受工作损失。但是当然,众所周知,Git为你提供了充足的机会射击自己。让学生在课程中失去工作是一种耻辱,因为他们使用了一个本来应该阻止这种情况发生的系统: - )

我的问题:您是否有关于可以教导人们(命令,工作流程,技巧)的事情的提示,以便在使用Git 时引导他们摆脱困境?

具体来说,这主要适用于具有独立工作流程的人,没有事先Git经验,也可能适用于初级程序员。

我所知道的提示示例:

  • 定期将代码推送到GitHub或BitBucket。另外,请备份:)

  • 远离git rebase之类的命令,直到您知道自己在做什么为止。

  • 在使用历史记录重写之前备份您的代码目录(包括.git目录),当您还在学习时,尤其是

谢谢!

6 个答案:

答案 0 :(得分:3)

我认为你做的事情比想要的更复杂。

为了能够恢复以前的状态,只需要定期提交到本地仓库即可。您不必在此阶段引入分支或合并。也许标记为回归特定版本的方式。

为了降低因丢失计算机/崩溃的硬盘而导致代码丢失的风险,正确的备份是一个很好的建议。但这对所有事情都是一样的,而不仅仅是代码。

如果你想引入代码共享,可以选择推送到github或bitbucket。只要你只推,你是唯一一个推动它的人很简单。

答案 1 :(得分:1)

最常见的规则是:确保在使用命令之前知道命令的作用。

可能会在更具体的提示中拒绝:

  • 更一般地说,避免git rebase,我们可以说避免改变历史。
  • 避免在评论-fpush上使用标记clean,...)

在做有潜在危险的事情之前拥有一个安全网确实总是一个好主意。但是,不需要复制整个目录:只需在原始提交上添加一个标记,即使出现问题就可以checkout它就足够了,而且不那么麻烦。

答案 2 :(得分:1)

正如@nullability所说,提交时间和频率的问题非常重要。如果你每隔一周只会提交一个单一的更改集,那么你实际上会丢失数据,因为

  1. 您无法回到为达到当前变更集/解决方案而采取的具体中间步骤。

  2. 每次提交都有机会向您的未来解释,只需几句话为什么您决定进行一系列特定的更改。 (根据我的经验,如果更改集是自包含的,并且不需要您编写多段文本来解释所有内容,那么您更有可能花时间编写有意义的提交消息。 )

  3. 让人们查看git(或任何体面的DVCS,真的)作为一种实际上可以帮助驱动编码过程的工具 - 而不是必要的邪恶 - 是关键。 (为了推动这一点,您可能需要考虑向学生展示git bisect。)


    在确定给定的变更集是否准备好提交时要检查的几件事情:

    • 你能概括一下句子的变化吗?
    • 代码是否编译?
    • 测试通过了吗?

答案 3 :(得分:1)

我认为初学者的主要损失来源是无法正确添加和提交内容。所以你应该教他们如何检查他们的工作是否已经提交。例如,解释git commit消息:

  

没有添加到提交但未跟踪的文件存在(使用“git add”跟踪)

向他们展示如何使用git status命令并读取其输出,并强调他们应该在提交后验证没有未保存的更改。

数据丢失的另一个潜在来源是尝试做奇特事情时的错误。可能的错误是小错别字,遗忘标志,以及无序执行多步骤任务的步骤。因此,如果您正在教授编程课程并且只需要教授最低限度的版本控制,那么我会说只教授涉及最少步骤和最少标志的任务:

仅使用commit来保存工作的基本独奏工作流程,而revert为了回滚,几乎没有任何数据丢失错误的空间。一个独奏用户可能只能使用以下命令,但仍然可以从源代码控制中获得相当多的价值。

git commit -a
git revert
git status
git diff
git log

但是,由于该模块是关于版本控制的,因此您可能需要覆盖的不仅仅是最低限度。在这种情况下,当您涵盖高级任务时,您应该讨论每个命令中可能存在的陷阱(即,指出我上面谈到的可能错误导致数据丢失的特定机会),讨论具体的警告和错误消息。还包括大量故意破坏数据的练习,以便学生看到它是什么样的。

您可能还想覆盖git内部,以便学生拥有关于如何在git repos中存储数据的正确心理模型,并显示一些高级数据恢复案例(for example)。


指出版本控制不是备份(并且备份不是版本控制)似乎是合理的。

我不会说避免git rebase或历史重写是一个很好的规则,因为它们可能是源控制系统的非常有用的功能,并且在源控制的课程中教授它们似乎是合理的。

答案 4 :(得分:1)

用户应该注意的一件事是,Git并不是备份的另一种替代品。恰恰相反:Git是为了忘记信息而构建的。

例如,您无法在存储库中提交任何钩子脚本。钩子有意地是存储库的每个实例的本地。这同样适用于“rerere”冲突解决。

此外,不记录分支的历史(例如何时提交哪个分支)。分支仅作为没有历史记录的指针存在。

最后但并非最不重要的是,您永远无法确定您所做的提交实际上是否保留在其他存储库中。很容易忘记提交是否实际分发给其他存储库,如果删除承载更改的单个存储库,则可能会破坏工作。

摆脱正在进行的必要工作的最后一种方法是:存储未提交和未注册的文件(不会存储它们),然后重置--hard(将删除这些文件而无需跟踪)。当记住这次失败时,我的同事仍然生气...

答案 5 :(得分:1)

根据“初学者级程序员”的意思,最好告诉他们在git开始时查看一些不同的git用户界面。 Windows的Github和Mac的Github都是很好的例子。它们分别位于http://windows.github.com/http://mac.github.com/。这些用户界面显示哪些文件未被跟踪,并允许您非常轻松地提交它们。我不会称它们是命令行的完全替代品,但它可能是一个很好的方式来开始教他们如何提交和分支工作。 GitHub目前没有Linux接口,但http://git-scm.com/downloads/guis还有其他接口。随着他们熟悉提交和分支的想法,他们可以转换到命令行以访问更多Git的功能。