JavaRush /Java 博客 /Random-ZH /Git 入门:初学者详细指南
Roman Beekeeper
第 35 级

Git 入门:初学者详细指南

已在 Random-ZH 群组中发布

而不是介绍

你好,未来的高级软件工程师。 Git 入门:初学者详细指南 - 1今天我们将讨论版本控制系统,即 Git(读作 GIT,而不是 JIT,从英语语法来看)。是的,是的,我知道还有Mercurial、SVN……但是说实话:他们的时代已经过去了,我不会在他们身上浪费你的宝贵时间。为了让你了解了解 Git 在我们这个时代的重要性,我会这样说:如果不了解/不理解这一点,你在编程方面就一事无成。但美妙之处在于,要持续工作,您无需将所有命令和可能性都保留在脑海中。您需要了解一组命令来帮助您了解正在发生的一切。

Git 基础知识

Git 是我们代码的分布式版本控制系统。为什么我们需要它?分布式团队需要某种工作管理系统。需要跟踪随着时间的推移发生的变化。也就是说,我们一步步查看哪些文件已更改以及如何更改。当您分析一项任务中所做的事情时,这一点尤其重要:这使得可以返回。让我们想象一种情况:有一个工作代码,里面的一切都很好,但我们决定改进一些东西,在这里调整它,在那里调整它。一切都很好,但这一改进破坏了一半的功能,使其无法工作。那么,下一步是什么?如果没有梵歌,人们将不得不坐上几个小时并记住一切最初的样子。所以我们只需回滚到提交即可。或者如果有两个开发人员同时更改代码怎么办?如果没有 Git,它看起来像这样:他们从原始代码中复制代码并执行他们需要执行的操作。这一刻到来了,两人都想将他们的更改添加到主文件夹中。在这种情况下该怎么办?...我什至不敢估计做这项工作的时间。如果使用Git就完全不会出现这样的问题。

安装Git

让我们在您的计算机上安装 Git。我知道每个人都有不同的操作系统,所以我将尝试描述几种情况。

Windows 安装

像往常一样,您需要下载 exe 文件并运行它。这里一切都很简单:点击第一个 Google 链接,安装即可。对于工作,我们将使用他们提供的 bash 控制台。要在 Windows 上工作,您需要运行 Git Bash。这就是开始菜单中的样子: Git 入门:初学者详细指南 - 2这已经是一个可以在其中工作的控制台。为了不每次都去项目所在的文件夹中打开git,可以在文件夹中右键单击,打开控制台,其中包含我们需要的路径: Git 入门:初学者详细指南 - 3

Linux 安装

通常 git 已经安装并包含在 Linux 发行版中,因为它是最初为开发 Linux 内核而编写的工具。但有些情况下它并不存在。要检查这一点,您需要打开终端并输入:git --version。如果有明确的答案,则无需安装任何东西。打开终端并安装。我在 Ubuntu 上工作,所以我可以告诉你要为其编写什么:sudo apt-get install git。就是这样:现在您可以在任何终端中使用 Git。

在 macOS 上安装

在这里,首先您也需要检查 Git 是否已经存在(参见上文,如在 Linux 上)。如果没有,最简单的方法是下载最新版本。如果安装了XCode,那么Git肯定会自动安装。

Git 设置

git 有一个用户设置,可以从中执行工作。这是合理且必要的事情,因为当创建提交时,Git 会在 Author 字段中准确获取此信息。要为所有项目设置用户名和密码,需要输入以下命令:

git config --global user.name ”Ivan Ivanov”
git config --global user.email ivan.ivanov@gmail.com
如果需要更改特定项目(例如个人项目)的作者,您可以删除 --global,这样就可以了:

git config user.name ”Ivan Ivanov”
git config user.email ivan.ivanov@gmail.com

一点理论...

为了紧扣主题,建议在您的消息中添加一些新的单词和动作……否则就没什么可谈的了。当然,这是一些行话和英文的副本,所以我会用英文添加含义。有哪些言语和动作?
  • git 存储库;
  • 提交(提交);
  • 分支;
  • 合并;
  • 冲突;
  • 拉;
  • 推;
  • 如何忽略某些文件(.gitignore)。
