创建您的第一个 Git 仓库

8 位读者喜欢这个。
Phire CMS: A feature-rich, lightweight content management system

Opensource.com

阅读

现在是时候学习如何创建您自己的 Git 仓库,以及如何添加文件和进行提交了。

在本系列的前几篇文章中,您学习了如何以最终用户的身份与 Git 交互;您是漫无目的的流浪者,偶然发现了开源项目的网站,克隆了一个仓库,然后继续您的生活。您了解到与 Git 交互并不像您想象的那么令人困惑,也许您已经被说服,是时候开始为自己的工作利用 Git 了。

虽然 Git 绝对是大型软件项目的首选工具,但它并不只适用于大型软件项目。它可以管理您的购物清单(如果它们对您来说如此重要,而且它们可能很重要!)、您的配置文件、日记或日记本、正在进行中的小说,甚至源代码!

而且这样做非常值得;毕竟,当您因为拥有刚刚被您搞得面目全非的东西的备份副本而生气时?

除非您使用 Git,否则 Git 无法为您工作,而且现在正是时候。或者,翻译成 Git,“没有像 origin HEAD 这样的 push”。稍后您会理解的,我保证。

录音带类比

我们倾向于用快照来谈论计算机成像,因为我们大多数人都能认同拥有一个充满特定时刻的照片专辑的想法。然而,将 Git 更多地视为模拟录音可能更有用。

如果您不熟悉传统的录音室磁带录音机,它包含几个组件:它包含向前或向后转动的卷盘、保存声波的磁带以及用于记录或检测磁带上的声波并将其呈现给听众的磁头。

除了向前播放磁带外,您还可以倒带以回到磁带上的前一点,或快进以跳到后面的点。

想象一下 1970 年代的一个乐队正在录制磁带。您可以想象反复练习一首歌,直到所有部分都完美,然后录制一个音轨。首先,您录制鼓,然后是贝斯,然后是吉他,然后是人声。每次录制时,录音室工程师都会倒带并将磁带置于循环模式,以便在您演奏时播放上一部分;也就是说,如果您演奏贝斯,您可以在演奏时听到背景中的鼓声,然后吉他手会听到鼓声和贝斯(和牛铃)等等。在每个循环中,您都会演奏该部分,然后在随后的循环中,工程师会按下录制按钮并将演奏录制到磁带上。

如果您决定对正在处理的内容进行重新混音,您也可以完全复制和更换一盘磁带。

既然我已经希望描绘了一幅生动的罗杰·迪安风格的 70 年代录音室生活画面,让我们将其翻译成 Git。

创建 Git 仓库

第一步是出去为我们的虚拟磁带录音机购买一些磁带。在 Git 术语中,这就是仓库;它是所有工作将要存在的媒介或领域。

任何目录都可以成为 Git 仓库,但首先让我们从一个新的仓库开始。它需要三个命令

  • 创建目录(如果您愿意,可以在 GUI 文件管理器中执行此操作)。
  • 在终端中访问该目录。
  • 将其初始化为由 Git 管理的目录。

具体来说,运行以下命令

$ mkdir ~/jupiter  # make directory
$ cd ~/jupiter     # change into the new directory
$ git init .       # initialise  your new Git repo

在这个例子中,文件夹 jupiter 现在是一个空的但有效的 Git 仓库。

这就是全部。您可以克隆仓库,您可以向后和向前追溯历史(一旦它历史),创建备用时间线,以及 Git 通常可以做的所有其他事情。

在 Git 仓库内部工作与在任何目录中工作相同;创建文件,将文件复制到目录中,将文件保存到其中。您可以像往常一样执行所有操作;在介入之前,Git 不会介入。

在本地 Git 仓库中,文件可以有三种状态之一

  • 未跟踪:您在仓库中创建的文件,但尚未添加到 Git。
  • 已跟踪:已添加到 Git 的文件。
  • 已暂存:已跟踪的文件,已被更改并添加到 Git 的提交队列。

您添加到 Git 仓库的任何文件都以未跟踪文件开始。该文件存在于您的计算机上,但您尚未告知 Git。在我们的磁带录音机类比中,磁带录音机甚至还没有打开;乐队只是在录音室里随意演奏,远未准备好录音。

这是完全可以接受的,Git 会在发生这种情况时通知您

$ echo "hello world" > foo
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)    
    foo    
nothing added but untracked files present (use "git add" to track)

如您所见,Git 还告诉您如何开始跟踪文件。

没有 Git 的 Git

在 GitHub 或 GitLab 中创建仓库需要更多的点击和指向。这并不困难;您单击新建仓库按钮并按照提示操作即可。

包含 README 文件是一个好习惯,这样路过的人就可以对您的仓库的用途有所了解,并且克隆一个非空仓库会更令人满意。

克隆仓库与往常没有区别,但是获得写回 GitHub 上的仓库的权限稍微复杂一些,因为为了向 GitHub 验证身份,您必须拥有 SSH 密钥。如果您使用的是 Linux,请使用以下命令创建一个

$ ssh-keygen

