做者:Bob Ziroll前端
翻译:疯狂的技术宅git
原文:www.freecodecamp.org/news/git-th…github
未经容许严禁转载前端工程化
Git 是全部开发人员工具箱中的重要工具。api
例如就在前几天,我大约只用了 20 分钟就解决了一个已经投入生产环境的重大问题(彻底是个人错)。若是没有 Git,这可能须要几天的时间来修复。bash
所以,让咱们花些时间真正了解 Git 最基本的功能:准备和提交。markdown
注意:本文不包含与 GitHub 相关的任何内容,它是第三方在线Web服务,容许你在云端备份用 Git 保存的代码。 Git 是本地的,GitHub 是一个基于云的应用,它们是两个彻底不一样的东西,尽管目的相同。app
若是你年龄够大,可能还记得 Google Drive/Docs/Sheets 以前的世界,你可能会这样作:编辑器
处理群组项目会致使多人尝试对原始文档的多个副本进行编辑,从而致使许多重复。若是两我的同时进行编辑,则必须有人手动完成全部操做并将这些编辑组合在一块儿。ide
没有什么好办法来控制项目的不一样版本。这就像是在狂野的西部同样。🤠+😢
Git解决了这个问题💡
也许你已经在本身的项目中增长了一个新功能,破坏了之前工做得很好的东西,但不知道在哪里找到错误或如何解决它。你已经在编辑器中关闭了文件,所以就不能再使用“撤消”了。
Git解决了这个问题💡
Git 的核心功能是在文件中建立保存点。我以为这些保存点就像在视频游戏中同样,即便你在那以后搞砸了,老是能够回来再试一次而没必要从新开始。
Git 还有不少使人敬畏的方面,可是它的所有内容的核心是:在代码中建立保存点,若是须要,能够在以后返回。
Git 的这个核心功能(在你的项目中建立保存点)分为两个阶段:
这两个阶段,好像你正在建立一个老式的相册,一个用于打印照片并将其放入真正的相册。若是你由于太年轻没有见过的话,就是这样的:
首先,你用相机拍了一堆照片。拍摄照片并不会影响相册,由于你始终能够选择要包含在相册中的照片。你会获得拍摄得很差的照片,并在必要时从新拍摄。
下一步,你能够选择要在相册中保存哪一张照片。想象一下,你已将它们打印出来,而后将它们放置在在相册中的空白页面旁边。你正在建立一种“临时区域”,你还没有将照片粘贴到相册中的页面上,可是你准备立刻就这样作。
最后,一旦你准备好了,就把你的照片粘贴到页面上,并将它们粘合在一块儿。一个好的相册要包含这些照片中事件的某种描述或标题。
完成操做后,你能够随时回到相册中的这个页面,回忆你当时生活中的状况(不管好坏)。
让咱们将这个类比与 Git 联系起来。
让咱们逐一解释w。
拍摄照片就像对项目进行更改:编写新代码、添加图像、删除旧文件等等。你正在建立最终要在 Git 提交中保存的内容(“保存点”)。它仍然是一项正在进行中的工做,你能够随时编写、重写或删除任何你想要的内容,而无需“永久”保存它们。
Git 目前正在作的惟一事情是观察自上次提交(保存)代码以来是否有什么变化。若是你添加一行代码而后再删它,Git 将会认为总体没有发生任何变化。若是你在几十个文件中编写 500 行代码,Git 可以确切地知道都有哪些代码行被添加到哪些文件中,并在其内存中跟踪这些变化。在你告诉它以前,它不会对变动的时间表作出任何提交,但它会密切关注你的操做。
注意:请记住,如今咱们指的是一个与保存更改到硬盘上彻底不一样的过程。现代文本编辑器能够每隔一秒左右保存你的代码,但这不是咱们在这里所提到的。当我提到使用 Git “保存”时,个人意思是建立一个提交,将你的更改保存到时间轴。
在 Git 中,这是在代码中建立新提交以前发生的阶段。此过程称为“添加到暂存区域”。添加到暂存区域不会建立提交,它只是准备提交。
将一些文件添加到暂存区域后,你可能会发现仍要作一些更改。没问题!因为此时 Git 还没有实际保存(提交)任何内容,你能够简单地进行所需的新更改,而后将这些更改添加到临时区域,即便这些更改发生在与先前添加的文件相同的文件中。这就像拍摄一些你决定要添加到相册页面并打进行印的新照片。
这是建立“保存点”(提交)的第二个(也是最后一个)阶段。建立提交时有一个主要要求:你必须包含信息。在相册中,你能够撰写标题或信息,以便向将来的观看者提供关于这些照片对你意味着什么的信息。在 Git 中,你须要编写一条消息来描述你要保存到代码库中的更改。
若是你写了一个糟糕的提交信息,那么回顾你的代码历史对包括你本身在内的任何人都没有帮助。 (若是你不知道这些变化是什么,那么“作出一些改变”的消息有什么用呢?想象一下,在相册中找到一个页面,上面写着“这里有一些人......”)始终使用良好的描述性提交消息来描述你添加到代码库中的功能或修复。
例子已经足够了,如今让咱们开始吧!
首先,你可能已经安装了Git。打开终端或命令提示符并尝试运行 git --version
。若是它显示了版本号,请跳事后面这一步。若是它提示不知道你的 git
是什么意思,你须要安装它。 请按照如下说明为你的操做系统安装。
Git 只知道跟踪你设置为 Git 存储库的项目。在上面的比喻中,若是咱们首先没有相册,就没法将照片粘贴到相册中。
当你准备开始一个新项目时,应该执行的第一步(建立项目文件夹以后)是运行:
git init
复制代码
这容许 Git 当即开始跟踪你对项目所作的任何更改。在底层它会建立一个新的隐藏 .git
文件夹,其中的全部内容都须要跟踪你的更改。你几乎不须要进入这个文件夹,除非你正在设置一些高级的东西。
对于下面的教程,我将尽量保持简单 —— 一个项目文件夹,它是一个带有单个名为 README.md
markdown 文件的 Git 仓库。你能够想象我对 README 文件所作的每一个更改都表明了一些新功能或者几10、几百行新代码。👌🏻😉
git status
我想将此视为“理智检查”,用来帮助我了解 Git 目前正在进行的工做。 (例如它注意到了哪些变化,是否一切正常等等)
它告诉我正处在主分支上(我会另外再写一篇关于分支的文章),我以前没有提交过,并且如今没有任何东西须要提交。 (意思是,Git 没有看到任何须要要保存的文件夹)。
如今我将添加 README.md 文件并再次运行 git status:
Git 看到我在项目中添加了一个新文件。酷!如今这个使人敬畏的新项目正在进行中,让咱们建立一个保存点。
git add
git add
命令是把东西放在临时区域的方式。就像打印咱们拍摄的照片同样,而后将它们粘贴在咱们的相册页面中。可是咱们须要告诉 Git 咱们想要添加到暂存区域。 (若是只输入 git add
会提示你没有指定任何东西,因此不会添加内容。)我将用 Git 添加文件的文件名:
git add README.md
git status
复制代码
再次使用 git status
,显示在暂存区域有一个新文件,但它如今变成了绿色!这是提示你它已经被添加到临时区域的简单方法。
基本上 git add README.md
告诉 Git “我但愿包括自上次提交后包含在即将提交中的 README.md 所作的全部更改。”
可是,将文件一次一个地添加到暂存区域是很麻烦的,特别若是有许多任务须要你去处理不少文件的话。你大可没必要记住并指定正在处理的每一个文件,而是可使用“一网打尽”的方式,它会自动添加你对暂存区域进行更改的每一个文件。个人首选方法是:
git add -A
复制代码
(-A
标志表示将全部带有更改标记的文件添加到暂存区域)。
注意:你常常会看到人们用
git add .
来实现将全部更改添加到暂存区域。虽然这有效,但它要求你位于项目根目录中以确保获取全部更改。 (.
是“当前目录”的简写)。所以,若是你cd
进入嵌套目录但对该目录外的文件进行了更改并尝试使用git add .
,那么在尝试将这些文件添加到暂存区域时,将会错过这些更改的文件。可是不管你目前在终端中的哪一个位置,git add -A
都适用于整个项目。
git commit
一旦你准备好建立一个提交,就能够用 git commit
命令。可是,还记得你是如何添加备注的吗?若是你只是运行 git commit
并按回车键,将会弹出一个基于终端的编辑器,如 Vi 或 Nano,以填写该提交的信息。
你也能够用 -m
标志,而后在引号中使用字符串消息,使你的 git commit
与消息保持一致。像这样:
git commit -m "Added some really important information to the README"
复制代码
假设在提交以前其余全部内容都已就绪,如今就已经使用 Git 成功提交了代码!如今你有了一个检查点,若是从这里出现问题,你能够随时返回。
让咱们以 gif 的形式再看一下这个过程:
注意:gif 使用
git add
,但我认为应该用git add -A
更精确。此外,要使用更好的提交信息!请原谅个人错误
git log
你能够经过运行 git log
来查看提交历史记录。使用箭头键,你能够及时向前和向后滚动来检查提交日期、消息和做者(提交者)。随之一块儿出现的是“提交哈希”,其实质上是提交的惟一ID,能够在之后须要时用于引用它。
“因此你一直在谈论 Git 如何能让我及时向后跳跃......我该怎么作呢?”
git checkout
术语 “checkout” 是指从一个提交切换到另外一个提交的过程。还记得每一个提交收到的惟一ID(“哈希”)吗?我能够回顾一下个人提交历史,选择其中一个惟一的提交哈希值,而后用 git checkout
命令查看它。若是我想看的提交有一个 a2
的哈希值(完整它们比这长得多 - 就像 0c9b8f7c23dea4cf0a0285f14211124b6d5891e9
),能够运行:
git checkout a2
复制代码
忽然之间,个人整个代码库的时间线缩短了,一切都会像我提交后的那样。 (这可能很吓人,由于看起来你可能已经丢失了自提交以来的全部更新,但不要担忧!他们还在!)
以 gif 形式说明:
注意,第 3 次提交及其中的更改仍然彻底存在。能够用 git checkout a3
或(更常见的)git checkout master
返回到该提交,以恢复全部更改。
如今你回来了,你会看到来自 Git 的消息。就像是:
Note: checking out 'a2'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at a2 Another Message
复制代码
"Detached HEAD" 听起来比如今更可怕。🤢
在这种状态下,你再也不使用 master
分支,也就是说你能够在这里进行实验性更改甚至建立新的提交,全部这些操做都不会丢失你在 master
分支上的代码(上面的例子提交哈希 a3
)。
一样,我计划在另外一个时间覆盖分支,但这只是为了说明 Git 在保存多个版本的代码时是一个很是强大的工具。
关于 Git 你能够学到一百万个东西,但若是不了解核心概念,它总会显得有点神秘。
可是,若是你真的想学习并熟悉 Git,那么你最好的去实操并进行实验。
这意味着你要作的不只仅是阅读文章。因此请在一个空文件夹中建立一个新的 Git 存储库,开始添加文件,用 git status
和 git log
来看看是什么样的,并考虑下载 Sourcetree 以便在你搞乱项目的时候能够经过可视化来观察你存储库的状态。