等等。

Git 中的状态

《梵歌》有几个需要理解和记住的状态:
  • 未追踪;
  • 修改的;
  • 准备好的(上演的);
  • 坚定的。

这是什么意思?

这些是我们代码中的文件所在的状态。也就是说,他们的人生轨迹通常是这样的:
  1. 创建但未添加到存储库的文件将处于未跟踪状态。
  2. 我们对已添加到 Git 存储库的文件进行更改 - 它们处于已修改状态。
  3. 从我们已更改的文件中,我们仅选择那些(或全部)我们需要的(例如,我们不需要编译的类),并且这些发生更改的类落入暂存状态。
  4. 提交是根据暂存状态中准备好的文件创建的,并进入 Git 存储库。此后,暂存状态为空。但修改后可能仍然包含一些东西。
看起来像这样(图片来自官方文档,所以你可以相信它)): Git 入门:初学者详细指南 - 4

什么是提交

提交是版本控制中的主要对象。它包含自该提交以来的所有更改。提交像单链表一样相互链接。即:有第一次提交。当创建第二个提交时,它(第二个)知道它是在第一个提交之后发生的。这样您就可以跟踪信息。提交也有自己的信息,即所谓的元数据:
  • 您可以通过它找到它的唯一提交标识符;
  • 创建它的提交作者的姓名;
  • 提交创建日期;
  • 描述此提交期间所做操作的评论。
它看起来是这样的: Git 入门:初学者详细指南 - 5

什么是分支机构

Git 入门:初学者详细指南 - 6分支是指向提交的指针。由于提交知道哪个提交位于它之前,因此当分支指向某个提交时,所有先前的提交也会引用它。基于此,我们可以说可以有尽可能多的分支指向同一个提交。工作发生在分支上,因此当创建新的提交时,分支会将其指针移动到较新的提交。

Git 入门

您只能使用本地存储库,也可以使用远程存储库。要计算出必要的命令,您只能使用本地存储库。它将所有信息仅存储在项目本地的 .git 文件夹中。如果我们谈论远程,那么所有信息都存储在远程服务器上的某个位置:只有项目的副本存储在本地,对其进行的更改可以推送(git推送)到远程存储库。在这里以及进一步我们将讨论在控制台中使用 git。当然,您可以使用一些图形解决方案(例如,在 Intellij IDEA 中),但首先您需要弄清楚正在发生什么命令以及它们的含义。

在本地存储库中使用 Git

接下来,我建议您按照我在阅读本文时执行的所有步骤进行操作。这将提高您对材料的理解和记忆。所以祝你胃口好:) 要创建本地存储库,您需要编写:

git init
Git 入门:初学者详细指南 - 7这将在控制台所在的位置创建一个 .git 文件夹。.git 是一个存储有关 Git 存储库的所有信息的文件夹。无需删除它;) 接下来,文件将添加到此项目中,并且其状态变为“Untracked”。要查看当前的工作状态,请写入:

git status
Git 入门:初学者详细指南 - 8我们位于主分支中,在我们移动到另一个分支之前,一切都将保持原样。这样您就可以看到哪些文件已更改但尚未添加到暂存状态。要将它们添加到暂存状态,您需要编写 git add。这里可能有多种选择,例如:
  • git add -A - 添加暂存状态的所有文件;
  • git 添加 . — 添加此文件夹中的所有文件以及所有内部文件。与上一篇基本相同;
  • git add <filename> - 仅添加特定文件。在这里您可以使用正则表达式根据某种模式进行添加。例如 git add *.java :这意味着你只需要添加带有 java 扩展名的文件。
显然前两个选项很简单,但是加上它会更有趣,所以我们写:

git add *.txt
要检查状态,我们使用我们已经知道的命令:

git status
Git 入门:初学者详细指南 - 9由此我们可以看到正则表达式工作正常,现在test_resource.txt处于暂存状态。最后,最后一个阶段(对于本地存储库,对于远程存储库,还会有一个;)) - 提交并创建一个新的提交:

