通俗易懂的 Git入门

362 阅读10分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

安装

以macOS为例,git官方已经提供了各种方式友好的安装方案,只需要选择其一进行安装即可。

使用

基本使用

确认安装无误

安装git以后,打开终端工具,输入以下指令,查看所安装git的版本,以检查安装正常

git --version

上述命令会输出类似如下的内容则为正常

git version 2.18.0

配置用户信息

确认好git正常安装后我们开始使用的第一步是配置git的用户信息。

因为git也是一款普通的软件,只不过它是一款版本控制软件,一般面向软件开发者。开发者使用git做版本控制,版本控制的内容可能是代码、文档或其他,在每一次内容发生变更的时候,git需要知道变更者的用户信息,因为这也是变更信息中的一部分。

比如,Wilson2021-08-16 23:12:48新增了一个README.md文件,这就是一条合理的git历史记录。

git不仅支持在本地对内容进行版本管理,还支持联网使用,也就是你可以把你的文件发到网上,这些文件的历史记录可以与其他git用户共享。

假如我和另一个人共同维护README.md这个文件,如果TA认识我的git名称——Wilson,那么可以方便地通过某种方式找到我。但如果我和TA是素未谋面的网友,这时候git用户信息中增加邮箱信息便显得非常有必要。

所以在使用git前,用户名+邮箱是必须的两项基本配置,我们可以在终端内输入以下两行指令来设置我们的git用户信息

git config --global user.name=Wilson
git config --global user.email=scorpioaoe@gmail.com

初始化git仓库

在完成用户信息配置后,我们可以开始使用git对我们的文件进行版本管理,那么git的管理范围是如何圈定的呢,这就涉及到仓库的概念。

我们都知道任何操作系统都有文件系统,macOS/Linux/Windows都有各自的文件系统,其中目录(或称文件夹)一般可以作为一个用于被git进行管理的仓库。当我们在某个目录内使用如下命令时,git会在当前所在目录创建一个.git目录,用于存储git对于该目录的所有控制信息。

git init .

上面的.表示当前目录,当然这个值也可以是其他合理的目录名称,那么git将会在指定的目录创建.git目录。

一般文件系统中以.为前缀的目录或文件会默认隐藏,如果看不到.git目录可通过执行ls -a查看(包含隐藏文件的)所有文件(或者在Windows的设置中选择查看隐藏文件)

查看git仓库状态

当某个目录成为git仓库后,我们便可以开始使用一系列git常用命令,其中最为常用的则是查看仓库状态命令,使用如下

git status

例如,在一个空目录中会展示以下内容

On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

这三行输出信息的意思分别是“当前在master分支”、“还没有提交记录”和“没有可以提交的内容(创建或复制文件并使用git add来进行跟踪)”

这三行信息包含了git的核心常用功能,那么就让我们一同进入到常用功能小节

常用功能

分支

分支是一个有趣的概念,有点像时间线的意思。表面上来看,不同的git分支像是一份份拷贝,但其实它的实现更为精妙,我们将在后续的高级篇章中探究。

你可以先理解为,分支就是一份份拷贝。只不过这个拷贝不单单是对于文件的拷贝,而且是包含文件所有历史记录的拷贝。

比如,我们现在在默认的master分支(也可能是main分支)。我们可以使用如下命令来创建一个新分支,新分支的内容便是这一刻对于当前分支的拷贝。

git checkout -b dev 

在执行上述命令后,控制台会输出

Switched to a new branch 'dev'

这表示我们创建了一个新的名为dev的分支并切换到了dev分支上。这一刻的dev分支内容与原先的master分支除了名称完全一样,即它们拥有相同的文件,拥有相同的历史记录。

那么你可能会想,那我们要分支作何用呢?分支的作用其实有很多,比如不同用户对于同一个目录的文件做修改,可以在各自创建的分支内进行修改和记录,这样可以互不干扰。对于分支的使用,我们会在后续继续讨论。

提交记录

到现在为止,我们还没有对文件进行过修改,所以自然也就没有产生文件的修改记录。让我们随便做些事情,比如在目录中创建一个README.md文件,内容可以为空。

git对于管辖范围内的一举一动都尽在掌握之中,因此我们刚刚创建的README.md文件已经被git所发觉。那我们要怎么知道git对于当前文件变化的感知呢,可以使用如下命令进行查看

git status

上面命令的输出会是

status输出
On branch dev

No commits yet

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

	README.md

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

这个命令的作用是查看git对于仓库内当前所有文件状态的感知,status即是状态的意思。

