我目前正在为Git和版本控制的编程科学家编写课程模块。我试图传达的一个好处是(使用VC)可以保护您免受工作损失。但是当然,众所周知,Git为你提供了充足的机会射击自己。让学生在课程中失去工作是一种耻辱,因为他们使用了一个本来应该阻止这种情况发生的系统: - )
我的问题:您是否有关于可以教导人们(命令,工作流程,技巧)的事情的提示,以便在使用Git 时引导他们摆脱困境?
具体来说,这主要适用于具有独立工作流程的人,没有事先Git经验,也可能适用于初级程序员。
我所知道的提示示例:
定期将代码推送到GitHub或BitBucket。另外,请备份:)
远离git rebase
之类的命令,直到您知道自己在做什么为止。
在使用历史记录重写之前备份您的代码目录(包括.git
目录),当您还在学习时,尤其是。
谢谢!
答案 0 :(得分:3)
我认为你做的事情比想要的更复杂。
为了能够恢复以前的状态,只需要定期提交到本地仓库即可。您不必在此阶段引入分支或合并。也许标记为回归特定版本的方式。
为了降低因丢失计算机/崩溃的硬盘而导致代码丢失的风险,正确的备份是一个很好的建议。但这对所有事情都是一样的,而不仅仅是代码。
如果你想引入代码共享,可以选择推送到github或bitbucket。只要你只推,你是唯一一个推动它的人很简单。
答案 1 :(得分:1)
最常见的规则是:确保在使用命令之前知道命令的作用。
可能会在更具体的提示中拒绝:
git rebase
,我们可以说避免改变历史。-f
,push
上使用标记clean
,...)在做有潜在危险的事情之前拥有一个安全网确实总是一个好主意。但是,不需要复制整个目录:只需在原始提交上添加一个标记,即使出现问题就可以checkout
它就足够了,而且不那么麻烦。
答案 2 :(得分:1)
正如@nullability所说,提交时间和频率的问题非常重要。如果你每隔一周只会提交一个单一的更改集,那么你实际上会丢失数据,因为
您无法回到为达到当前变更集/解决方案而采取的具体中间步骤。
每次提交都有机会向您的未来解释,只需几句话为什么您决定进行一系列特定的更改。 (根据我的经验,如果更改集是自包含的,并且不需要您编写多段文本来解释所有内容,那么您更有可能花时间编写有意义的提交消息。 )
让人们查看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的功能。