git commit -m “all txt files were added to the project”
Git 入门:初学者详细指南 - 10接下来,有一个很棒的命令可以查看分支的提交历史记录。让我们使用它:

git log
Git 入门:初学者详细指南 - 11在这里您已经可以看到我们的第一个提交已经与我们传输的文本一起出现。理解我们传递的文本必须尽可能准确地定义这次提交期间所做的事情非常重要。这在未来会有很多帮助。尚未入睡的好奇读者可能会说:GitTest.java 文件怎么了?现在我们会发现,用于此目的:

git status
Git 入门:初学者详细指南 - 12正如我们所看到的,它仍然处于未跟踪状态并且正在伺机而动。或者也许我们根本不想将其添加到项目中?有时候这种情况会发生。接下来,为了使它更有趣,让我们尝试更改文本文件 test_resource.txt。让我们在其中添加一些文本并检查状态:

git status
Git 入门:初学者详细指南 - 13在这里你可以清楚地看到两种状态之间的区别——未跟踪和修改。GitTest.java 处于未跟踪状态,test_resource.txt 处于已修改状态。现在已经有处于修改状态的文件,我们可以查看对它们所做的更改。这可以使用以下命令来完成:

git diff
Git 入门:初学者详细指南 - 14也就是说,您可以在这里清楚地看到我将 hello world! 添加到我们的文本文件中。将更改添加到文本文件并提交:

git add test_resource.txt
git commit -m “added hello word! to test_resource.txt”
要查看所有提交,请编写:

git log
Git 入门:初学者详细指南 - 15正如您所看到的,已经有两个提交。以同样的方式我们添加GitTest.java。现在没有评论,只有命令:

git add GitTest.java
git commit -m “added GitTest.java”
git status
Начало работы с Git: подробный гайд для новичков - 16

使用 .gitignore

很明显,我们只想在存储库中存储源代码,而不存储其他任何内容。还能是什么?至少,创建开发环境的编译类和/或文件。为了让 Git 忽略它们,需要创建一个特殊文件。我们这样做:我们在项目的根目录中创建一个名为 .gitignore 的文件,在这个文件中,每一行都是一个要忽略的模式。在此示例中,gitignore 将如下所示:

```
*.class
target/
*.iml
.idea/
```
现在让我们看看:
  • 第一行是忽略所有带有 .class 扩展名的文件;
  • 第二行是忽略目标文件夹及其包含的所有内容;
  • 第三行是忽略所有扩展名为.iml的文件;
  • 第四行是忽略.idea文件夹。
让我们通过一个例子来尝试一下。要了解这是如何工作的,让我们将已编译的 GitTest.class 类添加到项目中并查看项目状态:

git status
Начало работы с Git: подробный гайд для новичков - 17显然,我们不想意外地(如果我们使用 git add -A)将已编译的类添加到项目中。为此,创建一个 .gitignore 文件并添加前面描述的所有内容: Начало работы с Git: подробный гайд для новичков - 18现在让我们使用新的提交将 gitignore 添加到项目中:

git add .gitignore
git commit -m “added .gitignore file”
现在是关键时刻:我们有一个已编译的 GitTest.class 类,处于未跟踪状态,我们不想将其添加到 Git 存储库中。这是 gitignore 应该工作的地方:

git status
Начало работы с Git: подробный гайд для новичков - 19一切都清楚了)Git 忽略+1)

与分支机构等合作

当然,一个人在一个分支机构工作很不方便,而且当团队中有多个人时也是不可能的。为此有一个分支。正如我之前所说,分支只是一个指向提交的移动指针。在这一部分中,我们将研究不同分支中的工作:如何将更改从一个分支合并到另一个分支、可能会出现哪些冲突等等。要查看存储库中所有分支的列表并了解您所在的分支,您需要编写:

git branch -a
Начало работы с Git: подробный гайд для новичков - 20你可以看到我们只有一个主分支,它前面的星号表示我们在它上面。顺便说一句,要找出我们所在的分支,我们还可以使用状态检查(git status)。接下来,有几个创建分支的选项(也许还有更多,我使用这些):
  • 根据我们现有的分支创建一个新分支(99% 的情况);
  • 根据特定提交 (1%) 创建分支。