我们来逐行解析一下上面的输出信息所传达的含义:

当前在`dev`分支

尚无提交记录

未进行跟踪的文件:
    (使用 “git add 文件名” 来将想要提交的内容纳入)
    
        README.md
        
没有纳入任何内容可以被用来提交,只有未被跟踪的文件展示如上(使用 git add 命令来跟踪文件)

这里反复提到另外一个重要的命令git add,那么就让我们实践一下它。

跟踪

git add命令可以将该命令中所指定的文件或目录纳入到git的跟踪(track)范围。那么跟踪是什么意思呢?可以理解为仓库内的文件或目录都在git的管辖范围,但只有纳入跟踪的内容才会产生历史记录,而其他文件如果未被纳入跟踪,则会一直”漂浮“在仓库里,仅此而已。

我们的仓库内现在只有一个README.md文件,那让我们使用git add将其纳入git的跟踪范围,如下

git add README.md

输出上述命令后不会有任何提示,但是仓库的文件状态其实发生了变化,我们需要使用git status来查看这一刻的仓库内状态。

git status

输出如下信息

On branch dev

No commits yet

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

	new file:   README.md

前两行信息同前面status输出一样,但这次中间的核心内容发生了改变,解释如下

发生如下变更等待提交:
    (使用 ”git rm --cache 文件名“ 来脱离跟踪)
    
        新建文件: README.md

看到了吗,我们在文件系统中操作的一举一动其实都被git观察到了,包括新建一个文件。git对于这类操作有着自己的定义,比如新建文件就对应new file

当我们使用git add 文件名来告诉git跟踪某个文件后,git就会跟踪这个文件的一举一动,包括新增/删除/修改等操作。而这一系列动作的每一次举动,对于git来说都是一条记录。

那么如何显式地告诉git记下一条记录,即我们对文件的某次一系列操作想被记录下来,那么就要使用到另外一个命令git commit来实现了。

提交记录

当我们使用git commitgit会将上一次git commit至目前范围内,所有被跟踪文件(git只会对跟踪范围内的文件做有效记录)的变动进行一次记录,记录的内容会是这些文件的所有变动,包括新增/删除/修改,其中最为常用的就是文件的修改,可能是文件名的重新命名,或是文件里的内容修改。

我们试着在命令行输入git commit进行一次提交,首先会像如下进行vi编辑器

  1
  2 # Please enter the commit message for your changes. Lines starting
  3 # with '#' will be ignored, and an empty message aborts the commit.
  4 #
  5 # On branch dev
  6 #
  7 # Initial commit
  8 #
  9 # Changes to be committed:
 10 #   new file:   README.md
 11 #

你可以按下i键进入输入模式,输入对于这次提交的描述信息,比如我们这次就只是新建了一个名为README.md的文件,这里可以就输入add readme

然后按下Esc键退出输入模式,接着按下:键(注意使用英文输入法),调出命令输入板,并输入wq以表示保存并退出

随即,控制台会显示出如下内容

[dev (root-commit) ff44b28] add readme
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

这就表明我们成功提交了一条git记录,记录id前缀为ff44b28,这个值每个人的每次提交都会不一样,用来唯一标识一次提交记录。

这时再来使用git status查看仓库的状态,显示如下

On branch dev
nothing to commit, working tree clean
在dev分支
没有什么可被提交的内容,工作树干净

这就说明我们当前的仓库内,文件的变更已经被git记录下来,并且截至目前,没有新的文件变化出现,整个仓库干净整洁。

总结

到这里,我们完成了git在一个基本生命周期内的所负责的各项事务,我们来梳理一下用过的命令:

git --version

git config

git init

git checkout
git status
git add 
git commit

其中第一个用于确认git的版本信息,也是一种检查git是否正常安装的方式。

第二个用于在初次使用git时进行用户信息的配置。

第三个用于将某个目录(文件夹)作为git可以管辖的仓库,进行初始化操作。其中init就是initial(初始化)的意思,其结果为产生一个.git目录,里面存放关于当下git仓库的全部信息(包括分支信息、提交记录等)。

最后四个是一组git基本操作的常用命令,分别为切换分支查看仓库状态将文件纳入git跟踪范围提交记录

掌握以上内容,你可以算是对于git完成了一个初步的入门学习,但如果想利用git帮助你完成更多高效有用的事情,还需要继续学习git的其他高级命令。如果你对git的使用有兴趣的话,就继续关注后续的git内容讲解吧,或者也通过网上其他git学习资料进行学习。