Git学习笔记 2 - 在本地使用Git


创建版本库(仓库)

版本库,即repository,也可以说成是仓库。创建一个仓库被git管理起来以后,你在这个仓库的每一时刻的操作都会被追踪、记录、提交、还原。

git init

选择一个任意的地方,创建一个文件(目录),然后在这个空目录中右键选择 “git bash here"选项,输入git init 这样我们就完成了对该目录的git初始化。

1
2
$ git init
Initialized empty Git repository in F:/gittest/.git/

添加文件到仓库

git add / git commit

我们在该目录下新建一个txt文件,在里面输入

1
Hello git!

然后我们再执行以下命令将该更新上传到仓库。

1
2
3
4
5
6
$ git add test.txt

$ git commit -m"wrote a test file"
[master (root-commit) 9857814] wrote a test file
1 file changed, 1 insertion(+)
create mode 100644 test.txt

这里的

1
$ git add
是指将修改上传到我们的暂存区(此时可以暂时忽略,稍后会讲到)
1
$ git commit -m ""
是做本次更新的声明,并且将暂存区中的修改上传到版本库中,更新的声明在-m后输入,这个声明平常不要乱写,为了以后方便修改、查询。

当我们提交了本次更新的声明以后,命令行出现

1
1 file changed, 1 insertion(+)

此时,我们暂存区中的内容就已经成功上传到了版本库中。

指出这次更新共有一个文件被更改,此次进行了一个插入操作(即我们对空文档进行了插入 Hello git!的操作)

总结来说,每次我们将更新上传到仓库中操作有两步,

第一步

1
$ git add (file name)

第二步

1
$ git commit -m ""

查看此时的仓库状态

git status

此时,我们在命令行输入

1
$ git status
此时,命令行告诉我们
1
2
3
$ git status
On branch master
nothing to commit, working tree clean

在分支 master上,没有什么需要去更新上传的,工作目录是干净的。

此时,如果我们对test.txt文档进行一下修改。

增添一句 i love git!

1
2
3
4
5
6
7
8
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

这个时候命令行告诉了我们在分支master上产生了一个更改但是没有上传(not staged for commit)并且告诉了我们如何从工作区(working area)上传到版本库中(git direcotory)。

git status命令可以让我们时刻掌握仓库当前的状态。

查看我们的更新日志

我们再增删一下test.txt的内容,改为下面这样。

git log

此时,我们在命令行输入git log可以看到我们的所有commit操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git log
commit fdfc94c2abdcaa55fdf2255dae2b7d0cd83c08bb (HEAD -> master)
Author: Cherleng <2501687225@qq.com>
Date: Thu Jul 28 15:02:20 2022 +0800

append really

commit 13221dae0aee03c5db614ae3232716e078ce65c6
Author: Cherleng <2501687225@qq.com>
Date: Thu Jul 28 14:59:53 2022 +0800

update 2

commit 98578141519e1abbb6d6f76d0f03cdb2de86c556
Author: Cherleng <2501687225@qq.com>
Date: Thu Jul 28 14:38:02 2022 +0800

wrote a test file

可以看到我们进行了三次提交。

commit后面的一大串数字代表我们此次更新的版本号,这个版本号可以让我们随时“穿越”到任何一个commit过的修改。(注意:这里能穿越的一定是我们已经comiit上传到版本库的版本,如果没有进行commit操作,我们是无法穿越的)

git reset

使用git reset --hard(版本号)就可以回退到任何一个已经被提交的修改。

1
2
$ git reset --hard 13221
HEAD is now at 13221da update 2

此时我们再打开test.txt 发现里面的内容以及变成了我们第二次修改时候的内容。

此时我们再看一看此时的日志记录信息(git log)

可以看到,这个时候我们的日志信息中没有了第三次“append really”的操作,并且我们的HEAD指针指向了我们的第二次修改(commit ID:13221)的位置。

如果这个时候要重新返回第三次修改的位置但是不知道第三次版本号,使用"git reflog"可以观察到我们操作的所有版本ID,让我们可以随时返回到之前的位置。

HEAD-> 指针指向的就是我们当前的分支。

master 代表我们此时操作的分支(branch),指向该分支此时操作的节点,默认情况下没有改变分支的话,我们在初始化git的时候创建的就是master分支,Git允许我们在分支的历史节点之间穿梭。

git diff

此时,我们再修改一下test文件,在末尾加一行“i hate git"

此时我们如果要查看现在工作区与版本库之间的差别,可以输入"git diff"来查看工作区与版本库之间的差别。

git restore

我刚刚输入了“I hate git”,但现在我想还原到版本库中已经commit的没有“I hate git”这一行的那个版本,该怎么办呢?

Git中仍然可以使这件事轻松的做到。

我们在命令行中输入 $git restore 就可以让工作区的文件版本回到最近的一次版本库中的版本。

这时候再重新打开test文件,你会发现刚刚的“I hate git”已经被删除了,文件成功重新回到了最近的一次版本库中的版本。

why?

为什么Git能够帮助我们在任何版本历史之间穿梭呢?这就涉及到Git不一样的工作原理了。

工作区与版本库

工作区就是我们暂时工作的可以观察到的目录。

工作区中在我们初始化Git的时候生成了一个隐藏文件".git",这个就是我们本地的版本库。版本库安全的存放了我们文件的数据

版本库内就有一个index(stage),我们的暂存区。

工作区是我们直接操作的地方。每一次我们操作完成在命令行add文件的时候,这个时候文件实际上是被add到了暂存区,而非真的添加到了git版本库中,我们要继续commit,文件才真正的被存入了版本库中。所以说暂存区保存了下次将提交的文件列表信息。

我们在目录中继续创建一个“test2.txt”文件,而不进行git add操作,git status告诉我们发现了一个“Untracked files"test2。

如果我们此时进行git commit 的话,test2是不会提交到版本库中的,因为test2没有进行add操作,也就是说test2这个文件是没有进入我们的暂存区的,自然也就无法上传到版本库中。

所以,我们任何的时间回跳操作其实是因为我们可以在工作区与版本库之间进行“交易”,并且每一次“交易”都有专属的交易代码,让我们在各个“时空”中切换自如。

深入了解文件的几种状态

现在我们已经大致的了解了git在本地的一些操作,这个过程初学者可能会觉得有些繁琐复杂,所以在学习任何一门工具的过程中,最重要的是进行实战,自己去体验这个过程,在体验中也就加深了对这个框架的理解,自然也就能在未来的使用中游刃有余。

Untracked

我们重新建立一个工作目录,在目录中新建一个test.txt文件。此时不进行任何操作,用status查看仓库状态。

命令行提示我们这是一个未被追踪的文件(untracked files),即该文件存在于我们的工作目录中,但没有上传到git仓库中,自然是不参与版本控制的。

使用git add,文件状态就会变为staged在暂存区中暂存

staged

文件处于staged暂存状态时,可以进行commit入库,入库后文件状态变为Unmodified

或者使用git reset HEAD命令或者git restore --命令取消staged暂存状态,此时文件变为modified的状态。

Modified / Unmodified

我们将刚刚的文件commit入库,再修改一下文件内容,然后再看一下此时的状态。

此时告诉我们在test这个文件里面发生了modified修改,也就是此时工作区的test文件和git库中的版本不一样,但是没有进行任何操作,命令行提示我们此时有两种操作,可以使用git add将该文件从Modified状态变为staged状态,或者使用git restore丢弃工作区的修改,此时文件状态将从modified变为Unmodified,即此时工作区的状态和版本库内一致。

参考目录:


  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022 Ed Liu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信