根据特定提交创建分支

我们将依赖唯一的提交标识符。为了找到它,我们写:

git log
Начало работы с Git: подробный гайд для новичков - 21我用注释“added hello world...”突出显示了该提交。它有一个唯一的标识符 - “6c44e53d06228f888f2f454d3cb8c1c976dd73f8”。我想从这次提交开始创建一个开发分支。为此我会写:

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
创建的分支仅包含主分支的前两次提交。为了测试这一点,我们首先确保我们已移动到另一个分支并查看其提交数量:

git status
git log
Начало работы с Git: подробный гайд для новичков - 22这是真的:事实证明我们有两个提交。顺便说一句,一个有趣的点:这个分支中还没有 .gitignore 文件,所以我们编译的文件(GitTest.class)现在以未跟踪状态突出显示。现在我们可以通过编写以下内容再次修改我们的分支:

git branch -a
Начало работы с Git: подробный гайд для новичков - 23可以看到有两个分支——master 和development——现在我们正在进行development。

在当前分支的基础上创建一个分支

创建分支的第二种方法是在另一个分支上构建。我想在master分支的基础上创建一个分支,所以需要先切换到master分支,下一步就是创建一个新的分支。我们看看吧:
  • git checkout master - 移动到 master 分支;
  • git status - 检查它是否在主服务器上。
Начало работы с Git: подробный гайд для новичков - 24在这里你可以看到我们已经转移到了master分支,gitignore已经在这里工作了,并且编译后的类不再显示为未跟踪。现在我们在master分支的基础上创建一个新的分支:

git checkout -b feature/update-txt-files
Начало работы с Git: подробный гайд для новичков - 25如果您怀疑该分支与 master 分支不同,您可以通过编写 git log 并查看所有提交来轻松检查这一点。应该有四个。

解决冲突

在我们了解什么是冲突之前,我们需要讨论将一个分支合并到另一个分支。这张图可以展示一个分支合并到另一个分支时的过程: Начало работы с Git: подробный гайд для новичков - 26即有一个主分支。在某一时刻,会从它创建一个辅助的,并在其中发生变化。工作完成后,您需要将一个分支合并到另一个分支。各种功能我就不多描述了:我只想传达本文框架内的理解,具体细节大家需要的话自行了解。因此,在我们的示例中,我们创建了 feature/update-txt-files 分支。由于分支名称中已写明,我们将更新文本。 Начало работы с Git: подробный гайд для новичков - 27现在您需要为此创建一个新的提交:

git add *.txt 
git commit -m “updated txt files”
git log
Начало работы с Git: подробный гайд для новичков - 28现在,如果我们想将 feature/update-txt-files 分支合并到 master 中,我们需要进入 master 并编写 git merge feature/update-txt-files:

git checkout master
git merge feature/update-txt-files
git log
Начало работы с Git: подробный гайд для новичков - 29因此,现在 master 分支也有一个提交被添加到 feature/update-txt-files 中。添加此功能是为了让您可以删除功能分支。为此,我们写:

git branch -D feature/update-txt-files
到目前为止已经很清楚了,对吧?让情况变得复杂一些:现在假设我们需要再次更改 txt 文件。但现在这个文件也会在向导中被更改。也就是说,它会并行改变,当我们想要将新代码合并到 master 分支时,Git 将无法理解需要做什么。去!我们基于 master 创建一个新分支,对 text_resource.txt 进行更改并为此创建一个提交:

git checkout -b feature/add-header
... делаем изменения в файле
Начало работы с Git: подробный гайд для новичков - 30

git add *.txt
git commit -m “added header to txt”
Начало работы с Git: подробный гайд для новичков - 31转到 master 分支,并在与功能分支相同的行上更新此文本文件:

git checkout master
… обновor test_resource.txt
Начало работы с Git: подробный гайд для новичков - 32

git add test_resource.txt
git commit -m “added master header to txt”
现在最有趣的时刻是:您需要将功能/添加标题分支的更改合并到主分支。我们在 master 分支上,所以我们需要做的就是编写:

