写点什么

《穿越时空的 git》之创建版本库和常用命令操作

  • 2022 年 9 月 20 日
    北京
  • 本文字数:4056 字

    阅读完需:约 13 分钟

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 强大的分支管理,远远超过 SVN。那 git 如何创建版本库?如何进行一些常用的操作呢?欲知答案如何,请看下文分解。小时候看过一部印象很深的剧叫做《穿越时空的爱恋》,今日也厚着脸皮导演一部《穿越时空的 git》,不上映,纯属自嗨!what is 版本库?无论我们平常使用 git 的频率如何,但是从事 IT 这个行业的小伙伴一定经常听到有人在说,哪个哪个牛 X 的项目在哪个仓库,哪个项目的仓库被人恶意添加 issue(之前就听说了阿波罗计划的代码仓库中 issue 被很多无关的中文评论占楼~哎,咱们测试工程师一定不要这样做,为这个行业尽一份力);

说了这么多废话,其实我们平常说的仓库就是版本库,版本库又名仓库,英文名叫 repository,相信很多用 GitHub 的小伙伴经常看到这个单词;

我就简单的把它理解成一个目录文件夹,里面可以放各种文件,和平常的使用管理一样,可以删除、修改;但是 Git 的”文件夹“更强大一点,它记性好-Git 可以"记住"整个管理的历史,还能”存档“。如何创建一个版本库,很简单:

  • 1)选择一个路径(you like just ok!),创建一个空目录

$ mkdir mygit$ cd mygit$ pwd/Users/qinzhen/mygit  #这里就是我的Mac上创建的仓库地址了
复制代码
  • 2)仓库地址创建好了,现在就是一个普通的文件夹,后使用 git init 命令将它变成”Git 文件夹“,也就是把这个目录变成 Git 可以管理的仓库

$ git initInitialized empty Git repository in /Users/qinzhen/mygit/.git/
复制代码

它会提示说在你的目录下创建了一个空的 Git 仓库,并且目录下多了一个.git,这个时候就算创建完成了。

在看命令之前先来用一张图了解几个概念,可以方便理解和记忆:

  • 工作区(Working Directory)

  • 临时仓库(暂存区,Staging Area)

  • Git 仓库(Repository)我们就是先在工作区进行文件的编辑操作;然后 add 到临时仓库,可以 add 多个;最后再 commit 一起提交到仓库中。接下来正式进入实操:1)在 mygit 路径下,创建文件 readme.txt,输入以下内容:

I want to study Git
复制代码

2)利用 git add 命令将文件提交到临时仓库(运行成功不会输出任何消息,看不到输出不要慌~)

$ git add readme.txt
复制代码

3)再用 git commit 命令将文件从暂存区提交到仓库去

localhost:mygit qinzhen$ git commit -m "study git"[master 64f5ced] study git1 file changed, 2 insertions(+), 2 deletions(-)
复制代码

命令解释:

-m : 添加注释,对本次提交写一个说明1 file changed :1个文件被改变,也就是readme.txt;2 insertions(+):2行插入了内容,也就是我们输入的两行内容2 deletions(-):2行内容缺失了,因为我是把readme.txt文件里原有的内容删除后添加的内容,所以会有次改动提示,若是完全新建的就只会有添加的记录
复制代码

1)我们先用 git status 查看当前仓库的状态

localhost:mygit qinzhen$ git statusOn branch masternothing to commit, working tree clean
复制代码

现在表示在一个 master 分支上没有可提交的东西,工作目录当前是干净的

  • 2)修改 readme.txt 文件:

I want to study Git very much.
复制代码
  • 3)再使用 git status 查看

localhost:mygit qinzhen$ git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
复制代码

这时候可以看到文件已经被修改了,但是并没有被 add 和 commit;

  • 4)再使用 git diff(different)命令来查看当前操作和之前的操作有何区别之处,修改了哪里:

localhost:mygit qinzhen$ git diffdiff --git a/readme.txt b/readme.txtindex 225e15a..8080bd8 100644--- a/readme.txt+++ b/readme.txt@@ -1,2 +1,2 @@ I am a test engineer.-I want to study Git.+I want to study Git very much.
复制代码

可以看到我在第二行增加了 very much

  • 1)我们先将刚才修改好的文件提交到仓库中:

$ git add readme.txt$ git commit -m "very much"[master 7582a45] very much 1 file changed, 1 insertion(+), 1 deletion(-)
复制代码
  • 2)我们再使用 git log 命令来看看之前都干了些什么:

$ git logcommit 7582a45a1acd9f5540f381d6e9bb7c9d38e74348 (HEAD -> master)Author: qinzhen <376057520@qq.com>Date:   Thu Sep 19 16:48:31 2019 +0800
very much
commit 64f5cedd48745267e4e161c57f126a9230344339Author: qinzhen <376057520@qq.com>Date: Thu Sep 19 16:05:40 2019 +0800
study git
复制代码

在 git log 命令后,我们可以看到之前的提交 commit 历史,每一次提交都分配了唯一的 commit id,这个 id 就是我们回到过去的关键,就相当与科幻电影中回到过去的某个时期

3.1)HEAD——现在,我如果想回到 study git 的”时期“,可以使用 git reset --hard HEAD^

