共计 5540 个字符,预计需要花费 14 分钟才能阅读完成。
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 init Initialized 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 git
1 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 status On branch master nothing to commit, working tree clean
当初示意在一个 master 分支上没有可提交的货色,工作目录以后是洁净的
-
2)批改 readme.txt 文件:
I want to study Git very much.
-
3)再应用 git status 查看
localhost:mygit qinzhen$ git status On branch master Changes 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 diff diff --git a/readme.txt b/readme.txt index 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 log commit 7582a45a1acd9f5540f381d6e9bb7c9d38e74348 (HEAD -> master) Author: qinzhen <376057520@qq.com> Date: Thu Sep 19 16:48:31 2019 +0800 very much commit 64f5cedd48745267e4e161c57f126a9230344339 Author: 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.txt
I 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 log
commit 9c327016eec10a6db7f9b75ecb705df417b6508c (HEAD -> master)
Author: qinzhen <376057520@qq.com>
Date: Thu Sep 19 17:06:10 2019 +0800
I can fly
commit 64f5cedd48745267e4e161c57f126a9230344339
Author: qinzhen <376057520@qq.com>
Date: Thu Sep 19 16:05:40 2019 +0800
study git
下面说了能够利用 commit id 回到过来,当初咱们就来试试;应用 git reset –hard 64f5ce… 命令:
$ git reset --hard 64f5ced
HEAD is now at 64f5ced study git
$ cat readme.txt
I 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> 把 file 丢掉
当初我的 readme.txt 文件内容如下,并且曾经 add 到了暂存区:
I am a test engineer.I can fly!
I want to study Git.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
应用 git reset HEAD readme.txt 命令将批改从 add 撤销回来
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
$ git status
On branch master
Changes 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 — <file> 命令了:
$ git checkout -- readme.txt
$ cat readme.txt
I am a test engineer.
I want to study Git.
$ git status
On branch master
nothing to commit, working tree clean
补充:一个文件曾经被提交到了版本库,有时候咱们在工作区误删了某个文件(rm 或手动),这个时候版本库中还是有这个文件的,就能够通过 git checkout — <file> 命令来”找回“;
如果真的想要从版本库中将文件删除,就要用到 git rm 和 git commit 命令了
1)没错,个别穿梭的电影里到最初总是会找到办法返回将来的,git 也不例外,除了能够回到过来(版本回退),也能够返回将来(回到新版本);
这里咱们还是要借助于 commit id 来做,然而回退后再用 git log 曾经看不到将来期间的定位坐标了(commit id):
$ git log
commit 64f5cedd48745267e4e161c57f126a9230344339 (HEAD -> master)
Author: qinzhen <376057520@qq.com>
Date: Thu Sep 19 16:05:40 2019 +0800
study git
2)这个时候就要用到 git reflog 命令了,记录你之前走过的路:
$ git reflog
64f5ced (HEAD -> master) HEAD@{0}: reset: moving to 64f5ced
9c32701 HEAD@{1}: commit: I can fly
64f5ced (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
7582a45 HEAD@{3}: commit: very much
64f5ced (HEAD -> master) HEAD@{4}: commit: study git
在这里就能够看到之前 I can fly 的 commit id; 这里顺便提一句,下面说了 commit id 不必写全副,写后面一部分,然而不确定具体写几位,这里看到 git 的 log 也只记录了前 7 位,那就权且算 7 位吧。。。
有了 commit id 就等于取得了返回将来的坐标信息和办法,电影也差不多到了大结局的时候了,本文也就要完结了,来个收尾:
$ git reset --hard 9c32701
HEAD is now at 9c32701 I can fly
$ cat readme.txt
I am a test engineer,I can fly.
I want to study Git.
$ git status
On branch master
nothing to commit, working tree clean
对于《穿越时空的 Git》科幻电影还在持续更新中,敬请期待哦~