git merge feature/add-header
但是我们会得到 test_resource.txt 文件中存在冲突的结果: Начало работы с Git: подробный гайд для новичков - 33这里我们可以看到,Git 无法独立决定如何合并这段代码,并表示我们必须先解决冲突,然后才进行提交。好吧,让我们在文本编辑器中打开包含冲突的文件并查看:Начало работы с Git: подробный гайд для новичков - 34要了解 git 在这里做了什么,您需要记住我们在哪里编写的内容并进行比较:
  1. “<<<<<<< HEAD” 和 “=======” 之间是 master 分支中这一行的主要更改。
  2. 在“=======”和“>>>>>>>> feature/add-header”之间,feature/add-header 分支中存在一些更改。
因此,Git 表明此时他无法弄清楚如何合并该文件,因此将此部分分为来自不同分支的两部分,并建议我们自己决定。好吧,凭着强烈的意志,我决定删除所有内容,只保留标题一词: Начало работы с Git: подробный гайд для новичков - 35让我们看看更改的状态,描述会略有不同。不会有修改状态,而是Unmerged。所以我们可以安全地添加第五个状态......但我认为这是不必要的,让我们看看:

git status
Начало работы с Git: подробный гайд для новичков - 36我们确信这是一个不同寻常的案例。我们继续:

git add *.txt
Начало работы с Git: подробный гайд для новичков - 37在描述中你会注意到他们只建议编写 git commit。我们听并写:

git commit
Начало работы с Git: подробный гайд для новичков - 38就是这样:我们就是这样做的 - 我们解决了控制台中的冲突。当然,在开发环境中,您可以更轻松地做到这一点,例如,在 Intellij IDEA 中,一切都设置得很好,您可以在其中执行所有必要的操作。但是开发环境在幕后做了很多事情,我们常常不明白那里到底发生了什么。当没有理解时,就会出现问题。

使用远程存储库

最后一步是了解使用远程存储库所需的更多命令。正如我已经说过的,远程存储库是存储存储库并且可以从其中克隆它的地方。有哪些类型的远程存储库?有很多例子:
  • GitHub是最大的存储库和协作开发存储库。我在之前的文章中已经描述过。
    订阅我的 Github 帐户。我经常在那里展示我在工作期间研究的领域的作品。

  • GitLab是一个基于Web 的开源DevOps生命周期工具,它为Git提供代码存储库管理系统,具有自己的 wiki、问题跟踪系统、CI/CD 管道和其他功能。 微软收购 GitHub 的消息传出后,一些开发者在 GitLab 重复了他们的工作。

  • BitBucket 是一个基于 Mercurial 和 Git 版本控制系统的用于托管项目及其联合开发的 Web 服务。曾经它比 GitHub 有一大优势,因为它拥有免费的私有存储库。去年,GitHub 也将这一功能免费提供给所有人。

  • 等等…

使用远程存储库时需要做的第一件事是将项目克隆到本地存储库中。对于这种情况,我导出了我们在本地制作的项目,现在每个人都可以通过编写以下内容来自己克隆它:
git clone https://github.com/romankh3/git-demo
现在本地已经有了该项目的完整副本。为了确保项目的最新副本位于本地,正如他们所说,您需要通过编写以下内容转储数据:

git pull
Начало работы с Git: подробный гайд для новичков - 39在我们的例子中,现在远程没有任何改变,所以答案是:已经是最新的。但是,如果我在远程存储库中进行一些更改,则本地存储库将在我们拉取它们后更新。最后,最后一个命令是将数据推送到远程存储库。当我们在本地做了一些事情并想将其传输到远程存储库时,我们必须首先在本地创建一个新的提交。为此,让我们在文本文件中添加其他内容: Начало работы с Git: подробный гайд для новичков - 40现在这对我们来说是很常见的事情 - 我们为此创建一个提交:

git add test_resource.txt
git commit -m “prepated txt for pushing”
现在将其推送到远程存储库的命令:

git push
Начало работы с Git: подробный гайд для новичков - 41这就是我想告诉你的。感谢您的关注。订阅我的 GitHub 帐户,我在其中发布了我在工作中学习和使用的不同很酷的示例项目。

有用的链接

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION