Linux 上的 Git 入门教程Linux 上的 Git 入门教程Linux 上的 Git 入门教程Linux 上的 Git 入门教程
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 上的 Git 入门教程

发表 admin at 2025年2月28日
类别
  • 未分类
标签

Git 毫无疑问是世界上最常用的版本控制系统。该软件是开源的,在 GPLv2 许可下发布,由 Linux 之父 Linus Torvalds 创建。在本教程中我们学习 通过其使用背后的基本概念,我们了解如何创建或克隆 git 存储库以及如何执行 git 工作流程中涉及的基本操作。

在本教程中您将学习:

  • 基本的 git 概念

  • 如何创建 git 存储库

  • 如何克隆 git 存储库

  • 如何将文件内容添加到存储库索引

  • 如何创建提交

  • 如何将更改推送到远程存储库

  • 如何从远程存储库中提取更改

Linux 上的 Git 入门教程

使用的软件要求和约定

基本的 git 概念

在我们开始学习将在工作流程中使用的基本 git 命令之前,我们应该澄清本教程中将重复出现的一些关键概念。在下表中,您可以看到一些 git 术语关键字及其含义:

Term Definition
index The “staging” area of a repository. Changes we include with the add command are “stored” here. When we create a commit, it is the index content that is included
branch An isolated line of development which spawns from a certain point of its “parent”
commit An operation which consists into integrating the changes stored in the index of a repository into the repository history
HEAD A reference to the last commit of a branch
working tree The directory associated with our repository; usually, but not necessarily, the one containing the .git subdirectory
checkout The act of switching between different states of a repository, represented by branches or commits

创建 git 存储库

让我们从头开始。假设我们想要创建一个新的本地 git 存储库。我们怎样才能做到呢?让我们完成此任务的 git 命令是 init:用它,我们创建一个空存储库或重新初始化一个 现有的一个。假设我们想在名为“linuxconfig”的目录中创建一个存储库,我们将运行:

$ git init linuxconfig

在上面的示例中,我们提供了项目目录的路径作为命令的参数。当我们这样做时,如果该目录尚不存在,则会创建该目录。将目录路径作为参数传递给命令是可选的:如果省略,存储库将在当前工作目录中初始化。

如果上面的命令成功,则会在指定路径中创建一个 .git 子目录:这是保存 git 所需的所有文件的位置:

$ ls -a linuxconfig/.git
.  ..  branches  config  description  HEAD  hooks  info  objects  refs

通常,包含 .git 子目录的目录代表我们的工作树:我们将在这里处理我们的代码,并且我们的项目文件是(或将是)放置。这里我们说“通常”是因为在初始化 git 存储库时,可以创建分离的工作树。我们不会在这里展开这个话题:此时重要的是了解基本概念。

创建一个“裸”存储库

在上一节中,我们了解了如何创建标准 git 存储库,正如我们所见,它包含一个工作树。然而,存在另一种类型的 git 存储库:它就是所谓的“裸”存储库。有什么区别 来自“标准”存储库的“裸”存储库? Git“裸”存储库用作本地存储库的“远程”对应项。在 git 工作流程中,它们用于共享代码,而不是直接处理代码,因此它们不 包括一个工作树。要创建 git “bare” 存储库,我们所要做的就是将 --bare 选项添加到我们在上一个示例中看到的命令中:

$ git init --bare linuxconfig

“裸”存储库不包含 .git 子目录,但其中通常包含文件和目录:

$ ls linuxconfig
branches  config  description  HEAD  hooks  info  objects  refs

“裸”存储库的典型示例是我们在使用 github 或 gitlab 等服务时创建的存储库。

克隆 git 存储库

如果项目的源代码已经使用 git 进行管理并且我们想要对其做出贡献,则需要在我们的系统上创建它的本地副本。为此,我们必须使用clone git 命令。假设存储库 URL 是 https://github.com/egdoc/linuxconfig,我们将运行:

$ git clone https://github.com/egdoc/linuxconfig

