只是记录下学习廖雪峰老师教程的所得。
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指向哪个版本号,你就把当前版本定位在哪。大致如下:
使用
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 GPL
的commit id
是1094adb
,现在,你又可以乘坐时光机回到未来了。
2.2 工作区和暂存区
- 工作区
就是当前工作的目录。在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: - 版本库repo
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
版本库里面存了很多东西,其中最重要的就是成为stage的暂存区,还有git自动为我们创建的第一个分支master
,and指向master的指针HEAD
。
这个HEAD和版本回退的HEAD是一个吗?
分支和HEAD
的概念之后再说。
总之就是,git add把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
如果提交之后,没有对工作区的内容进行修改,那么工作区就是干净的。暂存区不会有任何内容。可以用git status
查看状态。
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