OpenDSA 完整目录

Chapter 1 Command Line and Git

| 关于   «  2. 练习题   ::   目录   ::   4. 练习  »

3. Git

3.1. 简介

Git 是一种在学术界和工业界广泛使用的流行版本控制系统,它使用户能够跟踪文件的变化并与他人协作。

Git 通常与 GitHub 或 GitLab 等托管服务配合使用。这样既能远程存储文件,又能支持用户之间的协作。开始使用 Git 最常见的方式是克隆一个远程仓库。这会把远程仓库中的所有文件复制到本地机器上,并创建一个本地仓库。

Git 仓库(repository)本质上就是一组由 Git 跟踪的文件。Git 仓库中的文件有三种可能的状态:已修改(modified)、已暂存(staged)或已提交(committed)。Git 仓库包含三个主要区域,分别与这三种状态对应:工作树(working tree)、暂存区(staging area)和已提交文件。如果某个文件发生了任何变化,它就被视为已修改,因此位于工作树中。接下来,用户可以使用 git add 命令把文件从已修改状态转换为已暂存状态,也就是把文件从工作树移动到暂存区。然后,用户从暂存区提交该文件后,文件便变为已提交状态。

提交(commit)是提交时仓库内文件状态的一个快照。Git 把提交存储在一棵提交树(commit tree)中。每当创建新的提交时,新提交都会被添加到提交树中。提交树提供了对仓库所做的所有更改的历史记录。

Git 仓库还包含分支。分支(branch)只是指向提交树上某个提交的指针。这样就可以维护仓库的不同历史版本。任一时刻只能有一个活动分支。该活动分支称为 HEAD 分支。创建提交时,它们会被添加到 HEAD 分支上。

可以使用 git push 命令把本地提交应用到远程仓库。这就是更改存储在远程服务器上的方式,它允许其他用户访问这些更改。类似地,可以使用 git pull 命令把远程提交应用到本地仓库。这样就可以在本地机器上访问存储在远程服务器上的更改。

Git 一开始可能会让人非常困惑,所以如果上面的解释没有完全看明白,千万不要灰心!这些练习会展示 Git 的各个部分是如何协同工作的。

3.2. 练习说明

本书包含多个有助于你学习 Git 命令的练习。每个练习都包含一个简短的介绍和一个要完成的任务。你可以使用模拟命令行执行命令来完成练习。在执行命令的同时,你可以参考相应的可视化,以了解命令如何影响文件结构和 Git 状态。请注意,当命令需要参数时,参数会用 (括号) 表示。例如,在下图中,git add (path) 表示 git add 命令至少需要一个参数,该参数指定路径。例如,从根目录执行时,"git add README" 是一条有效的 git add 命令。

下图展示了一个练习的示例。

例如:

Git Exercise

可通过以下方式解决:

Git Exercise

完成练习时,请务必查阅以下关键术语和命令并加以参考。

3.3. 关键术语

下图是练习中所用可视化格式的一个示例。该可视化高亮了 Git 的许多关键部分,具体说明如下。

Git

仓库(Repository): 一组由 Git 跟踪的文件,其中还包括这些文件的历史记录。

本地仓库(Local Repository): 存储在本地机器上的仓库。可视化中标记为 "本地" 的左侧方框代表本地仓库。

远程仓库(Remote Repository): 存储在 GitHub 或 GitLab 等托管服务上的仓库。可视化中标记为 "远程" 的右侧方框代表远程仓库。

提交(Commit): 某一时刻仓库内文件状态的一个快照。可视化中的圆圈代表提交。

提交树(Commit Tree): 描述仓库内提交顺序的树状结构。可视化中的圆圈及其连线代表提交树。

分支(Branch): 指向提交树中某个提交的指针。分支可以方便地访问某个提交,从而轻松访问文件的不同版本。可视化中圆圈附近的矩形代表分支。

HEAD 分支(HEAD Branch): 当前活动的分支。HEAD 分支指向该分支上的最新提交。任何新的提交都会附着在提交树的这个位置。可视化中圆圈附近的紫色矩形代表 HEAD 分支。

暂存区(Staging Area): 已暂存文件所在位置的名称。一旦对文件调用过 git add,该文件就成为暂存区的一部分。可视化中绿色文件代表已暂存的文件。

工作树(Working Tree): 已修改文件所在位置的名称。文件一旦以某种方式被修改,就成为工作树的一部分。可视化中红色文件代表已修改的文件。

3.4. 命令

目前支持以下命令。参数用 (括号) 括起。可选标志用 [方括号] 括起。

git clone (url) :克隆 (url) 指定位置处的远程仓库,并把远程仓库的内容复制到本地机器上的一个新目录中。

git status :打印本地仓库的状态,包括工作树、暂存区、提交和活动分支的信息。

git add (path) :把 (path) 指定位置处的文件添加到暂存区。如果 (path) 指定的是一个目录,则该目录中所有已更改的文件都会被添加到暂存区。提供多个以空格分隔的 (path) 值,可一次添加多个文件。

git rm [-r] (path) :移除 (path) 指定位置处的文件,并把该文件添加到暂存区。提供 [-r] 标志可移除目录。如果 (path) 指定的是一个目录,则该目录中的所有文件都会被移除并添加到暂存区。提供多个以空格分隔的 (path) 值,可一次移除多个文件。

git restore [--staged] (path) :还原 (path) 指定位置处文件所做的更改。提供 [--staged] 标志可把文件从暂存区移回工作树。如果 (path) 指定的是一个目录,则该目录中所有已更改的文件都会被还原。提供多个以空格分隔的 (path) 值,可一次还原多个文件。

git commit -m (message) [-a] (path) :创建一个包含暂存区更改的提交。-m 标志是必需的,后面必须跟一个非空的 (message)。提供 [-a] 标志可在创建提交前把所有文件添加到暂存区。提供一个或多个 (path) 值,可创建一个只包含 (path) 所指定的一个或多个位置处文件更改的提交。如果 (path) 指定的是一个目录,则该目录中所有已更改的文件都会被提交。即使使用了 [-a] 标志或 (path) 参数,未跟踪的文件也不会包含在提交中。

git push :把新提交从本地仓库的当前分支推送到远程仓库的相应分支。这些提交包含将应用到远程仓库的文件更改。

git pull :把新提交从远程仓库的当前分支拉取到本地仓库的相应分支。这些提交包含将应用到本地仓库的文件更改。

git branch (branch_name) :创建名称为 (branch_name) 的分支。

git switch [-c] (branch_name) :把当前分支更改为名称为 (branch_name) 的分支。如果该分支不存在,提供 [-c] 标志可创建名称为 (branch_name) 的新分支。

git checkout [-b] (branch_name) :把当前分支更改为名称为 (branch_name) 的分支。如果该分支不存在,提供 [-b] 标志可创建名称为 (branch_name) 的新分支。其功能与 git switch 相同。在实际使用中,切换分支时更推荐使用 git switch,因为 git 正在从 checkout 过渡到 switch。

   «  2. 练习题   ::   目录   ::   4. 练习  »

关闭窗口