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

创建版本库

以下是在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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值