上面的命令将把存储库克隆到一个名为 linuxconfig 的目录中;如果同名目录已存在且不为空,则该命令将失败。但是,可以显式提供用于克隆存储库的目录名称。例如,要将存储库克隆为 linuxconfig_repo,我们将运行:

$ git clone https://gitlab.com/egdoc/linuxconfig linuxconfig_repo

当我们克隆 git 存储库时,会在本地创建远程存储库及其所有分支的完整“副本”,并检出克隆存储库的当前活动分支(通常是“master”分支)。

将现有的本地存储库克隆为裸存储库

在前面的示例中,我们看到了“裸”和“标准”存储库之间的区别。我们还了解了如何克隆在 github 或 gitlab 等平台上创建的存储库。如果我们首先创建一个本地标准存储库,现在想要在私有服务器上共享它,以便其他用户可以克隆它,该怎么办?在这种情况下,最快的方法是将本地存储库克隆为“裸”存储库;我们可以使用 --bare 选项来做到这一点。例如:

$ git clone --bare linuxconfig linuxconfig.git
Cloning into bare repository 'linuxconfig.git'...
done.

在上面的示例中,您可以看到我们将linuxconfig目录中包含的存储库克隆到linuxconfig.git目录中。使用 .git 后缀是命名包含“裸”存储库的目录的约定。此时,我们所要做的就是将“裸”存储库传输到服务器,以便其他用户可以访问和克隆它。

Git 基本工作流程

基本的 git 工作流程包括对源代码执行我们需要的更改,将更改的文件内容添加到存储库索引,最后创建一个提交,其中将包含它们并将它们集成到 存储库索引。准备好后,我们可能还想将更改推送到远程存储库。让我们看一些例子。

在存储库索引中添加和删除文件内容

假设我们想要向存储库添加一个新文件,或者我们修改了现有文件的内容。我们如何将更改添加到存储库的索引中?这就是 add git 命令的用途。让我们看一个 例子。首先,我们在存储库中创建一个新文件(它仅包含“hello world”字符串):

$ echo "hello world" > newfile.txt

要将文件的内容添加到项目的索引中,我们运行以下命令:

$ git add newfile.txt

要验证文件的内容是否已添加到存储库索引中,我们可以使用 git status 命令。在我们的例子中,它产生以下输出:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   newfile.txt

为了完成相反的操作,并从存储库索引中删除文件,我们使用 git rm 子命令。默认情况下,此命令确实会从索引中删除内容,并从工作树中删除文件。如果我们只想执行前一个操作,我们应该使用 --cached 选项调用该命令:

# This command will remove the content from the index and the file from the
# working tree
$ git rm newfile.txt

# If we use the --cached option, the file content will be removed from the index
# but the file will not be removed from the working tree (it will become
# 'untracked')
$ git rm --cached newfile.txt

如果我们在从索引中删除内容后运行 git status 命令,我们可以看到 newfile.txt 现在未跟踪:

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    newfile.txt

nothing added to commit but untracked files present (use "git add" to track)

工作流程的下一步是创建包含分阶段更改的提交。

创建提交

在上一节中,我们了解了如何将内容添加到索引中。我们现在可以创建一个提交,它将记录对存储库历史记录的分阶段更改。我们必须使用的 git 命令来执行此任务,就像您一样 可以预期,提交:

$ git commit

一旦我们启动命令,默认的文本编辑器就会打开,因此让我们编写提交消息。清晰并描述我们在存储库中所做的更改非常重要:

编写提交消息一旦我们保存并关闭编辑器,提交就会被注册。立即

之后,终端中将出现一条描述提交中包含的更改的消息:

master (root-commit) c92ba37] Added newfile.txt
 1 file changed, 1 insertion(+)
 create mode 100644 newfile.txt

在本例中,提交消息是“Added newfile.txt”。如果我们不希望打开编辑器,但希望直接从命令行提供消息,则可以使用 -m (--message) 选项当启动 commit 命令,并提供消息作为参数:

$ git commit -m "Added newfile.txt"

创建提交时,尽可能保持原子性并包含小的更改非常重要,以便保持存储库的历史尽可能干净。

