Git教程(一)

只是记录下学习廖雪峰老师教程的所得。

1 创建版本库

什么是版本库?就很像在本地的repo。创建过程如下:

mkdir learngit
cd learngit
git init learngit

这样,就初始化了一个git的版本库。
然后就可以在工作区中随便写点什么东西,再提交到版本库。

# 编写readme.txt
$ vim readme.txt 
Git is a version control system.
Git is free software.
# 提交
git add readme.txt
git commit -m "wrote a readme file"

2 时光穿梭机

2.1 版本回退

现在,我们提交这三个版本的readme.txt文件到Git仓库。

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

就像打游戏一样,我如果会给每个关卡设置一个存档。之后再想玩之前的那关,直接点击存档就可以了。git也有类似的操作。可以使用git log命令查看提交历史记录。

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao 
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao 
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao 
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

HEAD是一个指针,指向当前版本。如果要回退到上一个版本,使用git reset hard -- readme.txt HEAD^即可。
--hard参数意义是什么?之后再讲。
HEAD^表示上一个版本,那么以此类推,上两个版本就是HEAD^^,上100个版本就是HEAD~100

$ git reset --hard -- readme.txt HEAD^
HEAD is now at e475afc add distributed

$ git log 
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
Author: Michael Liao 
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao 
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

从上可以看到,readme回到了第二个版本。
我已搭乘时光机回到了过去,那我还能回到属于我的未来吗?其实只要指定具体的时间(版本号),就可以去往任意的时间。时光机的工作原理就是指针,你让HEAD指向哪个版本号,你就把当前版本定位在哪。大致如下:

image.png

使用git reflog即可查看提交的各个版本号。

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

从输出可以知道,append GPLcommit id1094adb,现在,你又可以乘坐时光机回到未来了。

2.2 工作区和暂存区

  • 工作区
    就是当前工作的目录。在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:
  • 版本库repo
    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    版本库里面存了很多东西,其中最重要的就是成为stage的暂存区,还有git自动为我们创建的第一个分支master,and指向master的指针HEAD
    image.png

这个HEAD和版本回退的HEAD是一个吗?

分支和HEAD的概念之后再说。
总之就是,git add把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
如果提交之后,没有对工作区的内容进行修改,那么工作区就是干净的。暂存区不会有任何内容。可以用git status查看状态。

image.png

2.3 管理修改

Git管理的是修改,而非文件。从下面这个操作可窥见一斑。
首先,第一次修改readme.txt为一下内容。

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

然后再这样

$ git add readme.txt

$ vim readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

$ git commit -m "git tracks changes"
[master 519219b] git tracks changes
 1 file changed, 1 insertion(+)

然后,发现第二次修改没有被提交。回顾一下过程:
第一次修改 -> git add -> 第二次修改 -> git commit
由于git管理的是修改,而非文件。我们只提交了提第一次修改,commit也就只提交了第一次修改。
提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:

$ git diff HEAD -- readme.txt 
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
 Git is a distributed version control system.
 Git is free software distributed under the GPL.
 Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.

可以看出,第二次修改确实没有被提交。

2.4 撤销修改

核心就这两条命令。

# 撤销工作区的修改
$ git checkout -- readme.txt
# 撤销暂存区的修改
$ git reset HEAD readme.txt

2.5 删除文件

# 从版本库删除
$ git rm test.txt
$ git commit -m "remove test.txt"
# 工作区误删恢复
$ git checkout  --test.txt

3 远程仓库

3.1 添加远程仓库

在github上新建一个repo,然后把本地的推送到上面。

// 要关联一个远程库
$ git remote add origin https://github.com/Mel0day/RedTeam-BCS.git
// 关联后,使用命令git push -u origin master
$ git push -u origin master

3.2 从远程仓库克隆

git clone https://github.com/Mel0day/RedTeam-BCS.git

你可能感兴趣的:(Git教程(一))