而不是介绍
你好!今天我们要聊的是版本控制系统,也就是Git。
Git 基础知识
Git 是我们代码的分布式版本控制系统。我们为什么需要它?分布式团队需要某种系统来管理他们的工作。需要跟踪随时间发生的变化。也就是说,我们需要能够逐步查看哪些文件已更改以及如何更改。当您调查在单个任务的上下文中发生了什么变化时,这一点尤其重要,从而可以恢复更改。安装 Git
让我们在您的计算机上安装 Java。在 Windows 上安装
像往常一样,您需要下载并运行一个 exe 文件。这里的一切都很简单:点击第一个谷歌链接,执行安装,就是这样。为此,我们将使用 Windows 提供的 bash 控制台。在 Windows 上,您需要运行 Git Bash。下面是它在“开始”菜单中的样子:

在 Linux 上安装
通常 Git 是 Linux 发行版的一部分并且已经安装,因为它是最初为 Linux 内核开发而编写的工具。但有些情况下它不是。要检查,您需要打开一个终端并输入:git --version。如果你得到一个可理解的答案,那么就不需要安装任何东西。打开终端并在 Ubuntu 上安装 Git。我在 Ubuntu 上工作,所以我可以告诉你为它写什么:sudo apt-get install git。在 macOS 上安装
在这里,您也首先需要检查 Git 是否已经存在。如果您没有它,那么最简单的获取方式就是在此处下载最新版本。如果安装了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 中的状态
Git有几个雕像需要理解和记住:- 未追踪
- 修改的
- 上演
- 坚定的
你应该怎么理解这个?
这些是适用于包含我们代码的文件的状态:- 创建但尚未添加到存储库的文件具有“未跟踪”状态。
- 当我们对已经添加到 Git 存储库的文件进行更改时,它们的状态为“已修改”。
- 在我们更改的文件中,我们选择我们需要的那些,这些类被更改为“暂存”状态。
- 提交是从处于暂存状态的准备文件创建的,并进入 Git 存储库。之后,没有文件处于“暂存”状态。但可能仍然存在状态为“已修改”的文件。

什么是提交?
提交是版本控制的主要事件。它包含自提交开始以来所做的所有更改。提交像单链表一样链接在一起。更具体地说:有一个第一次提交。当创建第二个提交时,它知道第一个之后会发生什么。并且以这种方式,可以跟踪信息。提交也有自己的信息,即所谓的元数据:- 提交的唯一标识符,可用于查找它
- 提交作者的名字,创建者
- 创建提交的日期
- 描述提交期间所做的事情的注释

什么是分支?
分支是指向某个提交的指针。因为提交知道哪个提交在它之前,所以当一个分支指向一个提交时,所有那些先前的提交也适用于它。因此,我们可以说您可以拥有任意数量的分支指向同一个提交。工作发生在分支中,因此当创建新提交时,分支会将其指针移至最近的提交。开始使用 Git
您可以单独使用本地存储库,也可以使用远程存储库。要练习所需的命令,您可以将自己限制在本地存储库中。它只将所有项目的信息存储在本地的 .git 文件夹中。如果我们谈论的是远程存储库,那么所有信息都存储在远程服务器的某个位置:只有项目的副本存储在本地。可以将对本地副本所做的更改推送 (git push) 到远程存储库。在这里和下面的讨论中,我们讨论的是在控制台中使用 Git。当然,您可以使用某种基于 GUI 的解决方案(例如 IntelliJ IDEA),但首先您应该弄清楚正在执行的命令及其含义。在本地存储库中使用 Git
接下来,我建议您按照阅读本文时执行的所有步骤进行操作。这将提高您对材料的理解和掌握。嗯,祝你胃口好!:) 要创建本地存储库,您需要编写:
git init

git status

