现在是时候学习如何创建自己的Git仓库,以及如何添加文件和完成提交。在本系列的前几篇文章中,您已经了解了如何以最终用户的身份与Git进行交互;您像流浪者一样偶然发现了一个开源项目网站,克隆了存储库,然后您就可以开始深入研究了。你知道与Git交互并不像你想象的那么困难,也许你现在只需要被说服在你的工作中使用Git。尽管Git确实是许多重要软件的首选版本控制工具,但它不仅适用于这些重要软件;它还可以管理您的购物清单(当然,如果它们对您很重要!)、您的配置文件、每周报告或日志、项目进度日志,甚至是源代码!毕竟,使用Git是必不可少的,而且您肯定遇到过无法理解版本信息的备份文件的情况。在您开始使用Git之前,Git无法为您提供帮助,现在是开始学习和使用它的最佳时机。或者,用Git的话来说,“没有其他推送比originHEAD更有帮助”(意思是千里之行始于足下)。我保证,你很快就会明白这一点。类比录音我们经常用“快照”这个词来指代电脑上的镜像,因为很多人对装满不同时代照片的相册充满了感情。这很有用,但是,我认为Git更像是一个记录会话。也许你对传统的录音室盒式录音机并不熟悉,它由几部分组成:一个可以正转或反转的转轴,一个保存声音波形的磁带,通过磁带机可以将声音波形记录在磁带上。拾音头,或检测磁带上的声音波形并播放给听众。除了向前播放磁带外,您还可以将磁带倒回上一节,或快进以跳过下一节。想象一个乐队在70年代录制磁带。你可以想象他们一遍又一遍地练习这首歌,直到所有部分都完美无缺,然后将其录制到配乐中。首先,您将录制鼓,然后是贝斯,然后是吉他,最后是主唱。每次录制时,录音室工作人员都会倒带并将其置于循环模式,以便播放您之前录制的部分。例如,如果您正在录制贝斯,您会听到背景中的鼓声,就好像您在自己打鼓一样,然后吉他手在录音时会听到鼓声、贝斯(和牛铃)等声音。在每个循环中,您录制一部分,在下一个循环中,工作人员按下录制按钮将其合并到磁带中。如果您想重新混音您的作品,您也可以复制或交换整个磁带。现在我希望上面对1970年代录音工作的描述足够生动,让我们可以把使用Git想象成一个录音工作。创建一个新的Git存储库首先要为我们的虚拟录音机购买一些磁带。在Git术语中,这些磁带是仓库;它是所有工作的基础,这意味着这是存储Git文件的地方(Git工作区)。任何目录都可以是Git存储库,但让我们从一个新目录开始。这需要以下三个命令:创建目录(如果愿意,可以在图形文件管理器中执行此操作。)在终端中切换到目录。将其初始化为Git管理的目录。即运行以下代码:$mkdir~/jupiter#Createdirectory$cd~/jupiter#Enterdirectory$gitinit.#InitializeyournewGitworkspace在本例中,文件夹jupiter是一个空的但合法的Git存储库。有了仓库,接下来的事情就可以一步步搞定了。您可以克隆存储库,可以来回移动到历史上的某个点(前提是您有一个),创建备用时间线,以及做Git可以做的任何其他事情。在Git存储库中工作与在任何目录中工作一样。您可以在存储库中创建新文件、复制文件和保存文件。你可以像往常一样做各种事情;Git并不复杂,除非你认为它很复杂。在本地Git仓库中,一个文件可以有以下三种状态:Untracked文件Untracked:你在仓库中创建了一个新文件,但是你没有将该文件添加到Git的管理中。TrackedfilesTracked:已经加入Git管理的文件。暂存区文件Staged:被跟踪的文件已经被修改并添加到Git的提交队列中。您添加到Git存储库的任何新文件都不会被跟踪。这些文件保存在你电脑的硬盘上,但你没有告诉Git这是一个需要管理的文件。用我们的录音机来类比,就是录音机没有打开;乐队开始在录音室忙碌起来,但录音机还没有准备好。记录。别担心,当这种情况发生时Git会告诉你:$echo"helloworld">foo$gitstatusOnbranchmasterUntrackedfiles:(use"gitadd..."toincludeinwhatwillbecommitted)foonothingaddedbutuntrackedfilespresent(use"gitadd"totrack)你看,Git会提醒你如何将文件添加到提交任务。无需Git命令的Git操作在GitHub或GitLab上创建存储库只需点击几下鼠标。这并不难,您单击“新建存储库”按钮并按照提示进行操作。在您的存储库中包含一个“README”文件是一种很好的做法,这样人们在浏览您的存储库时就可以知道您的存储库是做什么的,更有用的是,这样您就可以在克隆存储库之前了解它。克隆存储库通常很简单,但是获得对GitHub上的存储库进行更改的权限稍微复杂一些,为了使用GitHub进行身份验证,您必须拥有SSH密钥。如果你使用的是Linux系统,你可以用下面的命令生成它:$ssh-keygen然后复制你的新密钥的内容,它是一个纯文本文件,你可以用文本编辑器打开它,或者使用下面的cat命令查看:$cat~/.ssh/id_rsa.pub现在将您的密钥粘贴到GitHubSSH配置文件或GitLab配置文件中。如果您使用SSH模式克隆您的项目,您可以将更改写回您的存储库。或者,如果您的系统上没有安装Git,您也可以使用GitHub的文件上传接口来添加文件。跟踪文件正如命令gitstatus的输出告诉你的,如果你想让git跟踪一个文件,你必须使用命令gitadd将它添加到提交任务中。该命令将文件存放在暂存区,所有文件都在暂存区等待提交,也可以在快照中使用。gitadd命令的目的在涉及将文件包含在快照中和添加新的或临时文件以由Git管理时是不同的,但至少现在,您不必担心这些差异。类比录音机,这个动作就像打开录音机开始录音一样。您可以想象按下已经在录音的录音机上的暂停按钮,或者倒回到开头并等待录制下一首曲目。当您将文件添加到Git管理员时,它会将其标记为已跟踪:$gitaddfoo$gitstatusOnbranchmasterChangestobecommitted:(use"gitresetHEAD..."tounstage)newfile:fooaddingafiletoacommittaskisnot"preparing"recording"。这只是将文件置于准备好记录的状态。添加文件后,您仍然可以修改文件;它只是标记为已跟踪并位于暂存区,因此您可以在写入之前将其拉出或修改到“磁带”(当然你可以再次添加它来做一些改变)。但是要小心:你还没有把文件记录在磁带上,所以如果你损坏了一个以前好的文件,你就无法恢复它,因为你没有在“磁带”上记录文件完好的时刻。如果你***决定不将文件记录到Git历史列表中,那么你可以撤消提交任务,这在Git中完成:$gitresetHEADfoo这个其实是为了释放录音机的录音状态,你只是在录音棚转了一圈而已LargecommitsSometimes,y你想向存储库提交一些东西;让我们用录音机来类比,就像按下录音按钮并将其录制到磁带上一样。当一个项目经历不同的阶段时,你会无数次地按下这个“记录键”。例如,如果您尝试了一个新的Python工具包并最终实现了窗口渲染,那么您肯定想要提交,这样如果您在尝试新的显示选项时搞砸了,您可以退回到这个阶段。但是如果你已经在Inkscape中绘制了一些图形,你可能需要等到你有需要开发的东西再提交。尽管您可能提交了很多,但Git不会浪费很多,也不会占用太多磁盘空间,所以在我看来,提交越多越好。commit命令会“记录”仓库中所有的暂存区文件。Git只“记录”被跟踪的文件,即过去某个时刻你用gitadd命令添加到暂存区的所有文件,以及自上次提交以来发生变化的文件。如果没有之前的提交,所有被跟踪的文件都包含在这次提交中,从Git的角度来看,这是一个非常重要的变化,因为它们不是被放入版本库而是被放入。要完成一次提交,运行以下命令:$gitcommit-m'Mygreatproject,firstcommit.'这将保存所有已提交的文件,这些文件可以在以后用于其他操作(或者,使用英国电视剧♂TheTimeLord中的Gallifreyan)。在俚语中,它们成为“固定时间点”)。这不仅是一个提交事件,而且还是一个指向您在Git日志中找到的提交的引用指针:$gitlog--oneline55df4c2Mygreatproject,firstcommit。要查看更多信息,只需使用不带--oneline选项的gitlog命令。本例中提交的引文编号为55df4c2。它叫做“commithashcommithash”(LCTT译注:这是一个通过SHA-1算法生成的哈希码,用来表示一个gitcommit对象),它代表了你刚才的commit包含的所有新的变化,覆盖掉之前的纪录。如果你想“倒带”到你的提交历史中的某个点,你可以使用这个散列作为基础。您可以将此散列视为录音带上的SMPTE时间码,或者更确切地说,是黑胶唱片上两首不同歌曲之间的间隔,或CD上的曲目编号。当你更改文件并将它们添加到提交任务中,并最终完成提交时,这将生成一个新的提交哈希,每个哈希标记一个历史点,代表你的产品的不同版本。这就是为什么像CharlieBrown这样的音乐家使用Git作为他们的版本控制系统的原因。在下一篇文章中,我们将讨论关于GitHEAD的方方面面,真正为你揭开时空穿梭的秘密。不用担心,您只需要继续阅读(或者您已经在阅读了?)。