在软件开发过程中,管理多个贡献者的代码可能会很快变得一团糟。想象一下,几个人同时编辑同一个文档,每个人都在添加新想法、修复错误或调整功能。如果没有一个结构化的系统,就很难跟踪谁在什么时候、为什么修改了什么?错误很难挽回,合并项目的不同版本也会很快变得混乱。这正是 Git 以及 GitHub 所要解决的核心问题,它为开发人员提供了一种强大的方式来跟踪变更、高效协作并管理代码库的多个版本,同时又不会相互掣肘。本文将作为 Git 教程,从初学者的视角出发,为那些在使用 Git 过程中遇到困难的人提供指导。
什么是Git?
Git 是一种分布式版本控制系统。它用于监控代码随时间的变化。它允许开发人员分开工作,并在不发生冲突的情况下合并他们的工作。Git 还提供了整个项目的单独副本和代码历史记录,这让它变得更快、更可靠。因此,它既适用于个人项目,也适用于协作项目。Git 大多基于命令行,它为用户提供了一个强大的工具箱,用于分支功能、提交更新、阶段性修改,以及精确地撤销错误。重要的是要记住,Git 只是一个管理代码的工具;它完全独立于 GitHub 等网站,可以在没有互联网或任何托管服务的情况下运行。
你需要知道的核心概念
以下是 Git 背后主要概念的快速分解:
- 仓库(Repo):Git 跟踪文件和更改的目录。
- 克隆:远程仓库在本地机器上的副本。
- 提交:代码在某一特定时刻的快照,并附有描述改动的信息。
- 分支:代码库的一个独立版本,用于开发新功能或修复。
- 合并:将一个分支中的变更整合到另一个分支中。
- 推送/拉取:将自己的修改发送到 GitHub 或拉取他人的更新。
如何访问Git
以下是访问 Git 的三种不同方式:
- 命令行 – 最广泛使用的 Git 访问方式。
- 集成开发环境(IDE) – 最流行的 Git 扩展工具是 gitlens,它能在 vs 代码中提供大量扩展功能。
- Git 的图形用户界面 – 可参考官方网站 https://git-scm.com/downloads/guis
- GitKraken – Git 图形用户界面是最流行的图形用户界面之一
- SourceTree – 仅适用于 Windows 和 Mac。
动手实践
现在,我们已经介绍了基础知识,并在系统上设置了 Git,是时候动手实践了。在本节中,我们将介绍每个开发者都应该掌握的一些最基本的 Git 命令。无论你是要开始一个新项目,还是要在现有项目上进行协作,这些命令都是有效使用 Git 的核心工作流程。我们将保持简单、实用和初学者友好的风格。没有花哨的设置,只有真正用得上的命令。打开你的终端,让我们开始吧!
创建目录
mkdir git_learning
更改目录
cd git_and_github
初始化git
git init
该命令将初始化 Git 仓库。
你可以找到 .git 文件夹。这是 Git 维护的重要文件夹。它在执行 git init
命令时创建。Git 基本上使用哈希值来存储文件,因此非常节省内存。
现在我们来创建一些文件。
创建文件
touch file1.txt
编辑文件
vi file1.txt
输入 i 进入插入模式,添加一些文本,然后点击 escape 键,输入 :wq 保存文件。
另一个文件也是如此。
touch file2.txt vi file2.txt
要了解仓库的状态
git status
该命令将显示目录中的更改以及这些更改是否被跟踪。
对于简短的状态,您可以使用
git status -s
Git中的暂存区域
在 Git 中进行提交之前,我们有一个叫做暂存区的地方。在这里,我们可以看到所做的修改,并在提交前对其进行审查。这是 Git 的一个特殊功能。我们可以查看上一次提交和暂存改动之间的改动,然后进行新的提交。
我们将使用
git add git add file1.txt file2.txt
这将开始跟踪目录中的更改。
现在,要将目录中的所有文件添加到暂存中,只需使用:
git add .
使用该命令时要谨慎。因为它会跟踪目录中的所有内容,如日志、环境文件、数据集等。这可能会造成 Git 负载过重,导致版本管理效率低下。
每个提交都有一个
- ID – 唯一标识符(哈希值)。
- Message – 关于所做改动的描述。
- Date/Time – 何时修改的。
- Author – 谁修改了文件。
- Complete snapshot – 在提交时。
你可能会认为,每次提交都保存整个快照会占用内存,效率很低。但 Git 不会存储重复内容,并会压缩内容以减少内存空间。所以,这也许是个可行的策略!
提交更改
git commit -m “Short description”
-m
是指信息。
但有时,我们并不满意简短的描述。我们必须提供更多关于所做更改的背景信息。
为此,我们只需使用:
git commit
这将在编辑器中打开一个文件,我们可以在其中键入少于 80 个字符的描述(别忘了在描述后添加换行符)。为此,让我们为新的提交做一些修改。让我再添加一个空文件并提交修改。
一个误解是 “当我们提交暂存区时,暂存区就变成了空的!”。这是不正确的。暂存区域不会变空,相反,暂存区域和之前的提交没有区别。
指导原则 :
- 提交不应过大或过小。我们不必提交每个文件的小改动。同样,我们也不必在做了大量改动后才提交。当你达到想要记录的状态时,就进行提交。
- 如果您同时解决了一个错字和一个错误,也就是说:您在解决一个错误时发现了一个错字;那么这两个错误不应该同时提交,因为在还原错字时,错误也会被还原。因此,我们必须分开提交。此外,如果您将两个提交放在一起,我们也可以将它们分别取消提交。
- 提交信息应该有意义。由于 Git 不仅用于版本控制,还用于协作,所以提交信息要有意义,并遵循术语,这将有助于项目中的每个人理解所做的改动。
无暂存提交
我们能在不将修改添加到暂存区域的情况下(即在使用 git add
命令之前)提交修改吗?
可以。让我们来看一个例子。让我对 file3.txt 进行修改。
git commit -am “message”
-a
会让 Git 自动分阶段处理已修改和已跟踪的文件。
比方说,你已经暂存了整个版本库,但你想删除一个文件。通常,你会使用 rm
命令来删除文件。但该文件仍在暂存区域,所以要删除该文件,我们将采取以下步骤。
一种可能的方法是使用普通的 rm
命令,然后用 git add <deleted_filename>
从起始区域移除该文件。我知道这听起来很奇怪,但 git add
会将文件从暂存区域移除。
由于这里跟踪的是 file3.txt,因此显示 file3.txt 已被删除。
如果有一个文件已被暂存,而你又想删除它,请按以下步骤操作:
让我们试试在不使用传统 rm
命令的情况下使用 git rm <file_name>
。
我们可以从 git status
中看到新文件已经存在。之后,使用 git rm
命令,我们会发现新文件不存在了。git rm
命令会删除暂存区域和工作目录中的文件,而 rm
命令(linux)只会删除工作目录中的文件。
如何忽略跟踪某些文件
让我们看看如何忽略对某些文件的跟踪。但这引出了一个问题:为什么要不跟踪文件?原因如下:假设你有日志文件:你会生成大量日志文件、数据集,每次对它们进行更改时都会更新。它们基本上都是 JSON 格式,但每次运行笔记本都会产生不同的输出,这使得 Git 难以跟踪变化。因此使用 .gitignore 来避免 Git 追踪这些文件。
我们总是需要忽略一些文件,比如日志文件。在版本库中添加这些文件只会增加版本库的大小。因此,我们必须在 Git 中忽略这些文件。在下图中,我创建了一个日志目录和一个日志文件。随后,我创建了一个 .gitignore 文件,并在 .gitignore 文件中添加了一个日志目录条目。这样,Git 就不会再追踪指定的文件了。
我们可以看到,日志文件夹不再被跟踪。
处理异常值
有一个问题!当我们使用 git add
或 commit
开始跟踪某个文件,然后将其添加到 gitignore 时,Git 仍会跟踪该文件或目录中的改动。因此,为了避免这种情况,我们必须从暂存区域移除这些文件/目录。但 git rm
会同时删除暂存区和目录中的文件。因此,如果我们只想从暂存区移除文件,就要使用 :
git rm -r – cached directory_name/filename
可以看到,文件 not_track.txt 已被跟踪。因此,为了避免这种情况发生,我们必须使用以下命令:
git rm -r –cached directory_name/filename
查看差异
现在,让我们看看上次提交和暂存文件之间有哪些改动。
我们将使用下面的命令来查看:
git diff --staged
以下是对上述截图的解释:
.gitignore 之前并不存在(/dev/null 表示没有之前的文件)。
添加了两个条目:
- logs/ → 忽略该目录。
- not_track.txt → 忽略该文件。
file3.txt 正在从 repo 中删除(分阶段删除)。该文件有一行 “这是我的第三个文件”。
开发人员通常使用图形用户界面工具(如 VS Code)查看 diff
,但也可以使用命令行查看差异。
git diff来帮忙
git diff
会比较上次提交的文件和暂存的文件。例如:a/file1. js 是旧文件,b/file1.js 是新文件 → 旧副本中的改动用红色的 -
号(减号)表示,新副本中的改动用绿色的 +
号(加号)表示(如图所示)。
Green - newly appended linesRed - these lines will be removedWhite - These lines are there in the old and new code.
git diff
命令显示了目录和暂存之间的差异。
让我们在目录中做一些改动,以使用该命令:
现在,让我们对所有文件进行阶段化,并提交我们的更改,以查看过去进行的所有提交。查看方法如下:
git log
git log —oneline
→ 这将给出提交的简要摘要。
git log —oneline —reverse
→ 这将反转提交的顺序。
要查看提交中的更改,我们可以使用
git show <id of that commit>
如何获取上一次提交的改动
git restore --staged filename
→ 这将从上次提交中获取文件并放到这里。
git restore .
会从暂存环境中获取文件并放到工作目录中。但如果有新的未跟踪文件,而之前的提交中又没有该文件,它就会保持原样。
我们可以看到,运行 git restore
命令后,file1.txt 中的更改已恢复到之前的提交状态。
简要回顾
在本节实践课程中,我们学习了实际开发工作流程中使用的 Git 基本命令。我们从建立 Git 仓库开始,学习了如何创建和编辑文件。介绍了工作目录、暂存区域和提交等关键概念,以及 git init
、git add
、git commit
和git status
等命令。我们探讨了 Git 如何跟踪更改、管理文件版本以及处理暂存与未暂存文件。我们特别强调了正确的提交方法、使用 .gitignore来避免跟踪不必要的文件,以及使用 git diff 来查看差异。最后,我们还学习了如何使用 git log
、git show
和git restore
查看以前的提交并恢复修改。
小结
Git 一开始可能会让人不知所措,但一旦掌握了暂存、提交、恢复和查看历史等核心概念,它就会成为工作流程中的强大工具。在本文中,我们将重点放在命令行上,因为它能让你对幕后发生的一切拥有最大的控制权和透明度。了解了 Git 如何跟踪文件、处理提交和管理变更,你就能写出更简洁的代码,更有效地开展协作,并在出现问题时迅速恢复。无论你是要回滚错误的变更、查看提交历史,还是整理工作,Git 都能为你提供支持。
评论留言