- git add -A — 将所有文件添加到“暂存”状态
- 混帐添加。— 添加此文件夹和所有子文件夹中的所有文件。本质上,这与上一个相同
- git add <file name> — 添加特定文件。在这里您可以使用正则表达式根据某种模式添加文件。例如,git add *.java:这意味着您只想添加扩展名为 java 的文件。
git add *.txt
要检查状态,我们使用我们已知的命令:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

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

git add GitTest.java
git commit -m "added GitTest.java"
git status

使用 .gitignore
显然,我们只想在存储库中单独保留源代码,而不是其他任何东西。那还能有什么呢?至少,由开发环境生成的编译类和/或文件。要告诉 Git 忽略它们,我们需要创建一个特殊文件。这样做:在项目的根目录中创建一个名为 .gitignore 的文件。此文件中的每一行代表一个要忽略的模式。在此示例中,.gitignore 文件将如下所示:
```
*.class
target/
*.iml
.idea/
```
让我们来看看:
- 第一行是忽略所有扩展名为.class的文件
- 第二行是忽略“目标”文件夹及其包含的所有内容
- 第三行是忽略所有扩展名为.iml的文件
- 第四行忽略.idea文件夹
git status


git add .gitignore
git commit -m "added .gitignore file"
现在是关键时刻:我们有一个“未跟踪”的已编译类 GitTest.class,我们不想将其添加到 Git 存储库中。现在我们应该看到 .gitignore 文件的效果:
git status

使用分支机构等
自然地,只在一个分支工作对于孤独的开发人员来说是不方便的,而当团队中有多个人时,这是不可能的。这就是为什么我们有分支机构。正如我之前所说,分支只是指向提交的可移动指针。在这一部分中,我们将探索在不同的分支中工作:如何将一个分支的更改合并到另一个分支,可能会出现什么冲突,等等。要查看存储库中所有分支的列表并了解您所在的分支,您需要编写:
git branch -a

- 根据我们所在的分支创建一个新分支(99% 的情况)
- 根据特定提交创建分支(1% 的案例)
让我们根据特定的提交创建一个分支
我们将依赖提交的唯一标识符。为了找到它,我们写:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
创建一个分支时,只有来自 master 分支的前两个提交。为了验证这一点,我们首先确保切换到不同的分支并查看那里的提交数量:
git status
git log

git branch -a

让我们在当前的基础上创建一个分支
创建分支的第二种方法是从另一个分支创建它。我想在 master 分支的基础上创建一个分支。首先,我需要切换到它,下一步是创建一个新的。让我们来看看:- git checkout master——切换到master分支
- git status — 验证我们实际上在 master 分支中

git checkout -b feature/update-txt-files

解决冲突
在我们探讨什么是冲突之前,我们需要讨论将一个分支合并到另一个分支。这张图片描绘了将一个分支合并到另一个分支的过程:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
到目前为止一切都很清楚,是吗?让情况复杂化:现在假设您需要再次更改 txt 文件。但是现在这个文件也将在 master 分支中被更改。换句话说,它会平行变化。当我们想将我们的新代码合并到 master 分支时,Git 将无法弄清楚该怎么做。我们走吧!我们将基于 master 创建一个新分支,对 text_resource.txt 进行更改,并为此工作创建一个提交:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
现在最有趣的一点是:我们需要将更改从 feature/add-header 分支合并到 master。我们在master分支,所以只需要写:
git merge feature/add-header
但是结果会在 test_resource.txt 文件中发生冲突:

- 主分支中这一行的更改位于“<<<<<<< HEAD”和“=======”之间。
- feature/add-header 分支中的更改位于“=======”和“>>>>>>> feature/add-header”之间。

git status

git add *.txt

git commit

使用远程存储库
最后一步是找出使用远程存储库所需的更多命令。正如我所说,远程存储库是存储存储库的地方,您可以从中克隆它。有哪些远程存储库?例子:-
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 add test_resource.txt
git commit -m "prepared txt for pushing"
将其推送到远程存储库的命令是:
git push

有用的链接
- 官方Git 文档。我推荐它作为参考。
GO TO FULL VERSION