菜鸡的git记录-1

因为在AS界面里面直接用git打包会出现非常多难以想象的问题
(譬如说没有办法选择远程关联的仓库地址)
所以还是从零开始学习git吧,顺便做个笔记 (交作业)

顺便一个题外话,有问题可以git --help,会有一些基本的指令帮助以及解释
推荐的git学习网址

安装/配置git

在开始菜单里面找到git bash之后
需要自己在本地对于git参数进行配置

1
2
$ git config --global uesr.name "Your Name"
$ git config --global user.email "email@example.com"

注意:--global是对于本地所有git仓库的配置,同时也可以对某个指定仓库使用不同的名字与地址

建立repository(仓库)

简单可以解释成一个根目录,其中的文件都可以统一被git管理
可以实现的操作有:文件的修改删除还原…等等各种没有想到过的操作

1.如何创建?

在文件里面选择一个合适的地方,右键选择git bash,跳出操作exe后输入以下指令

1
2
$ mkdir studyGit
$ cd studyGit

mkdir指令是指在当前目录新建后面名字的文件夹,cd是进入该文件夹
然后可以通过$ pwd指令来显示当前目录
啊…当然现在的git bash界面内已经会在每次操作前都会显示当前的文件路径了
(所以它存在的意义是什么呢,我怎么知道)

2.创立可管理仓库

1
2
3
$ git init

Initialized empty Git repository in F:/Cynthia/studyGit/.git/

通过init的指令来实现仓库的视线,此时会反馈给你当前的记录并且告诉你这个仓库是空的。
同时呢,加入.git的后缀之后也能够告诉我们这个目标路径下的文件是可以被git操作的,同时gitbash上方的文件路径多了个(master)字样,这个东西,之后再说。

3.把文件加入到仓库之中

首先得声明,git只能够监控文本文件的改动,同时以二进制性质存储的东西,例如图片、视频、word文档之类,只能够监测它的大小改变。不能够精确到在哪一行做了什么,这个样子。
(同时使用windows自带的记事本编辑会花样踩坑,推荐Sublime test/Notepad++,都是比较好用的文本编辑软件)

1).编写文件

首先随意编写一个文件,就叫做readme.txt

不过就是在这个时候一定要注意该文件要保存在该仓库的目录之下,放在其他地方git是找不到的(即便另外一个也是git仓库,但是gitbash都是在当前的文件路径之下,是没有效果的)

2).文件加入到仓库

当然,创建了git还不知道,你需要一定的指令让它知道有新的文件被加入了。

1
$ git add readme.txt

输入命令后,你惊讶的发现没有任何显示,但是事实告诉你这就是没有问题的。便是某哲学“没有消息就是好消息”

这个时候可以说文件被加入到了一个缓存区,还没有真正的被提交。

3).文件提交到仓库

使用指令

1
2
3
4
5
$ git commit -m "write a readme to text"

[master (root-commit) f700eb9] write a readme to text
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

-m指令是代表的commit这个指令里面的分支项,在这里是表示在后面是添加的本次提交的说明
例如在这里写的就是“write a readme to text”

