什么是 Git?

17 位读者喜欢这篇文章。
A maze

Opensource.com

欢迎来到我的 Git 版本控制系统学习系列!在本系列介绍中,您将了解 Git 的用途以及哪些人应该使用它。

阅读

另一方面,关于 Git 的所有兴奋和炒作往往会使事情变得有点模糊。您只能使用 Git 与他人分享您的代码吗?或者您可以在您自己的家庭或企业的隐私中使用 Git 吗?您必须拥有 GitHub 帐户才能使用 Git 吗?为什么要使用 Git?Git 的好处是什么?Git 是唯一的选择吗?

所以忘记您知道的或您认为您知道的关于 Git 的一切,让我们从头开始。

什么是版本控制?

Git 首先是一个版本控制系统 (VCS)。市面上有许多版本控制系统:CVS、SVN、Mercurial、Fossil,当然还有 Git。

Git 是许多服务(如 GitHub 和 GitLab)的基础,但您可以使用 Git 而无需使用任何其他服务。这意味着您可以私下或公开使用 Git。

如果您曾经与任何人就任何数字内容进行协作,那么您就知道它是如何进行的。它开始时很简单:您有您的版本,然后将其发送给您的合作伙伴。他们进行了一些更改,所以现在有两个版本,并将建议发回给您。您将他们的更改整合到您的版本中,现在又只有一个版本了。

然后情况变得更糟:当您进一步更改您的版本时,您的合作伙伴对他们的版本进行了更多更改。现在您有三个版本;您和您的合作伙伴共同处理的合并副本,您更改的版本,以及您的合作伙伴更改的版本。

正如 Jason van Gumster 在他的文章《即使艺术家也需要版本控制》中指出的那样,这种综合征也倾向于发生在个人环境中。在艺术和科学领域,开发某物的试验版本并不罕见;您的项目的一个版本可能会使其变得更好,或者可能会彻底失败。因此,您创建了诸如 project_justTesting.kdenliveproject_betterVersion.kdenlive 之类的文件名,然后是 project_best_FINAL.kdenlive,但不可避免地要允许 project_FINAL-alternateVersion.kdenlive,等等。

无论是对 for 循环的更改还是编辑更改,它都会发生在我们所有人身上。这就是一个好的版本控制系统使生活更轻松的地方。

Git 快照

Git 会拍摄项目的快照,并将这些快照存储为唯一版本。

如果您在您的项目中朝着您认为错误的方向前进,您可以回滚到上一个良好版本,并沿着另一条路径继续前进。

[下载我们的 Git 速查表]

如果您正在协作,那么当有人向您发送更改时,您可以将这些更改合并到您的工作分支中,然后您的协作者可以获取项目的合并版本,并从新的当前版本继续工作。

Git 不是魔法,所以冲突确实会发生(“您更改了本书的最后一行,但我完全删除了该行;我们如何解决这个问题?”),但总的来说,Git 使您能够管理单个作品的许多潜在变体,保留所有更改的历史记录,甚至允许并行版本。

Git 分布式

在不同的机器上处理项目很复杂,因为您希望在工作时拥有项目的最新版本,进行自己的更改,并与您的协作者分享您的更改。执行此操作的默认方法往往是笨拙的在线文件共享服务或老式的电子邮件附件,这两种方法都效率低下且容易出错。

Git 专为分布式开发而设计。如果您参与一个项目,您可以克隆该项目的 Git 仓库,然后在上面工作,就好像它是唯一存在的副本一样。然后,使用几个简单的命令,您可以从其他贡献者那里拉取任何更改,您也可以将您的更改推送到其他人那里。现在,关于谁拥有项目的哪个版本,或者谁的更改存在于何处,没有混淆。所有内容都是在本地开发的,并被推送和拉取到共同的目标(或者不是,取决于项目选择如何开发)。

Git 界面

在其自然状态下,Git 是一个在 Linux 终端中运行的应用程序。然而,由于它设计良好且是开源的,世界各地的开发人员都设计了其他访问它的方式。

它是免费的,任何人都可以以 0 美元的价格获得,并且在 Linux、BSD、Illumos 和其他类 Unix 操作系统上以软件包的形式提供。它看起来像这样

$ git --version
git version 2.5.3

可能最著名的 Git 界面是基于 Web 的:像 GitHub、开源 GitLabSavannahBitBucketSourceForge 这样的网站都提供在线代码托管,以最大限度地提高开源的公共和社交方面,并以不同程度提供基于浏览器的 GUI,以最大限度地减少使用 Git 的学习曲线。这就是 GitLab 界面的样子

GitLab graphical Git interface.

此外,Git 服务或独立开发人员甚至可能拥有非基于 HTML 的自定义 Git 前端,如果您不希望浏览器永远打开,这将特别方便。最透明的集成以文件管理器支持的形式出现。KDE 文件管理器 Dolphin 可以显示目录的 Git 状态,甚至可以生成提交、推送和拉取。

Dolphin

Sparkleshare 使用 Git 作为其自身 Dropbox 风格文件共享界面的基础。

Sparkleshare screenshot

更多信息,请参阅官方 Git wiki 上列出具有 Git 图形界面的项目(长)页面。

谁应该使用 Git?

您应该!真正的问题是何时?以及用于什么?

我应该何时使用 Git,我应该用它来做什么?

要充分利用 Git,您需要比平常更多地考虑文件格式。