$ git reset --hard HEAD^HEAD is now at 64f5ced study git
$ cat readme.txtI am a test engineer.I want to study Git.
复制代码

这个时候我们可以看到,已经成功的回到了 study git 的”时期“,very much 已经消失不见命令解释:

如果回到过去不好理解的话,也可以理解为存档,本人小时候喜欢玩一款电脑游戏叫做红色警戒,打任务战的时候每过一关前就会存档一次,这样就方便”死“了之后可以回到指定关卡重新再来^代表上一个存档,^^代表上上个存档,如果想反会至上100个版本的话可以直接使用HEAD~100果回到过去
复制代码

3.2)commit id——现在再修改文件,在第一行添加 I can fly,然后 add、commit:

I am a test engineer,I can fly.I want to study Git.
$ git add readme.txt$ git commit -m "I can fly"[master 9c32701] I can fly 1 file changed, 1 insertion(+), 1 deletion(-)
复制代码

git log 查看修改提交日志

$ git logcommit 9c327016eec10a6db7f9b75ecb705df417b6508c (HEAD -> master)Author: qinzhen <376057520@qq.com>Date:   Thu Sep 19 17:06:10 2019 +0800
I can fly
commit 64f5cedd48745267e4e161c57f126a9230344339Author: qinzhen <376057520@qq.com>Date: Thu Sep 19 16:05:40 2019 +0800
study git
复制代码

上面说了可以利用 commit id 回到过去,现在咱们就来试试;使用 git reset --hard 64f5ce…命令:

$ git reset --hard 64f5cedHEAD is now at 64f5ced study git
$ cat readme.txtI am a test engineer.I want to study Git.
复制代码

从上面的结果可以看到,我们已经通过 commit id 成功回到了过去,回到了那个没有”I can fly“的年代;可以注意到的一点是,在写 commit id 的时候并没有写全,只是写了前面的一部分,git 就可以找到了;额。。。肯定有人要问具体是几位,说实话~我也不知道 0.0,也没有专门去研究过,前四五位?六七位?七八位?达到使用要求就好啦,能保证 id 唯一,稍微多复制几个就可以了。。。

3.3)回到 add 前的年代——仅 add 文件到了暂存区,并没有 commit;感觉好像是进入到了 add 的另一重空间,在未来也找不到他,那想回到原来的”时期“的话,就可以使用 git reset HEAD 把 file 丢掉

现在我的 readme.txt 文件内容如下,并且已经 add 到了暂存区:

I am a test engineer.I can fly!I want to study Git.
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage)
modified: readme.txt
复制代码

使用 git reset HEAD readme.txt 命令将修改从 add 撤销回来

$ git reset HEAD readme.txtUnstaged changes after reset:M  readme.txt$ git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
复制代码

3.4)这个时候又有个疑问,我只是把 readme.txt 从 add 后的暂存区给撤销回来了,文件并没有改变的;想要把文件的修改也撤回,就要使用 git checkout – 命令了:

$ git checkout -- readme.txt
$ cat readme.txtI am a test engineer.I want to study Git.
$ git statusOn branch masternothing to commit, working tree clean
复制代码

补充:一个文件已经被提交到了版本库,有时候我们在工作区误删了某个文件(rm 或手动),这个时候版本库中还是有这个文件的,就可以通过 git checkout – 命令来”找回“;如果真的想要从版本库中将文件删除,就要用到 git rm 和 git commit 命令了

1)没错,一般穿越的电影里到最后总是会找到方法返回未来的,git 也不例外,除了可以回到过去(版本回退),也可以返回未来(回到新版本);这里我们还是要借助于 commit id 来做,但是回退后再用 git log 已经看不到未来时期的定位坐标了(commit id):

$ git logcommit 64f5cedd48745267e4e161c57f126a9230344339 (HEAD -> master)Author: qinzhen <376057520@qq.com>Date:   Thu Sep 19 16:05:40 2019 +0800
study git
复制代码

2)这个时候就要用到 git reflog 命令了,记录你之前走过的路:

$ git reflog64f5ced (HEAD -> master) HEAD@{0}: reset: moving to 64f5ced9c32701 HEAD@{1}: commit: I can fly64f5ced (HEAD -> master) HEAD@{2}: reset: moving to HEAD^7582a45 HEAD@{3}: commit: very much64f5ced (HEAD -> master) HEAD@{4}: commit: study git
复制代码

在这里就可以看到之前 I can fly 的 commit id;这里顺便提一句,上面说了 commit id 不用写全部,写前面一部分,但是不确定具体写几位,这里看到 git 的 log 也只记录了前 7 位,那就姑且算 7 位吧。。。

有了 commit id 就等于获得了返回未来的坐标信息和方法,电影也差不多到了大结局的时候了,本文也就要结束了,来个收尾:

$ git reset --hard 9c32701HEAD is now at 9c32701 I can fly
$ cat readme.txtI am a test engineer,I can fly.I want to study Git.
$ git statusOn branch masternothing to commit, working tree clean
复制代码


用户头像

社区:ceshiren.com 2022.08.29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
《穿越时空的git》之创建版本库和常用命令操作_测试_测吧(北京)科技有限公司_InfoQ写作社区