然后复制您的新密钥,它是纯文本。您可以在纯文本编辑器中打开它,或使用 cat 命令

$ cat ~/.ssh/id_rsa.pub

现在将您的密钥粘贴到 GitHub 的 SSH 配置,或您的 GitLab 配置

只要您通过 SSH 克隆您的 GitHub 项目,您就可以写回您的仓库。

或者,您可以使用 GitHub 的文件上传器界面来添加文件,甚至无需在您的系统上安装 Git。

GitHub 文件上传器。https://open-source.net.cn/sites/default/files/2_githubupload.jpg" title="GitHub 文件上传器。" typeof="foaf:Image" width="520" height="148">

跟踪文件

正如 git status 的输出告诉您的那样,如果您希望 Git 开始跟踪文件,则必须 git add 它。git add 操作将文件放置在特殊的暂存区中,文件在其中等待提交,或为了后代而保存在快照中。git add 的目的是区分您希望包含在快照中的文件,以及您希望 Git 至少暂时忽略的新文件或临时文件。

在我们的磁带录音机类比中,此操作打开磁带录音机并使其准备好录音。您可以想象磁带录音机按下了录制暂停按钮,或者处于播放循环中,等待下一个音轨被录制。

一旦您添加了文件,Git 会将其识别为已跟踪文件

$ git add foo
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file:   foo

将文件添加到 Git 的跟踪系统不是进行录制。它只是将文件放在舞台上,为录制做准备。在您添加文件后,您仍然可以更改文件;它正在被跟踪并保持暂存状态,因此您可以继续完善或更改它(然后再次添加它以获取这些更改),然后再将其提交到“磁带”。但请注意:您尚未录制,因此如果您破坏了某个完美的文件,则暂时无法回到过去,因为您从未将那个完美时刻录制到磁带上。

如果您认为该文件实际上尚未准备好记录在 Git 历史记录中,那么您可以取消暂存某些内容,就像 Git 消息描述的那样

$ git reset HEAD foo

实际上,这会解除磁带录音机的录制准备状态,您又回到了在录音室里随意演奏的状态。

大提交

在某个时候,您将想要提交某些内容;在我们的磁带录音机类比中,这意味着最终按下录制并将音轨录制到磁带上。

在项目生命周期的不同阶段,您按下录制按钮的频率会有所不同。例如,如果您正在努力完成一个新的 Python 工具包,并最终设法让一个窗口出现,那么您肯定会想要提交,这样当您在尝试新的显示选项时不可避免地破坏它时,您就可以有所依赖。但是,如果您正在处理 Inkscape 中一些新图形的草稿,您可能要等到您拥有想要开发的东西后再提交。但是,最终,提交的频率取决于您自己;Git 不会“花费”那么多,而且现在的硬盘很大,因此在我看来,越多越好。

提交记录仓库中所有暂存的文件。Git 仅记录已跟踪的文件,即您在过去某个时间点执行过 git add 的任何文件。以及自上次提交以来已修改的文件。如果不存在先前的提交,则所有已跟踪的文件都将包含在提交中,因为它们从不存在变为存在,这从 Git 的角度来看是一个相当大的修改。

要进行提交,请运行以下命令

$ git commit -m 'My great project, first commit.'

这将永久保存所有提交的文件(或者,如果您说 Gallifreyan 语,它们将成为“时间中的固定点”)。您不仅可以看到提交事件,还可以看到 Git 日志中指向该提交的参考指针

$ git log --oneline
55df4c2 My great project, first commit.

要获得更详细的报告,只需使用不带 --oneline 选项的 git log

此示例中提交的参考编号为 55df4c2。它被称为提交哈希,它代表您刚刚录制的所有新素材,叠加在以前的录音之上。如果您需要“倒带”回到历史中的那个点,您可以使用该哈希作为参考。

您可以将提交哈希视为音频磁带上的 SMPTE 时间码,或者如果我们稍微弯曲一下类比,可以将其视为黑胶唱片上歌曲之间的大间隙之一,或 CD 上的曲目编号。

随着您进一步更改文件并将它们添加到暂存区,并最终提交它们,您会累积新的提交哈希,每个哈希都充当指向您的产品不同版本的指针。

这就是他们称 Git 为版本控制系统的原因,查理·布朗。

在下一篇文章中,我们将探讨您需要了解的关于 Git HEAD 的所有内容,我们将漫不经心地揭示时间旅行的秘密。没什么大不了的,但您会想阅读它(或者您可能已经阅读过了?)。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时在两个行业工作。

4 条评论

这让我想起了我刚接触 Git 的日子。

我需要对您对 git 工作方式的描述做一个更正。当您执行 git add foo 时,文件 foo 在该点的状态将变为暂存状态。如果您稍后更改 foo,除非您再次执行 git add foo,否则这些更改将不会包含在暂存版本中。当您最终执行 git commit 时,提交的文件 foo 将处于发出最近的 git add foo 命令时的状态。

说得好。我不是有意暗示情况就是这样。我会在文本中添加一些澄清。干杯!

回复 作者:George G

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