Git 旨在管理源代码,在大多数语言中,源代码由文本行组成。当然,Git 不知道您是向它提供源代码还是下一部伟大的美国小说,所以只要它可以分解为文本,Git 就是管理和跟踪版本的绝佳选择。

但是什么是文本?如果您在像 Libre Office 这样的办公应用程序中编写内容,那么您可能不会生成原始文本。通常在像这样的复杂应用程序周围有一个包装器,它将原始文本封装在 XML 标记中,然后再封装在 zip 容器中,以此来确保当您将该文件发送给其他人时,您的办公文件的所有资产都可用。然而,奇怪的是,您可能会认为非常复杂的东西,比如 Kdenlive 项目的保存文件,或者来自 Inkscape 的 SVG,实际上是可以轻松地由 Git 管理的原始 XML 文件。

如果您使用 Unix,您可以使用 file 命令检查文件由什么组成

$ file ~/path/to/my-file.blah
my-file.blah: ASCII text
$ file ~/path/to/different-file.kra: Zip data (MIME type "application/x-krita")

如果不确定,您可以使用 head 命令查看文件的内容

$ head ~/path/to/my-file.blah

如果您看到的大多是您可读的文本,那么它可能是一个由文本组成的文件。如果您看到的是垃圾,其中夹杂着一些熟悉的文本字符,那么它可能不是由文本组成的。

请不要误解:Git 可以管理其他格式的文件,但它将它们视为二进制大对象 (blobs)。区别在于,在文本文件中,两个 Git 快照(或我们称之为提交)可能彼此相差三行。如果您有一张照片在两个不同的提交之间被修改过,Git 如何表达这种变化?它实际上无法表达,因为照片不是由任何可以插入或删除的合理文本组成的。我希望照片编辑就像将文本从“<sky>ugly greenish-blue</sky>”更改为“<sky>blue-with-fluffy-clouds</sky>”一样简单,但事实并非如此。

人们一直都在将二进制大对象(如 PNG 图标或电子表格或流程图)签入 Git,所以如果您正在 Git 中工作,请不要害怕这样做。但要知道,对于大型文件这样做是不明智的。如果您正在处理一个既生成文本文件又生成大型二进制大对象(视频游戏中的常见场景,它具有同等数量的源代码以及图形和音频资源)的项目,那么您可以做两件事之一:要么发明您自己的解决方案,例如指向共享网络驱动器的指针,要么使用像 Joey Hess 的优秀 git annexGit-Media 项目这样的 Git 附加组件。

所以您看,Git 真的适合所有人。它是管理文件版本的好方法,它是一个强大的工具,而且它并不像最初看起来那么可怕。

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

12 条评论

您好。

感谢您的文章!

另一个 FLOSS (Affero GPLv3+) 和免费的 Git 托管软件位于 https://rocketgit.com

免责声明:我是作者。

太棒了!感谢您的推荐。我真希望在撰写本系列文章之前就知道这个。也许我可以在以后的修订中偷偷提及一下。感谢您提供一个免费且开源的托管平台。我已经注册了,并期待试用它。

回复 作者 Catalin(ux) M. BOIE (未验证)

使用像 GIT 这样的软件开发金融产品的代码是否安全?如果我们必须为 cashoverflow.in 构建一些东西

是的,当然,使用 git 开发金融软件是安全的。所涉及的任何“风险”都在于您如何管理自己的代码,当然还有服务器和客户端之间的加密(但这与 git 无关)。

显然,您不应在您的公共 git 仓库中发布私钥文件;为了保护自己免受这种情况的影响,请使用严格的 .gitignore 策略,并在每次推送之前强制进行代码审查。

.gitignore 非常简单;在此处阅读更多信息:https://git-scm.cn/docs/gitignore

强制进行代码审查和签核是您可以设置 git 钩子来完成的事情;我将在本系列的后续文章中介绍 git 钩子,所以请回来查看!

回复 作者 Avinash (未验证)

如果您不得不问这个问题,那么您绝对不应该开发任何与金融服务相关的东西。

回复 作者 Avinash (未验证)

我们都必须从某个地方开始。没有愚蠢的问题。等等。

回复 作者 imbldin (未验证)

您提到这是一个系列。您何时会发布此系列的更多内容?

我注意到大多数人在开始时都难以处理分支。了解何时、为什么以及如何分支,以及何时将分支合并回主分支。然后找到诸如主分支应该包含什么,人们应该在主分支上开发吗,应该有多少人拥有合并权限等问题的答案。

Git 很棒,但需要编写简单的教程,为新用户提供一些帮助。我已经使用 Git 大约两年了,但我觉得自己仍然是一个基本的 Git 用户,因为我合作过的每个人也都是新用户。

同意。当您与许多协作者一起处理项目时,分支是关键;但当您想在不影响您的主要(主)代码的情况下试验更改时,它在“独立”项目中也很有用。

回复 作者 coryhilliard

分支很重要!但本介绍涵盖了克隆。我将在本系列的后面(根据 fgrep,第三篇文章)介绍分支。

回复 作者 Derek (未验证)

您提到了 git annex 和 Git Media 用于大型文件。GitHub 还提供了 git lfs -- git Large File System。

我不知道这个。谢谢!

Git-annex 和 git-media 在本系列的最后一篇文章中讨论(如果我的记忆力好的话)。我没有时间审查 git-lfs,但知道它很好,我会尝试在文章中提及它。

回复 作者 Duane Murphy (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.