获取已创建的提交列表

要获取存储库中所有提交的列表,我们可以使用 git log 命令。为了这个示例,我们更改了 newfile.txt 的内容(我们只是在行末尾添加了一个感叹号),并创建了另一个提交。当我们运行命令时,我们得到以下结果:

$ git log
commit a90ed0a680659777e5f589904720b8055fb6ab4b (HEAD -> master)
Author: egdoc <egdoc.dev@gmail.com>
Date:   Fri Jun 25 07:31:01 2021 +0200

    Added exclamation mark

commit c92ba378b81031c74c572e043a370a27a087bbea
Author: egdoc <egdoc.dev@gmail.com>
Date:   Fri Jun 25 07:06:22 2021 +0200

    Added newfile.txt

如您所见,首先显示最近的提交;对于每一个,我们都可以看到SHA-1校验和、作者、日期和消息 。正如您所看到的,默认情况下不会显示提交的实际内容。 如果我们想将其包含在输出中,我们应该在命令中使用 -p 选项。在这种情况下,输出变为:

commit a90ed0a680659777e5f589904720b8055fb6ab4b (HEAD -> master)
Author: egdoc <egdoc.dev@gmail.com>
Date:   Fri Jun 25 07:31:01 2021 +0200

    Added exclamation mark

diff --git a/newfile.txt b/newfile.txt
index 3b18e51..a042389 100644
--- a/newfile.txt
+++ b/newfile.txt
@@ -1 +1 @@
-hello world
+hello world!

commit c92ba378b81031c74c572e043a370a27a087bbea
Author: egdoc <egdoc.dev@gmail.com>
Date:   Fri Jun 25 07:06:22 2021 +0200

    Added newfile.txt

diff --git a/newfile.txt b/newfile.txt
new file mode 100644
index 0000000..3b18e51
--- /dev/null
+++ b/newfile.txt
@@ -0,0 +1 @@

将更改推送到远程存储库

我们在本地存储库“master”分支中创建了两个提交,如何将它们包含在用于共享代码的远程存储库中?要执行此操作,我们必须使用 push 命令:

$ git push

当我们不带任何参数运行此命令时,就像我们上面所做的那样,推送的“目标”将是我们正在工作的分支的远程对应部分。如果我们想显式指定远程分支,我们可以 应使用以下语法:

git push <remote> <branch>

例如,如果我们在本地工作的分支在远程中尚不存在,这可能很有用。使用上面的命令,它将自动为我们创建。因为在我们的例子中,我们是在“master”中工作 分支,远程存储库称为“origin”,我们将运行:

$ git push --set-upstream origin master

在示例中,您可以注意到我们在命令中使用了 --set-upstream 选项:这将远程存储库分支设置为本地存储库分支的上游对应项,因此每次我们都会运行 git push 没有任何其他参数,git 将知道它应该在哪个远程分支中推送更改。

拉动变更

pull git 子命令基本上执行与 push 相反的操作:它使远程存储库中存在的更改与我们的本地工作副本集成。假设远程存储库中存在新的提交 (也许它是由同事创建的);要将其集成到我们的本地副本中,我们应该运行:

$ git pull

或者更明确地说,在这种情况下:

$ git pull origin master

在我们的示例中,一个 README.md 文件已添加到项目中,因此在本例中上述命令的结果如下:

From https://github.com/egdoc/linuxconfig
 * branch            master     -> FETCH_HEAD
Updating 1bfd5fd..6f5ca0d
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

结论

在本教程中,我们学习了 git 使用背后的基本概念和术语。我们了解了标准存储库和裸存储库之间的区别、如何创建它们、如何在本地克隆现有存储库以及 git 工作流程中涉及的典型操作:我们了解了如何向存储库索引添加更改、如何创建提交,以及如何将其推送到远程存储库。我们还了解了如何执行相反的操作,并将远程存储库中存在的更改拉取到本地工作版本。希望这足以帮助您入门,但这只是一个简短的介绍:学习和提高某件事的最佳方法就是尝试!

©2015-2025 Norria support@norria.com