从0开始学习Git系列之「Git初阶」

来源:互联网 发布:java web项目规范 编辑:程序博客网 时间:2024/06/07 01:15

创建版本库

以下是在Mac环境下进行的操作,Windows和Linux环境下的小伙伴,请自己选择合适的方法操作(比如创建文件夹,Windows用户可以右键新建),其中git命令通用。

1.在一个自认为合适的地方,新建一个文件夹,并进入此文件夹:

$ mkdir mywork$ cd mywork/

2.将此文件夹初始化为git仓库

$ git initInitialized 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 statusOn branch masterInitial commitUntracked files:  (use "git add <file>..." to include in what will be committed)    readme.mdnothing added to commit but untracked files present (use "git add" to track)

看英文,Untracked files这个文件没被跟踪和提交,叫我们用git add <file>这个命令去添加这个文件,下面我们就顺其之意,先添加然后看状态变化:

$ git add readme.md$ git statusOn branch masterInitial commitChanges 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 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.mdno 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.mdindex 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 statusOn branch masternothing to commit, working directory clean

此时,提示仓库没有什么要提交的,工作目录干净。对了git status这个命令真的使用很频繁。
下面我们重复上述内容,再一次对文件内容进行修改,看看变化,会不会出现-

$ git diff readme.md diff --git a/readme.md b/readme.mdindex 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 logcommit 8cb96e943c3a0c1f2cc04598639a01ad8c78e77aAuthor: Aaron <xxx@163.com>Date:   Tue Sep 20 23:57:51 2016 +0800    rm -boy or grilcommit 3467800f630c8647814a8b83a4fce4b2fc0f35dcAuthor: 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 3467800HEAD is now at 3467800 添加了文字$ cat readme.md now,we can see.

cat查看文件内容。
3.返回过去的未来
我现在反悔了,需要返回到未来,依然可以根据commit_id来回去,如下:

$ git reset --hard 8cb96eHEAD is now at 8cb96e9 rm -boy or gril

BUT我们刚刚关了之前的命令窗,根本不记得commit_id了。少年,你莫慌,Git提供了一个命令git reflog用来记录你的每一次命令:

$ git reflog8cb96e9 HEAD@{0}: reset: moving to 8cb96e3467800 HEAD@{1}: reset: moving to 34678008cb96e9 HEAD@{2}: commit: rm -boy or gril3467800 HEAD@{3}: commit: 添加了文字483c022 HEAD@{4}: commit (initial): nothing

至此我们又可以搭乘时光机器回到未来了。

4.撤销本次修改
(1)丢弃工作区的修改
你看我随便改了些什么:

$ cat readme.md now,we can see.wo xian zai hao kunZ秀恩爱放大师傅

这个时候,不想出现中文,可以手动删除,也可以使用命令:

$ 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.mdno 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 statusOn branch masterChanges 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 statusOn branch masterChanges 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.mdno changes added to commit (use "git add" and/or "git commit -a")

见到这样的提示,应该很亲切了吧。现在需要选择是真删除还是将其恢复,根据提示命令完成。
真删(就是讲版本库中的也删了):

$ git rm text.mdrm 'text.md'

误删:

$ git checkout -- text.md

此时,刚刚误删的文件又会跑回到工作区了。

0 0