这样做有什么好处呢?主要是方便自己以及他人在历史记录中查询到该条记录,方便修正之类的。
(似乎已经成为了规范,那就不找不带说明提交是什么指令了吧…其实我觉得直接加空的字符串也行的吧

在提交成功之后,就会看见之后的反馈, 1 file changed是指一个文件被改动(我们新加入的文件);2 insertions(+)插入两行内容

3.总结

仓库的初始化,使用git init
添加文件进入仓库,使用git add <flie>,可以反复使用添加多个文件

也可以使用 git add . 表示添加该目录下的所有文件到仓库

git commit -m "description",将该次加入的文件添加到仓库中,description表示提交说明

一些补充说明

git跟踪的都是修改情况

如果你修改后的文件没有添加到暂存区,commit是没有效果的,每次修改之后都应该先add之后再commit才有效果

查看状态/修改内容

为了更加的深入了解其使用,我们又来搞事情啦
打开存在的文件,将内容自己随意修改一下,我也随意修改了一下

现在你就非常好奇git有什么反应了
所以我们运行如下指令查看效果:

1
2
3
4
5
6
7
8
9
10
$ 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")

该指令主要是让我们时刻掌控目前仓库的状态,现在展示给我们的就是说readme已经被修改了,但是没有提交。
同时在之后也给出了提示git addgit commit -a
(后者是说除了将缓存区(使用了git add的文件)还提交未提交到缓存区的文件一并提交)

假若说你想查看git内的文件怎么被修改了,可以用如下命令

1
2
3
4
5
6
7
8
9
10
11
$ git diff

diff --git a/readme.txt b/readme.txt
index e14fac6..5d12d54 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-System.out.println("Hello,git");
+System.out.println("Git is a distributed version control system.");
System.out.println("Git is free");
\ No newline at end of file

该命令顾名思义就是查看difference,查看不同,通过反馈的我们发现就是把第一行里面的“Hello,git”修改成了“Git is a distributed version control system.”
知道做出了什么修改之后,之后我们同样使用之前的方法对其提交到仓库里面。

commit之前,我们用以下命令来查看状态

1
2
3
4
5
6
7
$ git status

On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

这个时候该指令告诉我们要提交的修改包括readme.txt,之后就可以使用commit指令进行提交了

1
2
3
4
$ git commit -m "change the first line"

[master a4f9c61] change the first line
1 file changed, 1 insertion(+), 1 deletion(-)

再使用status查看状态

1
2
3
4
$ git status

On branch master
nothing to commit, working tree clean

此时此刻告诉我们没有提交的修改,同时缓存区没有文件存在,表明这个时候仓库是最新的状态

版本回退

首先我们继续随意修改一下文件内的内容

然后同样的,添加到缓存区里面之后再提交,并添加描述
我们可以用下面的命令查看当前commit的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git log

commit 671ee663b293008bfb73b34e4d08d395627f82b3 (HEAD -> master)
Author: Cchanges <changes720@outlook.com>
Date: Sat Jun 9 17:25:49 2018 +0800

change the second line

commit a4f9c617835537afdf612edcd3a15c4d4e6844ec
Author: Cchanges <changes720@outlook.com>
Date: Sat Jun 9 17:22:06 2018 +0800

change the first line

commit f700eb91a7f5bd4029a0cc6151f5f40f5ee9ac4c
Author: Cchanges <changes720@outlook.com>
Date: Sat Jun 9 16:31:39 2018 +0800

write a readme to text

该指令的排序顺序是从最近到最远,如果觉得这个无用信息太多可以使用以下指令

1
2
3
4
5
$ git log --pretty=oneline

671ee663b293008bfb73b34e4d08d395627f82b3 (HEAD -> master) change the second line
a4f9c617835537afdf612edcd3a15c4d4e6844ec change the first line
f700eb91a7f5bd4029a0cc6151f5f40f5ee9ac4c write a readme to text

可以发现,前面都有一大串码,那个是版本号,当然这个的兴盛不是简简单单的1,2,3…如此,而是通过一系列的处理形成的一个唯一的标识符,来辨别修改的时间线

如果想回退,可使用回退指令

1
2
3
$ git reset --hard HEAD^

HEAD is now at a4f9c61 change the first line

在git中,HEAD表示当前版本,上一个版本用HEAD^,同理上上个版本就是HEAD^^,不过当回退版本太多的时候就可以使用HEAD~x来表示,其中x表示回退的版本数

当然,也可以继续往上回退,但是这个时候查看仓库的状态就会发现之前的最新状态已经没有了
那怎么设置成之后的状态呢?
使用以下命令

1
2
3
$ git reset --hard 671ee

HEAD is now at 671ee66 change the second line

这个时候hard之后跟的数据就是之前查找到的版本号了,当然,这个版本号没有必要写全,只要给前面几位能够让git找到就好

顺便一提,git版本回退原理是内部本来有一个指向当前版本的HEAD指针,回退的时候只是把HEAD的指向改变了,同时也通过这个操作更新工作区的文件

如何在之前找不到版本号的情况之下找版本号呢?输入下面的指令

1
2
3
4
5
6
7
$ git reflog

671ee66 (HEAD -> master) HEAD@{0}: reset: moving to 671ee
a4f9c61 HEAD@{1}: reset: moving to HEAD^
671ee66 (HEAD -> master) HEAD@{2}: commit: change the second line
a4f9c61 HEAD@{3}: commit: change the first line
f700eb9 HEAD@{4}: commit (initial): write a readme to text

从描述和内容可以找到对应的文件,通过版本号就可以恢复了

工作区/暂存区

工作区

电脑中可见的目录

版本库(仓库)

工作区的隐藏目录.git,这个就是版本库了,这里面主要存储的是暂存区、分支、指针

git add指令就是把要提交的修改放到暂存区
git commit就是一次性把所有的修改提交到分支
提交后,对工作区没有任何修改,那么暂存区就没有内容了

撤销修改

在某些时候需要放弃原来的修改,可以用以下指令实现

1
$ git checkout -- readme.txt

但是这个撤销仅适用于以下的两种情况
1.该文件被修改后还没有被添加至暂存区,则撤销到上一次commit后的状态
2.该文件再添加到暂存区之后又进行了一定的修改,则撤销到才提交到暂存区的状态

就是回到最近一次git add或git commit的状态

假若说错误版本已经add了呢?可以使用以下指令

1
2
3
4
$ git reset HEAD readme.txt

Unstaged changes after reset:
M readme.txt

git reset的命令不仅仅是回退版本,也可以将暂存区的修改回退到工作区,这个时候再使用git checkout -- readme.txt完成工作区修改的丢弃。

文件删除

一般情况下会使用如下指令进行删除

1
$ rm <file>

但是这个时候会造成git的仓库与工作区内文件不一致,这个时候需要如下指令

1
2
3
$ git rm remove <file>

rm '<file>'

之后进行commit的操作就行了

如果删错同样的可以用git checkout -- <file>进行恢复