创建版本库
以下是在Mac环境下进行的操作,Windows和Linux环境下的小伙伴,请自己选择合适的方法操作(比如创建文件夹,Windows用户可以右键新建),其中git命令通用。
1.在一个自认为合适的地方,新建一个文件夹,并进入此文件夹:
$ mkdir mywork
$ cd mywork/
2.将此文件夹初始化为git仓库
$ git init
Initialized empty Git repository in /Users/AaronYi/Desktop/github/mywork/.git/
$ ls -ah
. .. .git
现在就已经将git仓库建好了,但仓库里边除了一个.git
文件夹(不要随便动它,否则就会破坏这个库)外,没有其他东西。
添加文件到版本库
1.创建一个文件
在mywork文件夹中新建一个文件(可以是.txt或.md等,需使用纯文本and编码为UTF-8,这样更好),命令如下:
$ touch readme.md
2.将这个文件添加到仓库中
虽然之前是在mywork
仓库文件夹中创建了readme.md
文件,但是并没有提交的仓库中去,这里先看一下没有提交的状态。
查看状态命令,之后常用的一个命令:
$ git status
On branch master
Initial commit
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)
看英文,Untracked files
这个文件没被跟踪和提交,叫我们用git add <file>
这个命令去添加这个文件,下面我们就顺其之意,先添加然后看状态变化:
$ git add readme.md
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.md
再看英文,先忽略git rm
这个命令,我们看见了new file: xxxx
,这就说明已经添加上去了,但是这还不够,Changes to be committed
说明这是一个待提交的文件。
3.提交文件到仓库
使用命令将文件提交到仓库:
$ git commit -m "nothing"
[master (root-commit) 483c022] nothing
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.md
解释一下这个命令中的-m
,就是message的意思,这个可以任意写你想要写的文字,但是作为项目版本管理库使用,最好是填入自己修改了什么,添加了什么等有用方便日后自己回顾与管理的文字。
总结:两步完成文件的提交,好事者(当初的我)又问了,干嘛还需要
git add <file>
这个命令,这是因为commit
一次可以提交多个文件,所以可以添加add
多个文件了。
4.对readme.md
文件进行修改
下面我们给readme.md
文件中写入hello ,boy or gril
,然后使用上述命令对其进行操作,并学习一个新的命令git diff
用来查看修改了哪些内容。
$ 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.md
no changes added to commit (use "git add" and/or "git commit -a")
上边提示说这是一个已经修改过但是没有被提交的文件,为了以防万一我们还可以在提交之前看一下更改了什么地方,使用新命令git diff <file>
$ git diff readme.md
diff --git a/readme.md b/readme.md
index e69de29..4646a13 100644
--- a/readme.md
+++ b/readme.md
@@ -0,0 +1 @@
+hello,boy or gril
\ No newline at end of file
细心的伙伴就看见了+hello,boy or gril
我们刚添加的文字,但是前面怎么多了一个+
号呢?+
表示我们添加了的内容,-
表示我们删除了的内容,当然现在去修改文件中的内容,不会生效,因为还没有提交的仓库。
$ git add readme.md
$ git commit -m "添加了文字"
[master 3467800] 添加了文字
1 file changed, 2 insertions(+)
$ git status
On branch master
nothing to commit, working directory clean
此时,提示仓库没有什么要提交的,工作目录干净。对了git status
这个命令真的使用很频繁。
下面我们重复上述内容,再一次对文件内容进行修改,看看变化,会不会出现-
。
$ git diff readme.md
diff --git a/readme.md b/readme.md
index 7072e56..111e182 100644
--- a/readme.md
+++ b/readme.md
@@ -1,2 +1 @@
now,we can see.
-on boy no gril
\ No newline at end of file
看有了吧,后边仍需要两步提交,可不要忘记了,自己动手完成吧。
5.工作区与版本库
也需到这里,有部分小伙伴懵逼了,mywork
文件夹明明就是个仓库啊,为什么还需要提交文件。其实,mywork
文件夹只是一个工作区,其中的.git
文件夹才是版本库,在.git
文件夹中又包含有缓存区,主分支master和指向主分支的指针HEAD。所以git add <file>
是将工作区的文件存到缓存区,git commit -m "xxx"
是将缓存区的文件提交到当前分支。最后,需要注意的是当你add之后,又对文件进行了修改,那么你还得add一次,然后再commit,不然第二次修改的内容不会存到缓存区,当然也就不会提交到当前分支上去了。
版本回滚
1.查看提交历史
刚才我们只是对readme.md
这一个文件做了两次更改,想必大家都能记住,但是文件一多改的地方也多,单凭回忆一般是记不住的(不排除个别记忆天才咯),下面我们使用git log
命令的帮助我们回忆吧。
$ git log
commit 8cb96e943c3a0c1f2cc04598639a01ad8c78e77a
Author: Aaron <xxx@163.com>
Date: Tue Sep 20 23:57:51 2016 +0800
rm -boy or gril
commit 3467800f630c8647814a8b83a4fce4b2fc0f35dc
Author: Aaron <xxx@163.com>
Date: Tue Sep 20 23:49:51 2016 +0800
添加了文字
可以看到出现了git commit -m "xxx"
提交的文字(所以说提交的时候要好好表达自己做了哪些改动),这样是不是一目了然呢。
可是说了半天,版本回滚到底是个什么?版本又是怎么回滚呢?各位体验过电脑蓝屏吧,再次启动的时候,你是否注意到恢复到上一次正常启动时状态的字样,版本回滚就和这差不多,要是不小心删了重要的文件,我们还可以回退到之前的状态。
2.回到过去
在上边的提交历史中,我们注意到每次提交都有commit 3467800f630c8647814a8b83a4fce4b2fc0f35dc
这个字段,这个就是我们回到过去用到的时光机器。
使用命令git reset --hard commit_id
,commit_id
只需要填写前面6-7位就好了,强迫症可以填完整:
$ git reset --hard 3467800
HEAD is now at 3467800 添加了文字
$ cat readme.md
now,we can see.
cat
查看文件内容。
3.返回过去的未来
我现在反悔了,需要返回到未来,依然可以根据commit_id
来回去,如下:
$ git reset --hard 8cb96e
HEAD is now at 8cb96e9 rm -boy or gril
BUT我们刚刚关了之前的命令窗,根本不记得commit_id
了。少年,你莫慌,Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
8cb96e9 HEAD@{0}: reset: moving to 8cb96e
3467800 HEAD@{1}: reset: moving to 3467800
8cb96e9 HEAD@{2}: commit: rm -boy or gril
3467800 HEAD@{3}: commit: 添加了文字
483c022 HEAD@{4}: commit (initial): nothing
至此我们又可以搭乘时光机器回到未来了。
4.撤销本次修改
(1)丢弃工作区的修改
你看我随便改了些什么:
$ cat readme.md
now,we can see.
wo xian zai hao kun
Z秀恩爱放大师傅
这个时候,不想出现中文,可以手动删除,也可以使用命令:
$ 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.md
no changes added to commit (use "git add" and/or "git commit -a")
现在,我们在提示中看见了一个新的命令git checkout -- <file>
,意思是丢弃工作区的修改,事不宜迟,试一把:
$ git checkout -- readme.md
$ cat readme.md
now,we can see.
OK,成功了!
(2)丢弃已经添加到缓存区的修改
如果你已经将文件add
进去了:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.md
根据提示,我们可以使用git reset HEAD <file>
撤销缓存区的修改,重新放回到工作区,现在就可以操作(1)来撤销工作区的修改了,自己动手燥起来吧。
(3)丢弃已经添加到当前分支的修改
这时就只能通过commit_id
来回滚了。
(4)处理已经删除的文件(真想删或误删)
首先,我们来回顾之前的命令,创建并提交一个文件到版本库,动手燥起来。
现在,我们手动或者使用rm
命令将这个文件删除了,虽然该文件在工作区已经不存在了,但是依然存在于版本库,导致两者不一致,那么现在该怎么办呢?憋着急,git status
命令来告诉你。
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: text.md
no changes added to commit (use "git add" and/or "git commit -a")
见到这样的提示,应该很亲切了吧。现在需要选择是真删除还是将其恢复,根据提示命令完成。
真删(就是讲版本库中的也删了):
$ git rm text.md
rm 'text.md'
误删:
$ git checkout -- text.md
此时,刚刚误删的文件又会跑回到工作区了。